Keras CNN如何减少大尺寸图像的gpu内存使用量?

时间:2019-09-26 23:06:56

标签: tensorflow machine-learning keras gpu conv-neural-network

我正在尝试训练cnn-lstm模型,我的样本图像尺寸为640x640。

我有一个GTX 1080 ti 11GB。

我正在使用带有Tensorflow后端的Keras。

这是模型。

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 个答案:

答案 0 :(得分:1)

您的Dense层可能正在使培训破裂。为了提供一些背景信息,我们假设您使用的是640x640x3图片大小。而且,我们也忘记了LSTM层,并假装这是一项非时间序列的任务(当然,时间序列问题的复杂性会越来越差)。

这是输出大小。

  • Conv1-> 640x640x96
  • Maxpool1-> 210x210x96(appx)
  • Conv2-> 210x210x128

现在是瓶颈。然后,您将flatten()添加到输出并将其发送到Dense层。此密集层具有210x210x128x4096个参数(即23,121,100,800)。假设精度为32-bit,那么您的密集层大约需要86GB(我希望我的计算是正确的,但我保证您可以保证这不是一个小数目)。

所以您没有什么选择。

  • 最明显的是减小Dense的图层大小。
  • 减小迷你批的大小
  • 减少Conv层的通道深度。
  • 您可能想考虑是否真的希望输入为640x640x3。根据您要实现的目标,您也许可以使用较小的图像来做到这一点。