Keras ConvLSTM优化结果和内存管理

时间:2020-06-23 13:13:51

标签: python tensorflow keras

我有一些用于预测值(线性激活)的图像,而且我对使用神经网络还比较陌生。我所包含的图像包含很多细节,并且具有很高的分辨率,但是由于它们是卫星图像,由于尺寸较大(8090、12894),这是有问题的。我的目标是0到1之间的标量。

我的目标是使用排序(通过ConvLSTM进行RNN)和卷积来更好地预测值。

我的步骤如下:

  1. 函数将图像加载到内存中,并在处理过程中返回数组
  2. Generator从上面的数组中读取并馈入模型,目前这不是必需的,但是如果我可以使模型足够小以在GPU上运行,它将成为必需。
  3. 模型通过生成器从数组中读取。

我想帮助我为目标优化模型,缩小内存中的模型大小,但提高准确性。

以下是我代码的相关部分:

def build_model(frames=seq_len, channels=3, pixels_x=w, pixels_y=h, kernel_sizing=kernel_sizing):
    model = Sequential()
    model.add(
        ConvLSTM2D(filters=16
                   , kernel_size=kernel_sizing
                   , strides = 3
                   , data_format='channels_last'
                   , return_sequences = False
                   , activation='relu', input_shape=(frames, pixels_x, pixels_y, channels))
                )
    model.add(
        Conv2D(filters=16
                   , kernel_size=(3,3)
                   , activation='relu')
                )
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.5))
    model.add(Flatten())
    model.add(Dense(10, activation='relu'))
    model.add(Dense(1, activation='linear'))
    
    optimizer = tf.keras.optimizers.RMSprop(0.001)
    
    model.compile(    
        loss = "mse",
        optimizer = optimizer,
        metrics=['mae', 'mse'])
    
    return model

注意:

  1. 通常,我必须将尺寸调整为.1左右,这会使我迷失细节
  2. 我尝试了(3,3)和(11,11)的kernel_sizing并需要更多过滤器,但这会占用大量内存
  3. 我可以根据内核的大小进一步发展,这是我想知道是否可以“缩小”内存中模型的大小
  4. 由于我的目标值是0到1之间的数字,我是否需要使用MAE而不是MSE,因为由于很小的错误,MSE可能会变得奇怪?
  5. 展平后是否需要更大的致密层?如何防止这种情况发生?
  6. 我相信我的许多内存问题是由于图像太大而引起的,但是我该如何处理并保持细节水平呢?
  7. (从上方)我是否需要切出图像的块并使用块的目标变量来增加数据集的大小?如果是这样,这将如何从实际的预测集中测试新图像?

编辑: model.summary(): enter image description here

1 个答案:

答案 0 :(得分:-1)

总的来说,这里有一些很好的建议可以改善模型的优化,从而避免可怕的“ ResourceExhaustedError:分配张量时的OOM”:

  • 在Conv2D图层中使用更大的步幅
  • 减少密集的Conv2D层中的神经元数量
  • 使用较小的batch_size(或增加steps_per_epoch)
  • 使用灰度图像(只有一个通道而不是三个通道)
  • 减少层数
  • 使用更多的MaxPooling2D图层,并增加其池大小
  • 缩小图像的大小(可以使用PIL或cv2)
  • 应用辍学
  • 使用较小的浮点精度,即np.float16而不是np.float32(不得已)
  • 如果您使用的是预先训练的模型,请冻结第一层

希望有帮助