我正在关注TensorFlow的一个暹罗CNN .

CNN结构包括由两个CNN共享权重共享的嵌入查找表 . 网络的输入是两个矩阵,两个矩阵都包含用于问题和答案的索引(batch_size x sentence_length):

self.input_q = tf.placeholder(tf.int32, [None, sentence_length], name="input_q")
self.input_a = tf.placeholder(tf.int32, [None, sentence_length], name="input_a")

在嵌入每个句子(来自输入矩阵的行)之后,我最终得到两个尺寸的张量(问题和答案):batch_size x sentence_lentgh x embedding_size .

让我们暂时忘记批量维度,以使事情变得更容易 . 这就是说,我们有两个矩阵Qemb和Aemb,都是 sentence_lentgh x embedding_size . 从这两个矩阵我想构建第三个矩阵,用于后验可学习注意特征矩阵的注意矩阵 A ,使用numpy将定义如下:

A[i,j] = 1.0 / (1.0 + np.linalg.norm(Qemb[i,:]-Aemb[j,:]))

这个矩阵是为每个输入对构建的,所以应该是图的一部分,但显然这不能在TensorFlow中完成,因为Tensor的索引没有 asingn 操作 . 我对吗?我认为我可以运行ops来嵌入问题和答案,在给定computedembeddings的情况下在图表外部构建A矩阵,然后将A矩阵反馈给图表以继续基于它的下一个操作 .

self.attention_matrix = \
   tf.placeholder(tf.float32,
                  [None, sentence_length, sentence_length], 
                  name = "Attention_matrix")

我可能没有意识到这种方法有什么问题吗? (两次运行embeddings ops的公寓,看起来不是最优的,但不是什么大不了的事)