Свертка2d + LSTM против ConvLSTM2D

Are 1 и 2 то же самое?

  1. использовать Convolution2D слои и LSTM слои
  2. использовать 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)

вместо ConvLSTM2Ds:

self.recurrent_conv(h_tm1_x, self.recurrent_kernel_x)

такого рода преобразования не могут быть вычислены с помощью stacked Conv2D и LSTM слои.


  1. использовать Convolution2D слоев и ЛСТМ слоя

в этой технике вы складываете свертку и слои LSTM. Сверточные слои помогут вам изучить пространственные объекты, а LSTM поможет вам узнать корреляцию во времени.

2.Используйте ConvLSTM2D

ConvLSTM-это LSTM, в котором элементы (вход в состояние и переходы состояния в состояние) являются операциями свертки.
Научная статья- сверточная сеть LSTM: подход машинного обучения для Nowcasting осадков

подробнее о ConvLSTM в этом SO answer