它们并不完全相同,原因如下:
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公司
图层。