【问题标题】:Convolution2D + LSTM versus ConvLSTM2DConvolution2D + LSTM 与 ConvLSTM2D
【发布时间】:2018-09-11 05:04:08
【问题描述】:

12 一样吗?

  1. 使用Convolution2D层和LSTM
  2. 使用ConvLSTM2D

如果有什么不同,你能给我解释一下吗?

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    它们并不完全相同,原因如下:

    1。使用Convolution2D层和LSTM

    众所周知,Convolution2D 可以很好地捕捉图像或空间特征,而LSTM 用于检测随时间变化的相关性。但是,通过堆叠这些层,可能无法正确捕获空间和时间特征之间的相关性。

    2。使用ConvLSTM2D

    为了解决这个问题,Xingjian Shi et al. 提出了一种能够捕获时空相关性的网络结构,即ConvLSTM。在 Keras 中,这反映在 ConvLSTM2D 类中,该类计算输入和循环变换中的卷积运算。

    Keras 代码

    也说明了这一点,你可以看到hereLSTM 代码,如果你从LSTMCell 转到call 方法,你只会看到:

        x_i = K.dot(inputs_i, self.kernel_i)
        x_f = K.dot(inputs_f, self.kernel_f)
        x_c = K.dot(inputs_c, self.kernel_c)
        x_o = K.dot(inputs_o, self.kernel_o)
    

    相反,ConvLSTM2DCell 类调用:

        x_i = self.input_conv(inputs_i, self.kernel_i, self.bias_i, padding=self.padding)
        x_f = self.input_conv(inputs_f, self.kernel_f, self.bias_f, padding=self.padding)
        x_c = self.input_conv(inputs_c, self.kernel_c, self.bias_c, padding=self.padding)
        x_o = self.input_conv(inputs_o, self.kernel_o, self.bias_o, padding=self.padding)
        h_i = self.recurrent_conv(h_tm1_i, self.recurrent_kernel_i)
        h_f = self.recurrent_conv(h_tm1_f, self.recurrent_kernel_f)
        h_c = self.recurrent_conv(h_tm1_c, self.recurrent_kernel_c)
        h_o = self.recurrent_conv(h_tm1_o, self.recurrent_kernel_o)
    

    地点:

    def input_conv(self, x, w, b=None, padding='valid'):
        conv_out = K.conv2d(x, w, strides=self.strides,
                            padding=padding,
                            data_format=self.data_format,
                            dilation_rate=self.dilation_rate)
        if b is not None:
            conv_out = K.bias_add(conv_out, b,
                                  data_format=self.data_format)
        return conv_out
    
    def recurrent_conv(self, x, w):
        conv_out = K.conv2d(x, w, strides=(1, 1),
                            padding='same',
                            data_format=self.data_format)
        return conv_out
    

    LSTM 中,h_x(循环转换)的等价物是:

    K.dot(h_tm1_x, self.recurrent_kernel_x)
    

    而不是ConvLSTM2D的:

    self.recurrent_conv(h_tm1_x, self.recurrent_kernel_x)
    

    无法使用堆叠的Conv2DLSTM 层计算此类转换。

    【讨论】:

    • 所以,如果是同时捕获时空数据的原因,那么下一个问题是:ConvLSTM2DConv3D有什么区别?
    • 对@donto 的问题有任何答案吗?
    【解决方案2】:
    1. 使用 Convolution2D 层和 LSTM 层

    在这种技术中,您可以堆叠卷积层和 LSTM 层。卷积层帮助您学习空间特征,LSTM 帮助您及时了解相关性。

    2.使用ConvLSTM2D

    ConvLSTM 是一种 LSTM,其中的门(输入到状态和状态到状态转换)是卷积操作。
    研究论文-Convolutional LSTM Network: A Machine Learning Approach for Precipitation Nowcasting

    More about ConvLSTM in this SO answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 2017-05-25
      • 1970-01-01
      相关资源
      最近更新 更多