代码之家  ›  专栏  ›  技术社区  ›  Roman

卷积2D+LSTM与ConvLSTM2D

  •  24
  • Roman  · 技术社区  · 7 年前

    1 2 同样的?

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

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

    2 回复  |  直到 7 年前
        1
  •  26
  •   ebeneditos    7 年前

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

    1、使用 Convolution2D 图层和 LSTM 图层

    众所周知, 卷积2D 可以很好地捕捉图像或空间特征 LSTM公司 用于检测随时间变化的相关性。然而,通过叠加此类层,可能无法正确捕获空间和时间特征之间的相关性。

    2、使用 ConvLSTM2D

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

    Keras代码

    你可以看到 here 这个 LSTM公司 代码,如果您转到 call 方法来自 LSTMCell ,您只能看到:

        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)
    

    这些类型的转换无法使用堆栈 Conv2D LSTM公司 图层。

        2
  •  7
  •   user239457    7 年前
    1. 使用卷积2D层和LSTM层

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

    2、使用ConvLSTM2D

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

    More about ConvLSTM in this SO answer