GPU에서 교육이 오래 걸리는 이유는 무엇입니까?


10

세부:

GPU : GTX 1080

훈련 : 10 개 수업에 속하는 ~ 1.1 백만개의 이미지

유효성 검사 : 10 개의 클래스에 속하는 ~ 150 개의 이미지

에포크 당 시간 : ~ 10 시간

CUDA, cuDNN 및 Tensorflow (Tensorflow GPU도)를 설정했습니다.

나는 내 모델이 에포크 당 10 시간이 걸리는 복잡한 것이라고 생각하지 않습니다. 내 GPU가 문제인지 확인했지만 문제는 아닙니다.

완전히 연결된 레이어로 인해 교육 시간이 있습니까?

내 모델 :

model = Sequential()
model.add()
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2))
model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dense(4096))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))

model.summary()

opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)

model.compile(loss='categorical_crossentropy',
          optimizer=opt,
          metrics=['accuracy']
          )

많은 데이터가 있기 때문에 ImageDataGenerator를 사용했습니다.

gen = ImageDataGenerator(
 horizontal_flip=True
)

train_gen = gen.flow_from_directory(
        'train/',
        target_size=(512, 512),
        batch_size=5,
        class_mode="categorical"
)

valid_gen = gen.flow_from_directory(
        'validation/',
        target_size=(512, 512),
        batch_size=5,
        class_mode="categorical"
)

2
나는 이것을 스택 오버플로로 옮기기로 투표했지만 실제로는 데이터 과학 스택 교환, IMO에 속한다
generic_user

generic_user : "데이터 과학"은 "기계 학습"을 사용할 수 있지만 모든 "기계 학습"이 "데이터 과학"을위한 것은 아닙니다. (ML은 다른 도구 일뿐 아니라 다른 라이브러리 일뿐입니다. ML은 곧 사용자 기본 설정 속성 파일 관리와 같은 일상적인 작업에도 사용할 수 있습니다.)
michael

또한 관련 (tl; dr : 실제로 GPU에서 실행 중인지 확인하고, tf가 제공 할 수있는 GPU 통계를보십시오) stackoverflow.com/questions/42527492/… stackoverflow.com/questions/38559755/…
michael

나는 그 접근법을 시도했고 현재 GPU가 사용되고 있다고 말합니다. 확인하기 위해 nvidia-smi 를 사용 하여 GPU 사용률을 확인했으며 85 % -99 % 사이에서 변동합니다.
Pradyumna Rahul

답변:


7

그것은 예상에 관한 것입니다. 초 수를 처리 한 이미지 수로 나눈 경우 이미지 당 33 밀리 초가 발생합니다. 이러한 소규모 네트워크에는 적합합니다. 더 큰 네트워크는 일반적으로 이미지 당 50-200 밀리 초의 야구장을 차지합니다.

예, 큰 밀도의 계층은 네트워크를 실행할 때마다 큰 행렬 (256 x 4096)과 큰 행렬 곱셈으로 인해 성능을 저하시킬 수 있습니다.


성능 향상을 위해 무엇을 제안 하시겠습니까?

4
1 : 배치 크기를 32 또는 64로 늘리십시오. 2 : FC 레이어의 크기를 1024 또는 2048 단위로 축소하고 도움이되는지 확인하십시오. 3 : 조기 정지. 첫 시대를 마치기 전에 네트워크가 수렴되었거나 과적 합을 시작했을 수 있습니다.이 경우 훈련 시간이 줄어 듭니다.

에포크 당 단계를 줄여야합니까?
Pradyumna Rahul

@shimao "더 적은 훈련"은 무슨 뜻입니까? 더 적은 데이터를 사용한다는 의미입니까?
StatsSorceress

3

shimao가 말했듯이, 그것은 당신이 기대하는 것에 관한 것입니다. 레이어가 많지 않더라도 512x512의 입력 크기는 큰 이미지입니다. 완전히 연결된 레이어 대신 큰 이미지에서 64 개의 필터를 사용하기 때문에 계산 시간이 길어질 수 있습니다.

당신이 만든 네트워크에는 재미있는 정보 병목 현상이 있습니다. 원본 크기의 이미지에서 64 개의 필터로 시작하고 이미지 크기가 줄어듦에 따라 감소합니다. 이미지가 네트워크를 통과함에 따라 학습하는 기능이 점점 더 추상화되고 복잡해집니다. Conv2D (32, (3, 3)) 레이어는 기본적으로 32 개의 기능으로 구성된 128x128 맵을 학습하도록 네트워크를 제한합니다.

대부분의 네트워크 아키텍처는 풀링 할 때마다 기능 수를 두 배로 늘리며, 가장 최근의 이미지 넷 아키텍처는 실제로 최종 기능 맵보다 평균 풀을 선호하여 완전히 연결된 레이어를 버리고 기본적으로 해당 풀의 출력에 대해 로지스틱 회귀를 수행합니다.

첫 번째 회선 레이어에서 16과 같이 더 적은 수의 필터로 시작하여 걸거나 걸을 때마다 두 배가됩니다. 수용 필드를 늘리고 피처 맵 크기를 줄이려면이 작업을 몇 번 더 수행하십시오. 이 작업을 64x64 또는 32x32로 낮추십시오 (128 또는 256 필터). Keras의 Global Avg 또는 Max 풀링을 사용하여 완전히 연결된 레이어도 제거 할 수 있습니다. 그것은 네트워크 속도의 약 두 배가되어야하며, 동시에 정확성이 향상 될 것으로 기대합니다.


글쎄, 네트워크 아키텍처는 내가 재현하려는 연구 논문을 기반으로합니다. lirmm.fr/%7Echaumont/publications/…
Pradyumna Rahul
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.