Добавьте слой Flatten()
перед добавлением плотного слоя сразу после вывода RNN
.Поскольку у вас есть return_sequences=True
, keras будет испускать все скрытые состояния с каждого временного шага переваренной последовательности, что приведет к ошибке при отправке трехмерного тензора (batch_size, timesteps, 50)
в плотный слой.
>>> model = Sequential()
>>> model.add(SimpleRNN(50, input_shape=(20, 26), return_sequences=True))
>>> from keras.layers import Flatten
>>> model.add(Flatten())
>>> model.add(Dense(40, activation='relu'))
>>> model.add(Dense(num_categories, activation='softmax'))
>>> model.compile(loss='categorical_crossentropy', optimizer='adam')
>>> model.fit(X, Y, epochs=20, batch_size=5, verbose=1)
1043/1043 [==============================] - 3s 3ms/step - loss: -0.0735
Тем не менее, я бы порекомендовал, чтобы вместо значения return_sequences
в качестве True, вы вместо этого не включали этот параметр, и он направлялся прямо в плотный слой.Вы не решаете проблему seq2seq - для этого в основном используется return_sequences
.Вместо этого следуйте,
>>> model = Sequential()
>>> model.add(SimpleRNN(50, input_shape=(20, 26)))
>>> model.add(Dense(40, activation='relu'))
>>> model.add(Dense(num_categories, activation='softmax'))
>>> model.compile(loss='categorical_crossentropy', optimizer='adam')
>>> model.fit(X, Y, epochs=20, batch_size=5, verbose=1)
Epoch 1/20
910/1043 [=========================>....] - ETA: 0s - loss: -0.3609
Окончательные рекомендации будут использовать другую модель RNN, такую как GRU
, а также использовать слой Embedding
с предварительно обученными векторами слов, такими какот GLoVE
.Неиспользование предварительно обученных вложений слов приведет к снижению производительности проверки на небольших наборах данных.Вы можете увидеть этот SO-ответ , чтобы помочь с использованием этих вложений.Вы также можете проверить функциональность keras API - лучше.