Python, Keras - ValueError: Невозможно передать значение формы (10, 70, 1025) для Tensor u'dense_2_target: 0 ', который имеет форму' (?,?) ' - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь тренировать РНН партиями. Размер входного ввода (10, 70, 3075), где 10 - размер партии, 70 - измерение времени, 3075 - измерение частоты.

Есть три выхода, размер которых (10, 70, 1025) каждая, в основном 10 спектрограмм с размером (70 1025).

Я бы хотел обучить этот RNN по регрессии, структура которого

input_img = Input(shape=(70,3075 ) )
x = Bidirectional(LSTM(n_hid,return_sequences=True, dropout=0.5,    recurrent_dropout=0.2))(input_img)
x = Dropout(0.2)(x)
x = Bidirectional(LSTM(n_hid,  dropout=0.5, recurrent_dropout=0.2))(x)
x = Dropout(0.2)(x)
o0 = ( Dense(1025, activation='sigmoid'))(x)
o1 = ( Dense(1025, activation='sigmoid'))(x)
o2 = ( Dense(1025, activation='sigmoid'))(x)

Проблема в том, что выходные плотные слои не могут учитывать три измерения, им нужно что-то вроде (None, 1025), которое я не знаю, как обеспечить, если я не объединяюсь по измерению времени.

Произошла следующая ошибка:

ValueError: Невозможно передать значение формы (10, 70, 1025) для Tensor u'dense_2_target: 0 ', который имеет форму' (?,?) '

Будет ли опция batch_shape полезна во входном слое? Я действительно попробовал это, но у меня та же ошибка.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

В этом случае второй RNN сворачивает последовательность в один вектор, потому что по умолчанию return_sequences=False. Чтобы модель возвращала последовательности и запускала плотный слой для каждого временного шага отдельно, просто добавьте return_sequences=True также ко второму RNN:

x = Bidirectional(LSTM(n_hid,  return_sequences=True, dropout=0.5, recurrent_dropout=0.2))(x)

Плотные слои автоматически применяются к последнему измерению, поэтому нет необходимости изменять их впоследствии.

0 голосов
/ 19 января 2019

Чтобы получить правильную выходную форму, вы можете использовать слой Reshape:

o0 = Dense(70 * 1025, activation='sigmoid')(x)
o0 = Reshape((70, 1025)))(o0)

Будет выведено (batch_dim, 70, 1025). Вы можете сделать то же самое для двух других выходов.

...