1
和2
是否相同?
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)
无法使用堆叠的
Conv2D
和LSTM
层来计算此类转换。关于python - Convolution2D + LSTM与ConvLSTM2D,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49603498/