12是否相同?

  • 使用Convolution2D层和LSTM
  • 使用ConvLSTM2D

  • 如果有任何区别,您能为我解释一下吗?

    最佳答案

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

    1.使用Convolution2D层和LSTM

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

    2.使用ConvLSTM2D
    为了解决这个问题,Xingjian Shi et al.提出了一种能够捕获时空相关性的网络结构,即ConvLSTM。在Keras中,这反射(reflect)在 ConvLSTM2D 类中,该类在输入和递归转换中计算卷积运算。

    Keras代码

    过于说明这一点,您可以看到LSTM代码here,如果您从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)
    

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

    关于python - Convolution2D + LSTM与ConvLSTM2D,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49603498/

    10-12 22:03