1

我正在尝试进行 Keras 分类。我有 1043 个单词,表示为 one-hot 编码矩阵(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轨道上,但我无法让它工作。

4

1 回答 1

3

在. Flatten()_ RNN因为你有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 模型,如 a GRU,并使用Embedding带有预训练词向量的层,如来自 的那些GLoVE。不使用预训练的词嵌入会导致在小数据集上的验证性能很差。您可以看到这个 SO 答案以帮助使用这些嵌入。您可能还想查看keras 的功能 API - 它更好。

于 2019-05-02T23:01:39.700 回答