simpleRNN форма ввода / вывода - PullRequest
0 голосов
/ 01 мая 2019

Я определил simpleRNN в keras со следующим кодом:

# define RNN architecture
from keras.layers import Input
from keras.models import Model
from keras.layers import SimpleRNN
from keras.models import Sequential

model = Sequential()
model.add(SimpleRNN(units = 10,
                    return_sequences=False, 
                    unroll=True,
                    input_shape=(6, 2)))

model.compile(loss='mse',
              optimizer='rmsprop',
              metrics=['accuracy'])
model.summary()

затем я передаю его входными данными, имеющими форму (batch_size, 6, 2), то есть 6 временных шагов, каждый из которых имеет две особенности. Поэтому я ожидаю 6 простых клеток РНН.

При запуске тренинга я получаю следующее сообщение об ошибке:

Error when checking target: expected simple_rnn_2 to have shape (10,) but got array with shape (1,)

и я не понимаю почему.

Смысл RNN (в моем понимании) состоит в том, чтобы его вход питался предыдущей ячейкой RNN, если это не первая ячейка RNN, а новый вход временного шага.

Таким образом, в этом случае я ожидаю, что вторая ячейка RNN будет снабжаться первой ячейкой RNN вектором формы (10,) с единицей измерения = 10. Почему получается, что он получает вектор размером (1,)?

Что странно, так это то, что как только я добавляю плотный слой в модель, это решает проблему. Итак, следующая архитектура:

# define RNN architecture
from keras.layers import Input
from keras.models import Model
from keras.layers import SimpleRNN, Dense
from keras.models import Sequential

model = Sequential()
model.add(SimpleRNN(units = 10,
                    return_sequences=False, 
                    unroll=False,
                    input_shape=(6, 2)))
model.add(Dense(1, activation='relu'))
model.compile(loss='mse',
              optimizer='rmsprop',
              metrics=['accuracy'])
model.summary()

не выдает ошибку. Есть идеи почему?

1 Ответ

1 голос
/ 01 мая 2019

Предполагая, что вы на самом деле обучаете модель (вы не включили этот код), проблема в том, что вы подаете ей целевые выходные данные формы (1,), в то время как SimpleRNN ожидает ввода формы (10,). Вы можете посмотреть документы здесь: https://keras.io/layers/recurrent/

В документах четко указано, что вывод SimpleRNN равен units, что составляет 10. Каждый блок производит один выход.

Второй пример работает, потому что вы добавили слой Dense, который уменьшает выходной размер до (1,). Теперь модель может принимать ваши выходные данные тренировки, и они возвращаются через сеть.

...