在Keras中使用单词嵌入时,我在理解如何获得正确的输出方面遇到了问题。我的设置如下:
我的输入是形状(batch_size, sequence_length)
的批次。每一行
在批处理中代表一个句子,该单词由单词id' s表示。该
句子用零填充,使得所有句子都具有相同的长度。
例如,(3,6)
输入批处理可能如下所示:np.array([[135600],[174580],[138272]])
我的目标由输入批次向右移动一步。
因此,对于每个输入词,我想预测下一个词:np.array([[356000],[745800],[382720]])
我将这样的输入批量输入Keras嵌入层。我的嵌入
大小为100,因此输出将是形状(batch_size,
sequence_length, embedding_size)
的3D张量。所以在小例子中(3,6,100)
此3D批次送入LSTM图层
LSTM层的输出被送入Dense层
(sequence_length)
输出具有softmax激活的神经元
功能。因此输出的形状将类似于输入的形状,即(batch_size, sequence_length)
作为一种损失,我使用输入和目标批次之间的分类交叉熵
我的问题:
输出批次将包含概率,因为 softmax激活功能。但我想要的是网络预测 整数使输出适合目标批次的整数。 我怎样才能解码"输出,以便我知道网络正在预测哪个词?或者我必须以不同方式构建网络?
修改1:
我已将输出和目标批次从2D数组更改为3D张量。因此,我现在使用的是单热编码的3D目标张量(batch_size, sequence_length)
,而不是使用具有整数id的目标批量(batch_size, sequence_length, vocab_size)
。为了获得与网络输出相同的格式,我已将网络更改为输出序列(通过在LSTM层中设置return_sequences=True
)。此外,输出神经元的数量已更改为vocab_size
,因此输出层现在生成一批大小为(batch_size, sequence_length, vocab_size)
的批次。
通过这种3D编码,我可以使用tf.argmax(outputs, 2)
获得预测的单词id。这种方法目前似乎有效,但我仍然感兴趣是否可以保持2D目标/输出
答案 0 :(得分:1)
一个解决方案,也许不是最好的解决方案,是输出字典大小的单热矢量(包括虚拟单词)。
您的上一个图层必须输出var str = '<div><span id="results">1</span></div>'
var el = document.createElement('html');
el.innerHTML = str;
console.log(el.querySelector('#results'));
。
如果你没有在(sequence_length, dictionary_size+1)
之前添加任何sequence_length
或Flatten()
,你的密集图层就会输出Reshape()
,所以它应该是Dense(dictionary_size+1)
您可以使用函数keras.utils.to_categorical()
转换单热矢量中的整数,并使用keras.backend.argmax()
将one = hot矢量转换为整数。
不幸的是,这有点像打包你的嵌入。如果有可能进行反向嵌入或类似的东西会很好。