Внедрить Seq2Seq в Keras с помощью Image Seqs - PullRequest
0 голосов
/ 17 мая 2018

У меня проблема с вводом в виде последовательности изображений и выводом в виде последовательности меток, которые соответствуют каждому кадру в изображении.Формат ввода показан ниже:

enter image description here

Цель: Прогнозировать список меток [label 0, label 1, label 2, label 3] на основе спискапоследовательность ввода [img 0, img 1, img 2, img 3].Выходные данные модели обучения должны быть:

P([label 0, label 1, label 2, label 3]/[img 0, img 1, img 2, img 3]).

label 0 зависит от img 0 и также коррелируется с img 1, img 2 and img 3.И другие метки также зависят от всех изображений в последовательности ввода.Таким образом, это делает целевую метку зависимой как от пространственной информации в каждом отдельном изображении, так и от временной информации.

Итак, я планирую использовать сверточную нейронную сеть (CNN) для кодирования пространственной информации для каждого изображения.В то же время, Как я могу кодировать временную информацию последовательности img с помощью LSTM?

Вот мой код:

from keras.models import Sequential, Model
from keras.layers import Dense, Conv2D, LSTM, Flatten, TimeDistributed, RepeatVector
from keras.layers.normalization import BatchNormalization

def cnn_lstm():

    model = Sequential()

    # CNN module
    model.add(TimeDistributed(Conv2D(filters = 8, 
                                    kernel_size = (2, 2), 
                                    padding = 'same',
                                    activation='relu',
                                    name = 'Conv_1'),
                                    input_shape = (None, img_height, img_width, channels)))

    model.add(TimeDistributed(BatchNormalization(name='BN_1')))
    model.add(TimeDistributed(MaxPooling2D()))

    model.add(TimeDistributed(Conv2D(filters = 8, 
                                    kernel_size = (2, 2), 
                                    padding = 'same',
                                    activation='relu',
                                    name = 'Conv_2')))

    model.add(TimeDistributed(BatchNormalization(name='BN_2')))
    model.add(TimeDistributed(MaxPooling2D()))

    # Flatten all features from CNN before inputing them into LSTM
    model.add(TimeDistributed(Flatten()))

    # LSTM module
    model.add(LSTM(50))
    model.add(RepeatVector(output_seq_length))

    model.add(LSTM(50, return_sequences=True, name = 'decoder'))
    model.add(TimeDistributed(Dense(nb_classes, activation='softmax')))

    model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

    return model

output_seq_length = 4 и nb_classes = 4 в этом примере.

Достигнет ли моя модель того, что я ожидал?

Если это проблема seq2seq , она не выглядитздесь задействовано «принуждение учителя», как показано в этом уроке .

Есть ли способ использовать преимущества CNN для кодирования пространственной информации и LSTM для кодирования временной информации одновременно?Как комбинация CNN и кодера-декодера LSTM ?

Любые входные данные приветствуются!Большое спасибо!

1 Ответ

0 голосов
/ 17 мая 2018

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

Комбинация CNN и LSTM?Ну, у Кераса есть слой ConvLSTM2D , который будет применять свертки для входных и повторяющихся компонентов.

...