阐明用于回归的 convLSTM 用法

数据挖掘 回归 lstm 深度学习
2022-02-24 22:09:51

我正在尝试使用 keras 和 convLSTM 层根据以前的天气雷达图片预测未来的天气数据。

我使用i个时间步长,即 i 个雷达图像作为输入数据。在我的图中,我假设i=3这些雷达图像通过一个 convLSTM keras 层。convLSTM 层参数需要以下形式的输入形状:(batch_size, time, channels, image_height, image_width)

问题 1:在 keras 中,convLSTM 层不需要时间步参数。所以我假设它从 input_shape 推断出时间步数。我的理解正确吗?

在我的问题中,我想提前预测j个时间步长。因此,我的理解是input_shape 的时间参数应该等于i+j并且我应该用“空白”雷达图像填充我的输入数据。事实上,这似乎是创建多对多 convLSTM 层的方法,我需要在其中预测未来的时间步长。在我的图中,我假设j=3,因此i+j=6

问题 2:上述关于 convLSTM 层形状的理解是否正确?

convLSTM 层的容量将由每个 LSTM 单元内的过滤器数量定义,即由keras convLSTM 层的过滤器参数定义。为了便于讨论,我们假设过滤器的数量由k定义。因此,每个 LSTM 单元的输出将是(batch_size, k, H, W) ,其中 H 和 W 是根据卷积神经网络步长S和填充P以及过滤器尺寸F计算的,即

H = image_height−F+2P/S+1

W = image_width-F+2P/S+1

网络结构将是这样的: 网络结构

主要问题:我应该如何使用这些输出来执行所需的回归,即预测提前j个时间步长的天气数据?

有一张著名的临近预报天气图:

临近天气预报结构

但我不明白如何实现这个结构此外,基于我对经典深度神经网络和卷积神经网络的了解,该结构对我来说没有意义。

如果我要在 keras 中实现这种结构,我会使用下面的代码,基于上面讨论的数据结构。除了我在这里看到这个实现之外,我没有理由进行批量标准化问题 3如果有人知道为什么批量归一化很有用,我全神贯注。正如大家所见,建议的代码在第二个 convLSTM 层之后停止,因为我不知道如何处理数据以根据提取的特征执行回归convLSTM 层。任何帮助将不胜感激。

# define Architecture
from keras.layers import Dense, Conv2D, ConvLSTM2D, Activation, MaxPooling2D, Flatten, Dropout, concatenate, Input, BatchNormalization
from keras.models import Model
from keras.models import Sequential
import keras_applications

targetNb = 8 # need to predict eight time steps ahead
availableTimeSteps = 3 # number of timesteps i.e. radar images used to predict the next ones
toPredictTimeSteps = 3
totalTimeSteps = availableTimeSteps+toPredictTimeSteps

inputConvLSTM = Input(shape=((totalTimeSteps , channels, image_height, image_width))) # samples first dimension not necessary 
x = ConvLSTM2D(filters=32,  # in convLSTM, #filters defines the output space dimensions & the capacity of the network. Similar to #units in a LSTM
               kernel_size=(3,3), 
               strides=(1, 1), 
               padding='same' # no reason for this setting, just saw it on keras example
               return_sequences=True, # return_sequences defines if the output returns the last time step output or all the time steps)(inputConvLSTM)
               # given that the #timestep is not specified, one assumes the #timesteps
               # is implicitly defined by the input_shape 

x = BatchNormalization()(x)
x = ConvLSTM2D(kernel_size=(3,3), 
               strides=(1, 1), 
               padding='same'
               return_sequences=True,
               name = 'finalConvLSTM')(x)

# HERE I AM STUCK 
# I do not know how to use the features of the convLSTM layers to make
# predictions. In a classical deep convolutional neural network I would use a flatten so something like : 

x = TimeDistributed(Flatten(), input_shape=(model.get_layer('finalConvLSTM').output_shape[1:]) 

# flatten each time step
# x shall have dimensions (samples, time, filters, output_row, output_col)
# where output_row and output_col are computed according to convolutional rules
# so the flatten() shall produce, for each time step, a output of dimensions
# (samples, time, filters*output_row*output_col)
3个回答

我只想强调一个重要的一点:新的TensorFlow 2.0ConvLSTM()已经排除了层,这在很大程度上基于模型规范中的 Keras。它被层取代,层将不同的参数作为输入。(请参阅此处的文档)。(另一种方法是手动创建层的组合。)ConvLSTM2D()Conv2D()LSTM()

也就是说,ConvLSTM()层可能会在不久的将来消失,研究ConvLSTM2D()层的工作方式可能是一项不错的投资。

但是,请回答您的问题:


在 keras 中,convLSTM 层不需要时间步长参数。所以我假设它从 input_shape 推断出时间步数。我的理解正确吗?

使用 RNN 时,您应该从内部指定输入序列的长度(时间步数)input_shape


上述关于 convLSTM 层形状的理解是否正确?

我不确定我明白你在这里问什么。你是什​​么意思:

我应该用“空白”雷达图像填充我的输入数据。事实上,这似乎是创建多对多 convLSTM 层的方法,我需要在其中预测未来的时间步长。

?


我应该如何使用这些输出来执行所需的回归

你可以预测:

  • 一次一个值,模型末尾有一个输出节点,然后迭代预测
  • 一次有多个值,有多个
  • 输出节点使用 seq2seq 模型,您可以在其中预测与输入长度相同的序列,但前移一个或多个步骤

这完全取决于您的喜好/需求。


为什么批量标准化很有用

它在卷积层和密集层之间非常有用,它是一种正则化技术,可以帮助激活函数按预期工作,并允许模型更好地捕捉非线性。但是,我不建议使用循环架构,因为输出时间序列的失真会降低模型的质量。(请记住,这只是个人意见。)

convLSTM 层参数需要以下形式的输入形状:(batch_size, time, channels, image_height, image_width)

问题 1:在 keras 中,convLSTM 层不需要时间步参数。所以我假设它从 input_shape 推断出时间步数。我的理解正确吗?

Keras 中的 ConvLSTM 层确实需要时间参数。您刚刚在上面的行中说明了输入形状,它显然有时间作为第二个参数,所以我对您的问题有点困惑。

Keras 中的 ConvLSTM 层接收完整序列,在内部执行展开,并返回最终时间步的输出(或每个时间步的输出return_sequences=True)。

回答你的第二个问题:你画了一个标准的多对多 RNN 架构,这不是你想要的。您想要的是一个编码器-解码器 RNN 架构,它允许您提前预测个时间步,其中不必等于输入时间步。jj

首先,您的输出维度有点模糊。是单步的预测(提前j-timestep)还是多步的向量?

问题1:我猜时间应该类似于vanilla LSTM,在你的情况下是i(我需要参考其他工作来确认这一点)。

主要问题:我认为这类似于如何通过 CNN 解决回归的问题(因为您的 ConvLSTM2D 输出是 3 维或 4 维数据)。您可以将输出传递给堆叠的 LSTM,也可以传递给 CNN 池化并展平为密集层。