我一直无法找出RNN编码器架构的尺寸。我了解LSTM的工作原理,但我正在努力在Keras实施这一工作。在查看文档并读取Q& AS之后,看起来网络输出的尺寸必须匹配整个目标集的尺寸(而不是特定的目标 - 这是没有意义的)。我敢肯定,我已经阅读了错误,而是需要适合给定XI的目标的维度(暂时搁置批次问题)。经过几个小时的摆弄,我更加困惑。我认为我将输入嵌入到RNN而不嵌入输出的事实可能与之有关,我可能需要将网络沿途中的某个地方弄平。
这是设置:
- 数据集是大量的Q&一对。我正在与1440对样品以建立基础架构。
- XI:"美国的首都是什么?"
- yi:"我认为首都是华盛顿"
- 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)
其他详细信息:
- 麦克斯伦:输入和输出序列的最大长度为95
- embed_size:单词嵌入的维度为100
- vocabulary_size:词汇的大小为4046
您遇到的一个问题是您当前没有构建编码器模型。目前,您尝试培训模型,这会引起问题,而不是立即回答。对于编码器解码器模型,您需要构建两个模型。第一个模型必须将输入映射到编码状态。然后,第二个模型应该学会采用此编码状态,获取已经回答的部分并给您下一个单词。
您可以在此处找到示例KERAS代码。