Свертка2d + LSTM против ConvLSTM2D
Are 1
и 2
то же самое?
- использовать
Convolution2D
слои иLSTM
слои - использовать
ConvLSTM2D
если есть какая-то разница, не могли бы вы объяснить это для меня?
2 ответов
они не совсем одинаковы, вот почему:
1. Использовать Convolution2D
слои и LSTM
слои
как известно, Convolution2D
хорошо служит для захвата изображений или пространственных объектов, в то время как LSTM
используются для обнаружения корреляций с течением времени. Однако при укладке такого рода слоев корреляция между пространственными и временными объектами может быть неправильно зафиксирована.
2. Использовать ConvLSTM2D
чтобы решить эту проблему, Xingjian Shi et Эл. предложена сетевая структура, способная фиксировать пространственно-временные корреляции, а именно ConvLSTM
. В Керасе это отражено в ConvLSTM2D
класс, который вычисляет сверточные операции как во входных, так и в рекуррентных преобразованиях.
Керрас код
слишком иллюстрируют это, вы можете видеть здесь the 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
s:
self.recurrent_conv(h_tm1_x, self.recurrent_kernel_x)
такого рода преобразования не могут быть вычислены с помощью stacked Conv2D
и LSTM
слои.
- использовать Convolution2D слоев и ЛСТМ слоя
в этой технике вы складываете свертку и слои LSTM. Сверточные слои помогут вам изучить пространственные объекты, а LSTM поможет вам узнать корреляцию во времени.
2.Используйте ConvLSTM2D
ConvLSTM-это LSTM, в котором элементы (вход в состояние и переходы состояния в состояние) являются операциями свертки.
Научная статья- сверточная сеть LSTM: подход машинного обучения для Nowcasting осадков