Python 用于结果和内存管理的Keras ConvLSTM优化
我有我用来预测一个值(线性激活)的图像,我对使用神经网络比较陌生。我得到的图像包含了很多细节,分辨率很高,但由于它们是卫星图像,这是有问题的,因为它们的尺寸很大(809012894)。我的目标是介于0和1之间的标量 我的目标是使用排序(RNN到CONVLSM)和卷积来更好地预测值 我的步骤如下:Python 用于结果和内存管理的Keras ConvLSTM优化,python,tensorflow,keras,Python,Tensorflow,Keras,我有我用来预测一个值(线性激活)的图像,我对使用神经网络比较陌生。我得到的图像包含了很多细节,分辨率很高,但由于它们是卫星图像,这是有问题的,因为它们的尺寸很大(809012894)。我的目标是介于0和1之间的标量 我的目标是使用排序(RNN到CONVLSM)和卷积来更好地预测值 我的步骤如下: 函数将图像加载到内存中并进行处理,返回数组 生成器从上面的数组中读取数据并将其馈送到模型中,这在当前是不必要的,但如果我能使模型足够小,可以在GPU上运行,它将是 模型通过生成器从阵列读取数据 我想为我
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
注:
总而言之,这里有一些很好的建议,可以改进模型的优化,从而避免可怕的“ResourceExhausterRor:OOM当分配张量时”:
- 在二维图层中使用较大的步幅
- 减少密集2D层中的神经元数量
- 使用较小的批处理大小(或每\u历元增加步数)
- 使用灰度图像(将有一个通道而不是三个通道)
- 减少层数
- 使用更多MaxPoolig2D层,并增加其池大小
- 减小图像的大小(可以使用PIL或cv2)
- 申请退学
- 使用较小的浮点精度,即np.float16而不是np.float32(最后手段)
- 如果使用预先训练的模型,请冻结第一层
希望这有帮助您的model.summary()输出多少个参数?我首先要做的是将步幅增加2倍?编辑以添加model.summary()您应该能够添加更多具有更小内核大小的卷积层,并且每个层都有16-64个过滤器。这将增加你的深度,但会使你的完全连接层显着更小。深度也会提高你的准确度。我不确定这会对#params产生什么影响,但它实际上可能会降低它。你也可以使你的模型保持图像大小不变,然后在逐渐增大的图像上进行训练,例如从.1比例开始,然后向上移动到全比例图像。通过这种方式,你应该能够得到一个比全尺寸训练更有效的模型,如果你在计算上有限制的话,我该如何使它保持不变的图像大小呢?模型似乎总是想要一个输入形状是吗?如果你能提供参数、模型类型等,我可以对此进行研究。