Tensorflow 良';s Concat校准分数问题
我一直在试图理解注意力机制是如何工作的。目前正在查看示例。我发现在示例中使用了Tensorflow 良';s Concat校准分数问题,tensorflow,tensorflow.js,Tensorflow,Tensorflow.js,我一直在试图理解注意力机制是如何工作的。目前正在查看示例。我发现在示例中使用了点产品对齐分数(from) 所以这个表达式表示为 let attention=tf.layers.dot({axes:[2,2]}).apply([decoder,encoder]); 在公园里。 解码器(hut)的形状为[10,64],编码器(hus)的形状为[12,64],因此结果的形状为[10,12]。到目前为止还不错 现在,我正在尝试实现concat对齐分数,如下所示 因此,首先要做的是将hut和hus连接
点产品对齐分数
(from)
所以这个表达式表示为
let attention=tf.layers.dot({axes:[2,2]}).apply([decoder,encoder]);
在公园里。
解码器(hut
)的形状为[10,64],编码器(hus
)的形状为[12,64],因此结果的形状为[10,12]。到目前为止还不错
现在,我正在尝试实现concat对齐分数
,如下所示
因此,首先要做的是将hut
和hus
连接起来。然而,它们有不同的形状,所以我不知道如何继续。我应该以某种方式重塑张量吗?如果是的话,它的形状是什么
我一直在谷歌上搜索,想知道其他人是如何做到这一点的
#对于concat评分,首先连接解码器隐藏状态和编码器输出
out=torch.tanh(self.fc(解码器隐藏+编码器输出))
但这似乎不正确,因为它们对值求和,而不是串联
任何指导都将不胜感激
更新以下是模型摘要:
__________________________________________________________________________________________________
Layer (type) Output shape Param # Receives inputs
==================================================================================================
input1 (InputLayer) [null,12] 0
__________________________________________________________________________________________________
embedding_Embedding1 (Embedding [null,12,64] 2240 input1[0][0]
__________________________________________________________________________________________________
input2 (InputLayer) [null,10] 0
__________________________________________________________________________________________________
lstm_LSTM1 (LSTM) [null,12,64] 33024 embedding_Embedding1[0][0]
__________________________________________________________________________________________________
embedding_Embedding2 (Embedding [null,10,64] 832 input2[0][0]
__________________________________________________________________________________________________
encoderLast (GetLastTimestepLay [null,64] 0 lstm_LSTM1[0][0]
__________________________________________________________________________________________________
lstm_LSTM2 (LSTM) [null,10,64] 33024 embedding_Embedding2[0][0]
encoderLast[0][0]
encoderLast[0][0]
__________________________________________________________________________________________________
dot_Dot1 (Dot) [null,10,12] 0 lstm_LSTM2[0][0]
lstm_LSTM1[0][0]
__________________________________________________________________________________________________
attention (Activation) [null,10,12] 0 dot_Dot1[0][0]
__________________________________________________________________________________________________
context (Dot) [null,10,64] 0 attention[0][0]
lstm_LSTM1[0][0]
__________________________________________________________________________________________________
concatenate_Concatenate1 (Conca [null,10,128] 0 context[0][0]
lstm_LSTM2[0][0]
__________________________________________________________________________________________________
time_distributed_TimeDistribute [null,10,64] 8256 concatenate_Concatenate1[0][0]
__________________________________________________________________________________________________
time_distributed_TimeDistribute [null,10,13] 845 time_distributed_TimeDistributed1
==================================================================================================
Total params: 78221
Trainable params: 78221
Non-trainable params: 0
__________________________________________________________________________________________________
首先,要使
tf.layers.dot工作,两个输入应该具有相同的形状
要执行串联,可以使用tf.concat([hut,hus])
。新形状将取决于在其上执行连接的轴
假设h\u t
和h\u s
都具有[a,b]
形状,如果在轴0上进行连接,则新形状将是[2a,b]
,如果在轴1上进行连接,则生成的形状将是[a,2b]
然后,您可以将tf.tanh
应用于输入,或者创建一个自定义层来为您执行此操作
更新:
由于tf.layers.dot是在第二个轴(轴=1)上不匹配的3d数据上执行的,因此只能在该轴上进行连接,结果形状将是[1,10+12,64]
>首先,对于tf.layers.dot来说,两个输入都应该具有相同的形状。在这种情况下,我变得更加困惑。(我已经更新了原始问题并添加了模型摘要。)查看模型,它说dot_Dot1(dot)
接收作为输入的lstm_LSTM1
和lstm_LSTM2
,其形状为[null,12,64]和[null,10,64]。你能解释一下这里发生了什么吗?在这种情况下它是有效的,因为它是在3d张量上执行的,而之前没有指出批量大小。可以在第二个轴(轴=1)上进行混凝土浇筑。生成的形状将是[1,22,64]您是对的,我没有指定batchsize。对不起。然而,我仍然对concat感到困惑。我的意思是,dot score
对我来说很有意义,因为我正在沿着编码器和解码器的LSTM功能执行点积。这意味着我将它们的特征“混合”成一个([batch_size,10,12])张量。但是,在concat score
中,如果我将它们堆叠成一个[batch_size,22,64],那么这些特性之间就没有“混合”。所以我觉得这不对。。。但我仍然在学习,所以我可能遗漏了一些东西,我说不出背后的数学原因。也许你需要阅读使用concat对齐的论文,我已经读了10遍了。但是这篇论文没有解释这些老年退休金计划背后的原因。作者说他们已经测试了3种不同的分数函数,就这样。无论如何,非常感谢你抽出时间。