Python:如何解决为预测未来帧序列而开发的变分自动编码器卷积模型的低精度问题?

问题描述 投票:0回答:2

我目前正在开发一个沉淀池位移预测模型。我已将其作为实现变分卷积自动编码器的模型(我附上了模型代码)。总之,该模型接收 5 个图像的序列,并且必须预测以下 5 个图像。该架构由编码器和解码器 (Conv Transpose) 中的 5 个卷积层组成,这些卷积层的目的是大大减小图像大小并学习空间细节。编码器和解码器之间携带 ConvLSTM 层来学习时间序列。我正在Python中使用tensorflow和keras进行工作。

数据由 400x400 像素的雨雷达“图像”组成,深色背景和雨细胞位于帧的中心。帧与帧之间的时间为5分钟,雷达配置。经过进一步处理后,训练数据在 0 和 1 之间缩放,并采用 numpy 格式(用于处理矩阵)。我的训练数据最终具有[序列数、每个序列的图像数、高度、宽度、通道 = 1] 的形式。

Sequence of precipitation Images

序列由:5个输入和5个目标组成,其中有2111个雷达图像序列(我知道我没有太多数据:(用于训练),80%用于训练,20%用于训练验证。 详细说明:

  1. train_input = [1688, 5, 400, 400, 1]
  2. 训练目标 = [1688, 5, 400, 400, 1]
  3. 有效输入 = [423, 5, 400, 400, 1]
  4. 有效目标 = [423, 5, 400, 400, 1]

问题是我训练了我的模型,并且我得到的准确率值非常差。 05 年 8 月左右。我已经训练了 400 个 epoch,并且该值保持或围绕所提到的值。此外,当我拍摄 5 张图像的序列来预测接下来的 5 张图像时,我得到了非常糟糕的结果(甚至没有在中心形成代表雨的小“点”)。我已经尝试过减少编码器和解码器的层数,除了优化器[adam、nadam、adadelta]之外,我还尝试过使用激活函数[relu、elu]。在预测图像和准确度值方面,我还没有获得任何有利可图的结果。

Loss and Accuracy during Training

我是深度学习主题的初学者,我非常喜欢它,但我找不到解决这个问题的方法。我怀疑我的模型架构不正确。除此之外,我应该寻找更好的优化器或激活函数来提高准确性值和预测图像。作为最后的解决方案,也许将 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'])
python tensorflow keras deep-learning autoencoder
2个回答
0
投票

在出现回归问题时您想要使用的指标是

mse
(
mean_squared_error
) 或
mae
(
mean_absolute_error
)。

您可能想在开始时使用

mse
,因为它比
mae
更能惩罚更大的错误。

您只需要稍微更改一下编译模型的代码即可。

seq.compile(loss='mean_squared_error', optimizer='adadelta', metrics=['mse','mae'])

通过这种方式,您可以在训练期间同时监控

mse
mae
指标。


0
投票

这个架构有效吗?我也在用这个架构模型。我需要考虑添加剩余连接吗

© www.soinside.com 2019 - 2024. All rights reserved.