硬简单RNN

Keras SimpleRNN

我正在尝试进行 Keras 分类。我有 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 似乎是在正确的轨道上,但我无法让它工作。

RNN 的输出之后添加密集层之前添加一个 Flatten() 层。因为你有 return_sequences=True,keras 会从消化序列的每个时间步发出所有隐藏状态,从而在将 3 维 (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 and also use an Embedding layer with pre-trained word vectors like those from GLoVE. Not using pre-trained word embeddings will result in poor validation performance on small data sets. You can see this SO answer to help with using those embeddings. You may also want to check out keras' functional API - 这样更好。