Есть несколько важных моментов, на которые нужно обратить внимание, чтобы создать эту ( довольно сложную ) модель.
Вот сама модель, созданная с использованием функционального API:
def expand_dims(x):
return K.expand_dims(x, -1)
inp = Input(shape=(3,3))
lstm = Bidirectional(LSTM(128, return_sequences=True))(inp)
lstm = Lambda(expand_dims)(lstm)
conv2d = Conv2D(filters=128, kernel_size=2, padding='same')(lstm)
max_pool = MaxPooling2D(pool_size=(2, 2),)(conv2d)
predictions = Dense(10, activation='softmax')(max_pool)
model = Model(inputs=inp, outputs=predictions)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
Пошаговое объяснение
Сначала , создайте свою входную форму.На изображении выше видно, что вы работаете с 7 семплами, окном из 3 и 3 объектов -> тензор формы (7, 3, 3)
.Очевидно, вы можете изменить на что угодно.Используйте входной слой для двунаправленного слоя LSTM.
inp = Input(shape=(3,3))
lstm = Bidirectional(LSTM(128, return_sequences=True))(inp)
Второй , как @Amir отметил, что вам нужно расширить размеры, если вы хотите использовать слой Conv2D
.Однако только использование бэкэнда keras недостаточно, поскольку модель, созданная функциональным API, потребует от вас наличия только слоев keras.Проверьте этот ответ здесь для ошибки NoneType' object has no attribute '_inbound_nodes
.Поэтому вам нужно извлечь expand_dim
в его собственную функцию и обернуть вокруг слоя Lambda
:
def expand_dims(x):
return K.expand_dims(x, -1)
lstm = Lambda(expand_dims)(lstm)
Остальное довольно просто после сортировки вышеупомянутого:
conv2d = Conv2D(filters=128, kernel_size=2, padding='same')(lstm)
max_pool = MaxPooling2D(pool_size=(2, 2),)(conv2d)
predictions = Dense(10, activation='softmax')(max_pool)
model = Model(inputs=inp, outputs=predictions)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
Сводка модели выглядит следующим образом:
Layer (type) Output Shape Param #
=================================================================
input_67 (InputLayer) (None, 3, 3) 0
_________________________________________________________________
bidirectional_29 (Bidirectio (None, 3, 256) 135168
_________________________________________________________________
lambda_7 (Lambda) (None, 3, 256, 1) 0
_________________________________________________________________
conv2d_19 (Conv2D) (None, 3, 256, 128) 640
_________________________________________________________________
max_pooling2d_14 (MaxPooling (None, 1, 128, 128) 0
_________________________________________________________________
dense_207 (Dense) (None, 1, 128, 10) 1290
=================================================================
Total params: 137,098
Trainable params: 137,098
Non-trainable params: 0
_________________________________________________________________
None
А вот визуализация :