#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, и он будет рассматривать измерения объектов как измерение времени для данных, таким образом, упорядочивая их и выполняя то, что вы намеревались.