Вопрос:

LSTM Начальное состояние из плотного слоя

python machine-learning keras

1606 просмотра

1 ответ

3274 Репутация автора

Я использую lstmданные временных рядов. У меня есть особенности о временных рядах, которые не зависят от времени. Представьте акции компании для ряда и такие вещи, как местоположение компании в функциях не временных рядов. Это не случай использования, но это та же идея. Для этого примера давайте просто предскажем следующее значение во временном ряду.

Таким простым примером будет:

feature_input = Input(shape=(None, data.training_features.shape[1]))
dense_1 = Dense(4, activation='relu')(feature_input)
dense_2 = Dense(8, activation='relu')(dense_1)

series_input = Input(shape=(None, data.training_series.shape[1]))
lstm = LSTM(8)(series_input, initial_state=dense_2)
out = Dense(1, activation="sigmoid")(lstm)

model = Model(inputs=[feature_input,series_input], outputs=out)
model.compile(loss='mean_squared_error', optimizer='adam', metrics=["mape"])

однако я просто не уверен, как правильно указать начальное состояние в списке. я получил

ValueError: An initial_state was passed that is not compatible with `cell.state_size`. Received `state_spec`=[<keras.engine.topology.InputSpec object at 0x11691d518>]; However `cell.state_size` is (8, 8)

который я вижу, вызван трехмерным измерением партии. Я пытался использовать слои Flatten, Permutation и Resize, но я не уверен, что это правильно. Чего мне не хватает и как мне соединить эти слои?

Автор: modesitt Источник Размещён: 12.01.2018 08:15

Ответы (1)


10 плюса

10021 Репутация автора

Решение

Первая проблема заключается в том, что LSTM(8)слой ожидает два начальных состояния h_0и c_0каждое из измерений (None, 8). Вот что означает « cell.state_sizeis (8, 8)» в сообщении об ошибке.

Если у вас есть только одно начальное состояние dense_2, возможно, вы можете переключиться на GRU(который требует только h_0). Или вы можете преобразовать ваше feature_inputв два начальных состояния.

Вторая проблема заключается в том, что h_0и c_0вы в форме (batch_size, 8), а вы dense_2в форме (batch_size, timesteps, 8). Вам нужно разобраться с измерением времени перед использованием в dense_2качестве начальных состояний.

Так что, возможно, вы можете изменить свою входную форму (data.training_features.shape[1],)или взять среднее значение за промежутки времени GlobalAveragePooling1D.

Рабочий пример будет:

feature_input = Input(shape=(5,))
dense_1_h = Dense(4, activation='relu')(feature_input)
dense_2_h = Dense(8, activation='relu')(dense_1_h)
dense_1_c = Dense(4, activation='relu')(feature_input)
dense_2_c = Dense(8, activation='relu')(dense_1_c)

series_input = Input(shape=(None, 5))
lstm = LSTM(8)(series_input, initial_state=[dense_2_h, dense_2_c])
out = Dense(1, activation="sigmoid")(lstm)
model = Model(inputs=[feature_input,series_input], outputs=out)
model.compile(loss='mean_squared_error', optimizer='adam', metrics=["mape"])
Автор: Yu-Yang Размещён: 13.01.2018 05:58
Вопросы из категории :
32x32