КЕРАС: Предварительная подготовка модели CNN и после использования ее для модели CNN-LSTM - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть эта модель cnn:

model = Sequential()
model.add(Convolution2D(32, (3, 3), activation='relu', input_shape=(n_rows,n_cols,1)))
model.add(Convolution2D(32, (3, 3), activation='relu'))
model.add(AveragePooling2D(pool_size=(1,3)))
#...
model.add(Flatten())

model.add(Dense(1024, activation='relu')) #needed?
model.add(Dense(3)) #default linear activation

И тренируйте ее

После того, как я хочу использовать веса этого CNN, использовать их в модели CNN-LSTM.

Итак, у меня есть что-то вроде этого:

#Load from previous CNN (pre-trained!) (up to Flatten()) and use TimeDistributed on them
model.add(LSTM(1024, activation='relu', return_sequences=True))
model.add(LSTM(1024, activation='relu'))
model.add(Dense(3))

Имеет ли это смысл? Как это можно сделать? Большое спасибо!

1 Ответ

0 голосов
/ 10 апреля 2020

Вы можете сделать это. Однако для успешной реализации этой новой модели вам необходимо использовать функциональный API (https://www.tensorflow.org/guide/keras/functional), чтобы добиться этого.

Ниже я приведу пример того, как Вы можете добавить новые слои в предварительно обученную модель.

# Initialize the base model
# Say that this is the cnn model which is pretrained
base_model = cnn_model(input_shape=(n_rows, n_cols, 1))
base_model.trainable = False

# Adding the first lstm layer
x = tf.keras.layers.LSTM(1024,activation='relu',return_sequences='True')(base_model.output)

# Adding the second lstm layer
x = tf.keras.layers.LSTM(1024, activation='relu',return_sequences='False')(x)

# Adding the output
output = tf.keras.layers.Dense(3,activation='linear')(x)

# Final model creation
model = Model(inputs=[base_model.input], outputs=[output])
...