我目前正在开发一个沉淀池位移预测模型。我已将其作为实现变分卷积自动编码器的模型(我附上了模型代码)。总之,该模型接收 5 个图像的序列,并且必须预测以下 5 个图像。该架构由编码器和解码器 (Conv Transpose) 中的 5 个卷积层组成,这些卷积层的目的是大大减小图像大小并学习空间细节。编码器和解码器之间携带 ConvLSTM 层来学习时间序列。我正在Python中使用tensorflow和keras进行工作。
数据由 400x400 像素的雨雷达“图像”组成,深色背景和雨细胞位于帧的中心。帧与帧之间的时间为5分钟,雷达配置。经过进一步处理后,训练数据在 0 和 1 之间缩放,并采用 numpy 格式(用于处理矩阵)。我的训练数据最终具有[序列数、每个序列的图像数、高度、宽度、通道 = 1] 的形式。
序列由:5个输入和5个目标组成,其中有2111个雷达图像序列(我知道我没有太多数据:(用于训练),80%用于训练,20%用于训练验证。 详细说明:
问题是我训练了我的模型,并且我得到的准确率值非常差。 05 年 8 月左右。我已经训练了 400 个 epoch,并且该值保持或围绕所提到的值。此外,当我拍摄 5 张图像的序列来预测接下来的 5 张图像时,我得到了非常糟糕的结果(甚至没有在中心形成代表雨的小“点”)。我已经尝试过减少编码器和解码器的层数,除了优化器[adam、nadam、adadelta]之外,我还尝试过使用激活函数[relu、elu]。在预测图像和准确度值方面,我还没有获得任何有利可图的结果。
我是深度学习主题的初学者,我非常喜欢它,但我找不到解决这个问题的方法。我怀疑我的模型架构不正确。除此之外,我应该寻找更好的优化器或激活函数来提高准确性值和预测图像。作为最后的解决方案,也许将 400x400 像素的图像剪切到降水所在的中心区域。虽然我会丢失训练数据。
我很感激你能帮助我解决这个问题,也许给我一些组织架构模型的想法,或者组织训练数据的想法。 致以诚挚的问候。
# Encoder
seq = Sequential()
seq.add(Input(shape=(5, 400, 400,1)))
seq.add(Conv3D(filters=32, kernel_size=(11, 11, 5), strides=3,
padding='same', activation ='relu'))
seq.add(BatchNormalization())
seq.add(Conv3D(filters=32, kernel_size=(9, 9, 32), strides=2,
padding='same', activation ='relu'))
seq.add(BatchNormalization())
seq.add(Conv3D(filters=64, kernel_size=(7, 7, 32), strides=2,
padding='same', activation ='relu'))
seq.add(BatchNormalization())
seq.add(Conv3D(filters=64, kernel_size=(5, 5, 64), strides=2,
padding='same', activation ='relu'))
seq.add(BatchNormalization())
seq.add(Conv3D(filters=32, kernel_size=(3, 3, 64), strides=3,
padding='same', activation ='relu'))
seq.add(BatchNormalization())
# ConvLSTM Layers
seq.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
input_shape=(None, 6, 6, 32),
padding='same', return_sequences=True))
seq.add(BatchNormalization())
seq.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
padding='same', return_sequences=True))
seq.add(BatchNormalization())
seq.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
padding='same', return_sequences=True))
seq.add(BatchNormalization())
seq.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
padding='same', return_sequences=True))
seq.add(BatchNormalization())
seq.add(Conv3D(filters=32, kernel_size=(3, 3, 3),
activation='relu',
padding='same', data_format='channels_last'))
# Decoder
seq.add(Conv3DTranspose(filters=32, kernel_size=(3, 3, 64), strides=(2,3,3),
input_shape=(1, 6, 6, 32),
padding='same', activation ='relu'))
seq.add(BatchNormalization())
seq.add(Conv3DTranspose(filters=64, kernel_size=(5, 5, 64), strides=(3,2,2),
padding='same', activation ='relu'))
seq.add(BatchNormalization())
seq.add(Conv3DTranspose(filters=64, kernel_size=(7, 7, 32), strides=(1,2,2),
padding='same', activation ='relu'))
seq.add(BatchNormalization())
seq.add(Conv3DTranspose(filters=32, kernel_size=(9, 9, 32), strides=(1,2,2),
padding='same', activation ='relu'))
seq.add(BatchNormalization())
seq.add(Conv3DTranspose(filters=1, kernel_size=(11, 11, 5), strides=(1,3,3),
padding='same', activation ='relu'))
seq.add(BatchNormalization())
seq.add(Cropping3D(cropping = (0,16,16)))
seq.add(Cropping3D(cropping = ((0,-5),(0,0),(0,0))))
seq.compile(loss='mean_squared_error', optimizer='adadelta', metrics=['accuracy'])
在出现回归问题时您想要使用的指标是
mse
(mean_squared_error
) 或 mae
(mean_absolute_error
)。
您可能想在开始时使用
mse
,因为它比 mae
更能惩罚更大的错误。
您只需要稍微更改一下编译模型的代码即可。
seq.compile(loss='mean_squared_error', optimizer='adadelta', metrics=['mse','mae'])
通过这种方式,您可以在训练期间同时监控
mse
和 mae
指标。
这个架构有效吗?我也在用这个架构模型。我需要考虑添加剩余连接吗