我目前正在开发一个降水单元位移预测模型。我以实现变分卷积自动编码器为模型(附上模型代码)。总之,模型接收到5幅图像的序列,并且必须预测以下5幅图像。该体系结构由编码器和解码器(Conv-Transpose)中的五个卷积层组成,这些卷积层用于极大地减小图像大小和学习空间细节。在编码器和解码器之间携带ConvLSTM层来学习时间序列。我正在使用Python,使用tensorflow和keras
数据由400x400像素的降雨雷达的“图像”组成,背景为黑色,雨细胞位于帧中心。帧与帧之间的时间为5分钟,雷达配置。进一步处理后,训练数据在0和1之间缩放,并采用numpy格式(用于处理矩阵)。我的训练数据最终的形式是[序列数量、每个序列的图像数量、高度、宽度、通道=1]
Sequence of precipitation Images
序列由5个输入和5个目标组成,其中2111个雷达图像序列(我知道我没有太多数据:(用于训练),80%用于训练,20%用于验证。 详情如下:
问题是,我已经训练了我的模型,但我得到的准确度值非常差。大约在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'])
在出现回归问题时,您希望使用的度量是
mse
(mean_squared_error
)或mae
(mean_absolute_error
)您可能希望在开始时使用
mse
,因为它会比mae
更严重地惩罚错误您只需要对编译模型的代码稍加修改
通过这种方式,您可以在培训期间同时监视
mse
和mae
度量相关问题 更多 >
编程相关推荐