Почему выходные данные моего слоя не соответствуют размерам, указанным в сводке по моей модели? - PullRequest
0 голосов
/ 17 января 2019

Мне удалось создать успешный 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, но я не понимаю, почему он не работает без него.

1 Ответ

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

В вашем сообщении об ошибке вы видите, что ошибка возникает при проверке размеров target . Выходные данные вашей модели без выровненного слоя имеют форму (None, 7, 7), которая правильно отображается в сводке модели. Проблема здесь в том, что ваши метки имеют форму (None, 7), поэтому Keras выбрасывает ValueError (вероятно, при обратном распространении), поскольку ваши метки имеют на одно измерение меньше, чем выходные данные вашей сети. Керас ожидал, что (None, 7, 7) от ярлыков будет соответствовать размерам вашего слоя активации, но вместо этого получил (None, 7).

Именно поэтому использование model.add(Flatten()) перед добавлением плотного слоя работает нормально, так как целевые размеры и выходные параметры равны (None, 7).

...