Есть два состояния, state_h
, который является последним выходным шагом; и state_c
, который является состоянием переноса или памятью.
Вы должны использовать функциональную модель API, чтобы иметь более одного входа:
main_input = Input((self.input_length,self.notes_classes))
state_h_input = Input((self.hidden_size,))
state_c_input = Input((self.hidden_size, self.hidden_size))
out = LSTM(self.hidden_size, return_sequences=True,recurrent_dropout=dropout,
initial_state=[state_h_input, state_c_input])(main_input)
#I'm not changing the following layers, they should have their own states if you want to
out = LSTM(self.hidden_size,recurrent_dropout=dropout,return_sequences=True)(out)
out = LSTM(self.hidden_size,return_sequences=True)(out)
out = BatchNorm()(out)
out = Dropout(dropout)(out)
out = Dense(256)(out)
out = Activation('relu')(out)
out = BatchNorm()(out)
out = Dropout(dropout)(out)
out = Dense(256)(out)
out = Activation('relu')(out)
out = BatchNorm()(out)
out = Dense(self.notes_classes)(out)
out = Activation('softmax')(out)
self.model = Model([main_input, state_h_input, state_c_input], out)
Следуя этому подходу, можно даже использовать выходы других слоев в качестве начальных состояний, если вы хотите обучаемы начальные состояния.
Большое изменение состоит в том, что вам нужно будет передать состояния для обучения и прогнозирования:
model.fit([original_inputs, state_h_data, state_c_data], y_train)
Где вы можете использовать нули для состояний во время обучения.