Подключение рекуррентного слоя после cnn, что делает tf.expand_dims?

#python #tensorflow #keras #conv-neural-network #recurrent-neural-network

#python #тензорный поток #keras #conv-нейронная сеть #рекуррентная нейронная сеть

Вопрос:

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

 Input 0 is incompatible with layer simple_rnn_1: expected ndim=3, found ndim=2
 

Я решаю эту проблему с помощью expand_dims() функции Tensorflow, используя внутренний лямбда-слой. Кажется, он работал правильно, но я хочу быть уверенным, что моя модель работает правильно. Несмотря на просмотр соответствующей документации, я не мог понять, что expand_dims() сделано для того, чтобы заставить модель работать.

 from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Dropout, Flatten, Dense, Lambda, SimpleRNN
from tensorflow import expand_dims

def create_model():
    model = Sequential()
    model.add(Conv2D(32, (3, 3), input_shape=(50, 50, 1), padding='same',
                     activation='relu'))
    model.add(Conv2D(32, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Lambda(lambda x: expand_dims(model.output, axis=-1)))
    model.add(SimpleRNN(64, return_sequences=False))

    model.add(Dense(units=8, activation='softmax'))

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

    return model
 

Я хочу интерпретировать вывод CNN как последовательную информацию, используя рекуррентные слои (LSTM, GRU, другие рекуррентные модели). Правильно ли я использую лямбда-слой с expand_dims() ?

Ответ №1:

Слой выравнивания уменьшает размеры изображений до (длина пакета, размеры объектов), а рекуррентные нейронные сети ожидают 3 измерения для ввода вместо 2, поскольку для ввода временных рядов требуется новое измерение, как в (длина пакета, временные размеры, размеры объектов)

expand_dims Просто добавляет дополнительное измерение, которое преобразует ваши сглаженные выходные данные в (Длина пакета, Размеры элементов, 1). Это означает, что теперь будет работать RNN, и он будет рассматривать измерения объектов как измерение времени для данных, таким образом, упорядочивая их и выполняя то, что вы намеревались.