Keras CNN, как я могу уменьшить использование памяти GPU с большими размерами изображений? - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь обучить модели cnn-lstm, размеры моего образца составляют 640x640.

У меня GTX 1080 ti 11 ГБ.

Я использую Keras с тензором backend.

Вот модель.

img_input_1 = Input(shape=(1, n_width, n_height, n_channels))

conv_1 = TimeDistributed(Conv2D(96, (11,11), activation='relu', padding='same'))(img_input_1)

pool_1 = TimeDistributed(MaxPooling2D((3,3)))(conv_1)

conv_2 = TimeDistributed(Conv2D(128, (11,11), activation='relu', padding='same'))(pool_1)

flat_1 = TimeDistributed(Flatten())(conv_2)

dense_1 = TimeDistributed(Dense(4096, activation='relu'))(flat_1)

drop_1 = TimeDistributed(Dropout(0.5))(dense_1)

lstm_1 = LSTM(17, activation='linear')(drop_1)

dense_2 = Dense(4096, activation='relu')(lstm_1)

dense_output_2 = Dense(1, activation='sigmoid')(dense_2)

model = Model(inputs=img_input_1, outputs=dense_output_2)

op = optimizers.Adam(lr=0.00001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.001)

model.compile(loss='mean_absolute_error', optimizer=op, metrics=['accuracy'])

model.fit(X, Y, epochs=3, batch_size=1)

В настоящее время, используя эту модель, я могу использовать тренировочные данные только тогда, когда размеры изображений уменьшены до 60x60, больше и у меня заканчивается память GPU.

Я хочу использовать максимально возможный размер, так как хочу сохранить как можно больше дискриминационной информации.(Метки y будут координатами экрана мыши между 0 - 640)

Среди многих других я нашел такой ответ: https://ai.stackexchange.com/questions/3938/how-to-handle-images-of-large-sizes-in-cnn

Хотя я не уверен, как я могу "ограничить вашу CNN"или" передавать ваши данные в каждую эпоху "или, если это поможет.

Как я могу уменьшить объем используемой памяти, чтобы я мог увеличить размеры изображений?

Можно ли пожертвоватьвремя обучения / скорость вычислений в пользу данных с более высоким разрешением при сохранении эффективности модели?

Примечание. Приведенная выше модель не является окончательной, а представляет собой лишь основные затраты.

1 Ответ

1 голос
/ 27 сентября 2019

Ваш слой Dense, вероятно, взрывает обучение.Чтобы дать некоторый контекст, давайте предположим, что вы используете 640x640x3 размер изображения.И давайте также забудем о слое LSTM и представим, что это задача, не относящаяся к временным рядам (и, конечно, сложность задачи с временными рядами ухудшается).

Вот размеры выходных данных.

  • Conv1 -> 640x640x96
  • Maxpool1 -> 210x210x96 (приложение)
  • Conv2 -> 210x210x128

Теперь приходит узкое место.Затем вы flatten() определяете вывод и отправляете его на слой Dense.Этот плотный слой имеет 210x210x128x4096 параметров (что составляет 23,121,100,800).Предполагая точность 32-bit, ваш плотный слой займет около 86 ГБ (надеюсь, мои расчеты верны, но я гарантирую, что это не малое число).

Таким образом, у вас есть несколько вариантов.

  • Первое и самое очевидное: уменьшите размер слоя Dense.
  • Уменьшите размер миниатчей
  • Уменьшите глубину канала для слоев Conv.
  • И вы можете подумать, действительно ли вы хотите, чтобы ввод был 640x640x3.В зависимости от того, чего вы пытаетесь достичь, вы можете сделать это с меньшим изображением.
...