Недавно я видел два разных типа настройки кодера-декодера в Керасе.Они оба используются для генерации последовательностей.Но я не уверен, какой из них более эффективен (или понимаю, какой сценарий более эффективен).Так что любое предложение поможет.
Первая модель LSTM кодера-декодера принадлежит Джейсону Браунли (Jason Brownlee) из machinelearningmastery, вторая - из книги Natural Language Processing in Action
def jason_brownlee_model():
model = Sequential()
model.add(LSTM(75, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(RepeatVector(Y_train.shape[1]))
model.add(LSTM(50, return_sequences=True))
model.add(TimeDistributed(Dense(X_train.shape[2], activation='softmax')))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
model.fit(X_train, Y_train, epochs=10, batch_size=32)
return model
def nlp_in_action_model():
encoder_inputs = Input(shape=(None, X.shape[2]))
encoder = LSTM(75, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_inputs)
encoder_states = [state_h, state_c]
decoder_inputs = Input(shape=(None, Y.shape[2]))
decoder_lstm = LSTM(75, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state=encoder_states)
decoder_dense = Dense(Y_target.shape[2], activation='softmax')
decoder_outputs = decoder_dense(decoder_outputs)
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['acc'])
model.fit([X, Y],
Y_target,
batch_size=16,
epochs=5, validation_split=0.1)
точность очень похожа.Однако вторая модель требует трех разных входных данных, X, Y_target и Y. Вторая модель также требует подачи возвращаемого состояния непосредственно в декодер, в то время как первая модель просто использует оболочку TimeDistributed для продолжения генерации символов.