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

2024-03-28 21:30:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在开发一个降水单元位移预测模型。我以实现变分卷积自动编码器为模型(附上模型代码)。总之,模型接收到5幅图像的序列,并且必须预测以下5幅图像。该体系结构由编码器和解码器(Conv-Transpose)中的五个卷积层组成,这些卷积层用于极大地减小图像大小和学习空间细节。在编码器和解码器之间携带ConvLSTM层来学习时间序列。我正在使用Python,使用tensorflow和keras

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

Sequence of precipitation Images

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

  1. 列车输入=[1688,5400400,1]
  2. 训练目标=[1688,5400400,1]
  3. 有效的_输入=[423,5400400,1]
  4. 有效的_目标=[423,5400400,1]

问题是,我已经训练了我的模型,但我得到的准确度值非常差。大约在8e-05。我已经训练了400个纪元,并且该值保持或围绕着提到的值。此外,当我拍摄5幅图像序列来预测下一个5幅时,我得到了非常糟糕的结果(甚至不是一个小的“斑点”形成)我已经尝试减少编码器和解码器中的层数,除了优化器[adam,nadam,ADADDelta],我还尝试使用激活函数[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'])

Tags: 数据模型图像addsize序列activationkernel
1条回答
网友
1楼 · 发布于 2024-03-28 21:30:23

在出现回归问题时,您希望使用的度量是msemean_squared_error)或maemean_absolute_error

您可能希望在开始时使用mse,因为它会比mae更严重地惩罚错误

您只需要对编译模型的代码稍加修改

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

通过这种方式,您可以在培训期间同时监视msemae度量

相关问题 更多 >