卷积长短时记忆神经网络(ConvLSTM) 雷达回波图像外推

概述

雷达回波外推是临近预报的有效手段,本文使用的雷达回波外推方法综合了卷积神经网络特性和长短时记忆神经网络特性,具有良好的时序特征提取能力和空间特征提取能力,适宜应用在时序变化和空间变化关联性很强的雷达回波图像上。

对于降水临近预报,每个时间的观测值都是 2D雷达回波图。 如果我们将回波图像划分成平铺的非重叠片,并将片内的像素视为其测量结果,则临近预测问题自然会变成时空序列预测问题。

本文采用的数据为杭州、南京、厦门三个台站连续三月的雷达平面位置扫描图像,将临近预报问题抽象为对应的图像时间序列的预测问题。

理论原理

这篇文章


雷达回波图象外推原理图解

数据准备

利用厦门、南京、杭州三个多普勒天气雷达站的大量连续体扫数据绘制0.5°仰角的平面位置显示图像,并以原始基数据的命名方式进行命名,方便后期进行按顺序索引。由于计算机硬件限制,原始绘制的300dpi高分辨率图像不适合输入到神经网络中直接进行训练,首先要将图像降分辨率(压缩)到100*100。原始雷达回波图象为RGB三通道图像,为减少训练时间可将原始图片转换为灰度图像,这样每个雷达站每个时刻的体扫数据均可得到一个100*100分辨率大小的灰度图像,载入内存后即为一个100*100大小的二维数组。值得注意的是,由于不同时段雷达回波反射率因子分布区间不同,若使用原始数据绘制图像可能使比色卡(color map)的范围不同,这将导致不同图像中的相同强度的反射率因子值对应的RGB色彩不同,若不进行处理将极大影响训练效果。处理完单个体扫数据之后再依次遍历所有图片,将每个图片得到的数组连接成一个更高维度的数组序列,这就是最终可以输入到网络中进行训练的样本集。训练时将整个样本集切割成长度统一的样本(如24帧图像或16帧图像为一个单元)即可直接训练。

训练样本示例

先设定图片输出分辨率和初始化最终数组,处理的第一步是对原始雷达回波图象进行切割,(243, 176, 1428,1280)为原始图像中雷达回波部分所在的位置,只切割出这部分是为了减少比色卡、坐标、图片标题等干扰项,增加模型训练的精度。第二步是将三通道的彩色图片转换为单通道灰度图片,第三步将图片转化为二维数组并放入初始化过的最终数组中保存,不断重复该过程即可得到所需的图像数组序列。最后将所得数组保存为.npz格式的numpy数组方便后续取用。

样本数据的格式

模型训练

卷积长短时记忆神经网络自提出以来逐步完善已经成为了较为成熟的图像序列预测模型,Python社区也有了不少对其模型的封装方便人们直接构建网络对自己的数据进行训练和预测。

网络参数

模型为Keras中的贯序模型,即逐层嵌套依次连接,数据流由输入端输入,逐层流动,反向传播时更新参数,逐步降低损失函数。以上网络由四层ConvLSTM2D网络层堆叠而成,最后为一个三维卷积层用以格式化输出数组以便求取损失函数或获得预测结果。每层卷积核数目不同,卷积核大小均为3*3.最后以均方误差作为损失函数以adadelta为优化方法进行编译,并设定4GPU并行处理,降低训练时间。输入的数据即为上节处理的100*100*1三维张量序列。

核心代码:

from keras.models import Sequential
from keras.layers.convolutional import Conv3D
from keras.layers.convolutional_recurrent import ConvLSTM2D
from keras.layers.normalization import BatchNormalization
from keras.utils import multi_gpu_model
from keras import optimizers

seq = Sequential()
seq.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),input_shape=(None, WIDTH, HEIGHT, 1), padding='same', return_sequences=True))
seq.add(BatchNormalization())

seq.add(ConvLSTM2D(filters=60, kernel_size=(3, 3), padding='same', return_sequences=True))
seq.add(BatchNormalization())

seq.add(ConvLSTM2D(filters=60, 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=1, kernel_size=(3, 3, 3), activation='sigmoid', padding='same', data_format='channels_last'))

multi_gpu_model(seq, gpus=4)
sgd = optimizers.SGD(lr=0.01, clipnorm=1)
parallel_model.compile(loss='mean_squared_error', optimizer='adadelta')
parallel_model.fit(BASIC_SEQUENCE[:1000], NEXT_SEQUENCE[:1000], batch_size=10, epochs=10, validation_split=0.05)
seq.save('nice_model.h5')



图像外推效果

首次外推


二次外推
三次外推

代码仓库地址

点击这里在GitHub上查看。

编辑于 2018-07-27