Чому навчання на моєму графічному процесорі займає так довго?


10

Деталі:

GPU : GTX 1080

Навчання : ~ 1,1 млн. Зображень, що належать до 10 класів

Перевірка : ~ 150 тис. Зображень, що належать до 10 класів

Час за епоху : ~ 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
Я проголосував за переміщення цього
пакету

generic_user: "наука даних" може використовувати "машинне навчання", але не все "машинне навчання" призначене для "науки про дані". (ML - це лише ще один інструмент, tensorflow - лише інша бібліотека; ML може незабаром (якщо ще не буде) використаний навіть для цілеспрямованих завдань, таких як управління файлами властивостей переваг користувача.)
michael

див. також пов’язане (tl; dr: перевірте, чи справді працює gpu, подивіться статистику gpu, яку може надати tf) stackoverflow.com/questions/42527492/… stackoverflow.com/questions/38559755/…
michael

Я спробував такий підхід, і він стверджує, що використовується мій поточний GPU. Для підтвердження я також використовував nvidia-smi для перевірки використання графічного процесора, і він якось коливається між 85% -99%.
Прадюмна Рахул

Відповіді:


7

Це приблизно очікуване. Якщо поділити кількість секунд на кількість оброблених зображень, ви отримаєте 33 мілісекунди на зображення, що, здається, підходить для такої невеликої мережі. Більші мережі зазвичай займають від 50 до 200 мілісекунд на зображення.

Так, великий щільний шар, ймовірно, зашкодить вашій продуктивності, оскільки це величезна матриця (256 на 4096) та велике множення матриць, яка йде разом із нею щоразу при запуску мережі.


Що б ви запропонували покращити продуктивність?

4
1: збільшити розмір партії до 32 або 64. 2: зменшіть розмір шару FC до 1024 або 2048 одиниць і подивіться, чи допоможе це. 3: Рання зупинка. Можливо, що ваша мережа зблизилася або почне налагоджувати її перед тим, як закінчити свою першу епоху, і в цьому випадку вам слід менше тренуватися.

Чи варто скорочувати кроки за одну епоху?
Прадюмна Рахул

@shimao, що ти мав на увазі під «тренуванням менше»? Ви маєте на увазі використання менше даних?
СтатистикаSorceress

3

Як сказав shimao, саме так ви і очікували. Незважаючи на відсутність багато шарів, розмір вводу 512x512 - це велике зображення, яке слід перекручувати. Великий час обчислення, ймовірно, більший через обертання 64 фільтрів над великим зображенням, а не повністю пов'язаних шарів.

Мережа, яку ви зібрали, має в цьому смішне вузьке місце. Ви починаєте з 64 фільтрів на оригінальному зображенні розміру, лише зменшуючись у міру зменшення розміру зображення. Коли зображення проходить через вашу мережу, функції, які ви вивчаєте, стають все більш абстрактними та складними. Ваш рівень Conv2D (32, (3, 3)) по суті обмежує мережу для вивчення карти 128x128 з 32 функцій.

Більшість мережевих архітектур подвоюють кількість функцій щоразу, коли вони об'єднують, а останні останні архітектури зображень фактично скидають повністю пов'язані шари на користь середнього пулу на остаточній карті об'єктів і в основному виконують логістичну регресію на виході цього пулу.

Спробуйте почати з меншої кількості фільтрів, скажімо, 16 у своєму першому шарі згортання, подвоюючи щоразу, коли ви крокуєте або об'єднуєте. Зробіть це в кілька разів більше, ніж ви, щоб збільшити сприйнятливе поле і зменшити розмір карти карти. Зробіть це до 64x64 або 32x32, що складе 128 або 256 фільтрів. Для усунення повністю з’єднаних шарів можна також використовувати пул Global Avg або Max Keras 'Global Avg або Max. Це повинно приблизно вдвічі перевищити швидкість роботи мережі, і я би очікував збільшення точності одночасно.


Ну, мережева архітектура базується на дослідницькій роботі, яку я намагався відтворити. lirmm.fr/%7Echaumont/publications/…
Rahul
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.