我一直无法弄清楚 RNN 编码器-解码器架构的尺寸。我了解 LSTM 的工作原理,但我正在努力在 Keras 中实现这个。在查看文档并阅读问答后,看起来网络输出的维度必须与整个目标集的维度相匹配(而不是特定目标——这没有意义)。我确定我读错了,它需要仅适合给定 xi 的目标尺寸(暂时搁置批次问题)。经过几个小时的摆弄,我更加困惑。我认为我将输入嵌入到 RNN 而不是嵌入输出这一事实可能与此有关,并且我可能需要在此过程中将网络展平。
这是设置:
- 数据集是大量的问答对。我正在使用 1440 对样本来构建基础设施。
- xi:“美国的首都是哪里?”
- 易:“我认为首都是华盛顿”
- 在 NLP 之后,有两个 numpy 数组——一个用于 X,一个用于 Y。每一行对应于原始数据集中的一行,例如:
- 已处理 xi: [253, 8, 25, 208, 28, 1]
- 处理后的 yi: [827, 10, 25, 208, 8, 198]
- 输入序列有一个嵌入层(使用手套算法),但我认为输出序列没有必要。
这是代码:
model = Sequential()
model.add(Embedding(vocabulary_size, embed_size, input_length = maxlen, weights=[embedding_matrix]))
model.add(Bidirectional(LSTM(embed_size, return_sequences=True)))
model.add(LSTM(embed_size, return_sequences=True))
if dropout < 1.0:
model.add(Dropout(dropout))
model.add(TimeDistributed(Dense(embed_size, activation='softmax')))
# model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(X_itrain, y_train, batch_size=32, epochs=1)
这是网络摘要:
Layer (type) Output Shape Param #
embedding_29 (Embedding) (None, 95, 100) 404600
bidirectional_12 (Bidirectio (None, 95, 200) 160800
lstm_45 (LSTM) (None, 95, 100) 120400
time_distributed_18 (TimeDis (None, 95, 100) 10100
Total params: 695,900 Trainable params: 695,900 Non-trainable params:
这是错误:
ValueError: Error when checking target: expected time_distributed_18 to have 3 dimensions, but got array with shape (1440, 95)
其他详情:
- maxlen:输入和输出序列的最大长度为 95
- embed_size:词嵌入的维数为100
- 词汇大小:词汇的大小是4046