У меня есть две модели LSTM, где;
- модель 1: сначала слой LSTM, а затем слой CNN
- модель 2: сначала слой CNN, а затем слой LSTM
Код модели 1:
model = Sequential()
model.add(LSTM(100, return_sequences=True, input_shape=(25,3)))
model.add(Conv1D(100, kernel_size=3, activation = 'relu'))
model.add(GlobalMaxPooling1D())
model.add(Dense(50))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Код модели 2:
model = Sequential()
model.add(Conv1D(100, kernel_size=3, activation = 'relu', input_shape=(25,3)))
model.add(LSTM(100))
model.add(Dense(50))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Теперь я хочу преобразовать мой LSTM в BiLSTM. Я знаю, что в керасе это делается следующим образом Bidirectional(LSTM())
.
Однако я не уверен, есть ли какие-либо другие изменения, которые я должен сделать при передаче данных в CNN.
Я с радостью предоставлю более подробную информацию, если это необходимо.
РЕДАКТИРОВАТЬ:
Код модели 1:
model = Sequential()
model.add(Bidirectional(LSTM(100, return_sequences=True), input_shape=(25,3)))
model.add(Conv1D(100, kernel_size=3, activation = 'relu'))
model.add(GlobalMaxPooling1D())
model.add(Dense(50))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Код модели 2:
model = Sequential()
model.add(Conv1D(100, kernel_size=3, activation = 'relu', input_shape=(25,3)))
model.add(Bidirectional(LSTM(100)))
model.add(Dense(50))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
РЕДАКТИРОВАТЬ (Еще одно уточнение):
Предположим, у меня есть следующая двунаправленная модель LSTM.
inputs = Input((25,3))
side1 = Bidirectional(LSTM(100, return_sequences=True))(inputs)
side2 = Conv1D(200, activation = 'tanh', padding = 'same')(inputs)
merged = Add()([side1, side2])
outputs = Conv1D(200)(merged)
outputs = GlobalMaxPooling1D()(outputs)
outputs = Dense(100)(outputs)
outputs = Dense(1, activation='sigmoid')(outputs)
model = Model(inputs, outputs)
Если я хочу преобразовать его в обычную модель LSTM, хорошо ли я сделать это следующим образом.
inputs = Input((25,3))
side1 = LSTM(200, return_sequences=True)(inputs)
side2 = Conv1D(200, activation = 'tanh', padding = 'same')(inputs)
merged = Add()([side1, side2])
outputs = Conv1D(200)(merged)
outputs = GlobalMaxPooling1D()(outputs)
outputs = Dense(100)(outputs)
outputs = Dense(1, activation='sigmoid')(outputs)
model = Model(inputs, outputs)
Пожалуйста, дайте мне знать ваши мысли.