TimeDistributed Dense Layer после слоев GRU (return_sequence = True), приводящих к ошибке с размерами - PullRequest
0 голосов
/ 14 мая 2019

В настоящее время я пытаюсь сделать свои первые шаги, используя Keras поверх Tensorflow для классификации данных временных рядов. Мне удалось запустить довольно простую модель, но после некоторой обратной связи мне было рекомендовано использовать несколько слоев GRU в строке и добавить оболочку TimeDistributed вокруг моих плотных слоев . Вот модель, которую я пробовал:

model = Sequential()
model.add(GRU(100, input_shape=(n_timesteps, n_features), return_sequences=True, dropout=0.5))
model.add(GRU(100, return_sequences=True, go_backwards=True, dropout=0.5))
model.add(GRU(100, return_sequences=True, go_backwards=True, dropout=0.5))
model.add(GRU(100, return_sequences=True, go_backwards=True, dropout=0.5))
model.add(GRU(100, return_sequences=True, go_backwards=True, dropout=0.5))
model.add(GRU(100, return_sequences=True, go_backwards=True, dropout=0.5))
model.add(TimeDistributed(Dense(units=100, activation='relu')))
model.add(TimeDistributed(Dense(n_outputs, activation='softmax')))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

Я получаю следующее сообщение об ошибке при попытке согласовать модель с входом, имеющим форму (2357, 128, 11) (2357 выборок, 128 временные шаги, 11 функций) :

ValueError: Error when checking target: expected time_distributed_2 to have 3 dimensions, but got array with shape (2357, 5)

Это вывод для model.summary():

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
gru_1 (GRU)                  (None, 128, 100)          33600     
_________________________________________________________________
gru_2 (GRU)                  (None, 128, 100)          60300     
_________________________________________________________________
gru_3 (GRU)                  (None, 128, 100)          60300     
_________________________________________________________________
gru_4 (GRU)                  (None, 128, 100)          60300     
_________________________________________________________________
gru_5 (GRU)                  (None, 128, 100)          60300     
_________________________________________________________________
gru_6 (GRU)                  (None, 128, 100)          60300     
_________________________________________________________________
time_distributed_1 (TimeDist (None, 128, 100)          10100     
_________________________________________________________________
time_distributed_2 (TimeDist (None, 128, 5)            505       
=================================================================
Total params: 345,705
Trainable params: 345,705
Non-trainable params: 0

Итак, как правильно поместить несколько слоев GRU в ряд и добавить TimeDistributed Wrapper к следующим плотным слоям. Буду очень признателен за любой полезный вклад

1 Ответ

0 голосов
/ 15 мая 2019

Если вы установите return_sequences = False в вашем последнем слое GRU, код будет работать.

Вам нужно только поставить return_sequences = True в случае, если выход RNN снова подается на вход дляRNN, следовательно, чтобы сохранить пространство размерности времени.Когда вы устанавливаете return_sequences = False, это означает, что выход будет только последним скрытым состоянием (вместо скрытого состояния на каждом временном шаге), и временная размерность исчезнет.

Именно поэтому, когда вы устанавливаете return_sequnces = False, выходная размерность уменьшается от N до N-1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...