Мне удалось создать успешный RNN, который может предсказать следующую букву в последовательности букв. Однако я не могу понять, почему работает решение проблемы, с которой я столкнулся.
Мои тренировочные данные имеют размеры (39000,7,7)
Моя модель выглядит следующим образом:
model = Sequential()
model.add(SimpleRNN(7, input_shape = [7,7], return_sequences = True))
model.add(Flatten())
model.add(Dense(7))
model.add(Activation('softmax'))
adam = optimizers.Adam(lr = 0.001)
model.compile(loss='categorical_crossentropy',optimizer=adam, metrics=['accuracy'])
model.summary()
return model
Layer (type) Output Shape Param #
=================================================================
simple_rnn_49 (SimpleRNN) (None, 7, 7) 105
_________________________________________________________________
flatten_14 (Flatten) (None, 49) 0
_________________________________________________________________
dense_49 (Dense) (None, 7) 350
_________________________________________________________________
activation_40 (Activation) (None, 7) 0
=================================================================
Total params: 455
Trainable params: 455
Non-trainable params: 0
_________________________________________________________________
Это отлично работает. Мой вопрос: зачем мне выравнивать слой? Когда я не включаю это, я получаю это резюме модели:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
simple_rnn_50 (SimpleRNN) (None, 7, 7) 105
_________________________________________________________________
dense_50 (Dense) (None, 7, 7) 56
_________________________________________________________________
activation_41 (Activation) (None, 7, 7) 0
=================================================================
Total params: 161
Trainable params: 161
Non-trainable params: 0
_________________________________________________________________
сопровождается этой ошибкой
ValueError: Error when checking target: expected activation_41 to have 3 dimensions, but got array with shape (39000, 7)
Мой вопрос таков: когда в сводке модели говорится, что во втором примере выходной сигнал плотного слоя должен быть (Нет, 7, 7), а в сообщении об ошибке говорится, что уровень активации ожидает именно такой 3D-вход, почему плотный слой на самом деле выводит тензор формы (39000,7)
как в соответствии с сообщением об ошибке? Я понимаю, что слой flatten () решает эту проблему, помещая все в 2D, но я не понимаю, почему он не работает без него.