Keras SimpleRNN - PullRequest
       14

Keras SimpleRNN

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

Я пытаюсь сделать классификацию Керас.У меня есть 1043 слова, представленные в виде горячих закодированных матриц (20 букв длиной по 26 возможностей для каждой буквы).Каждый из них принадлежит к одной из 19 различных категорий.

X.shape >>>>>> (1043, 20, 26)
Y.shape >>>>>> (1043, 19)

Вот моя попытка построить модель.

model = Sequential()
model.add(SimpleRNN(50, input_shape=(20, 26), return_sequences=True))

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)

Эта ошибка говорит: ValueError: Error when checking target: expected dense_91 to have 3 dimensions, but got array with shape (1043, 19)

Мне кажется, что я упускаю что-то очевидное в поле input_shape, или есть какой-то другой трюк с настройкой?Я не смог найти в Интернете и четких примеров подобных проблем.


Обновление: я подозреваю, что мне нужно свернуть временные рамки в один окончательный ответ, но я не уверен, каксделай это.TimeDistributed кажется, что он на правильном пути, но я не могу заставить его работать.

1 Ответ

2 голосов
/ 03 мая 2019

Добавьте слой 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 - лучше.

...