Как мне узнать правильный формат для моих входных данных в моем keras RNN? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь построить простой RNN Элмана, как описано здесь .

Я построил свою модель с использованием Keras следующим образом:

model = keras.Sequential()
model.add(keras.layers.SimpleRNN(7,activation =None,use_bias=True,input_shape=
                             [x_train.shape[0],x_train.shape[1]]))
model.add(keras.layers.Dense(7,activation = tf.nn.sigmoid))

model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
simple_rnn_2 (SimpleRNN)     (None, 7)                 105       
_________________________________________________________________
dense_2 (Dense)              (None, 7)                 56        
=================================================================
Total params: 161
Trainable params: 161
Non-trainable params: 0
_________________________________________________________________

Мои тренировочные данные в настоящее время в форме (15000, 7, 7). То есть 15000 экземпляров длиной 7 одно горячее кодирование, кодирующее одну из семи букв. Например, [0,0,0,1,0,0,0],[0,0,0,0,1,0,0] и т. Д.

Метки данных имеют одинаковый формат, поскольку каждая буква предсказывает следующую букву в последовательности, т. Е. [0,1,0,0,0,0,0] имеет метку [0,0,1,0,0,0,0].

Итак, данные обучения (x_train) и метки обучения (y_train) имеют форму (15000,7,7).

Мои данные проверки x_val и y_val имеют форму (10000,7,7). Т.е. та же форма, только с меньшим количеством экземпляров.

Итак, когда я запускаю свою модель:

history = model.fit(x_train,
         y_train,
         epochs = 40,
         batch_size=512,
         validation_data = (x_val,y_val))

Я получаю ошибку:

ValueError: Error when checking input: expected simple_rnn_7_input to have shape (15000, 7) but got array with shape (7, 7)

Ясно, что мои входные данные неверно отформатированы для ввода в Keras RNN, но я не могу понять, как правильно их ввести.

Может кто-нибудь посоветовать мне решение?

1 Ответ

0 голосов
/ 11 января 2019
  1. Слой SimpleRNN ожидает входные данные измерений (seq_length, input_dim), то есть (7,7) в вашем случае.
  2. Также, если вы хотите выводить на каждом временном шаге, вам нужно использовать return_sequence=True, по умолчанию это false. Таким образом, вы можете сравнить выходные данные с шагом по времени.

Итак, архитектура модели будет выглядеть примерно так:

model.add(keras.layers.SimpleRNN(7, activation='tanh', 
                       return_sequences=True, 
                        input_shape=[7,7]))
model.add(keras.layers.Dense(7))
model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
simple_rnn_12 (SimpleRNN)    (None, 7, 7)              105       
_________________________________________________________________
dense_2 (Dense)              (None, 7, 7)              56        
=================================================================
Total params: 161
Trainable params: 161
Non-trainable params: 0
_________________________________________________________________

Теперь во время обучения он ожидает данные input and output димов (num_samples, seq_length, input_dims), т.е. (15000, 7, 7) для обоих.

model.compile(loss='categorical_crossentropy', optimizer='adam')# define any loss, you want
model.fit(x_train, y_train, epochs=2)
...