双编码器LSTM
我想在TensorFlow Keras API中实现这个模型。我对如何在Keras中实现sigmoid(CMR(函数感到困惑。如何合并LSTM和计算上述函数的输出?
RNN在这里的意思是LSTM
C和R是由两个LSTM编码到固定维度的句子。然后,它们通过一个函数sigmoid(CMR(。我们可以假设R和C都是256维矩阵,M是256*256矩阵。矩阵M是在训练过程中学习的。
假设只考虑LSTM的最终输出,而不考虑整个序列,则每个LSTM模型的输出形状为(batch_size,256(。
现在,我们有以下矢量及其形状:
C:(batch_size,256(
R: (batch_size,256(
M: (256256(。
最简单的情况是batch_size = 1
。然后,
C:(1256(
R: (1256(
因此,从数学上讲,CTMR实际上是CMRT,并给你一个形状向量(1,1(,它可以用任意数量的维度表示。
在代码中,这很简单:
def compute_cmr(c, m, r):
r = tf.transpose(r, [1, 0])
output = tf.matmul(c, m)
output = tf.matmul(output, r)
return output
然而,如果您的batch_size
大于1,事情可能会变得棘手。我的方法(使用热切执行(是沿着批处理轴展开,单独处理,然后重新堆叠。这可能不是最有效的方法,但它工作完美,时间开销通常可以忽略不计。
以下是您的操作方法:
def compute_cmr(c, m, r):
outputs = []
c_list = tf.unstack(c, axis=0)
r_list = tf.unstack(r, axis=0)
for batch_number in range(len(c_list)):
r = tf.expand_dims(r_list[batch_number], axis=1)
c = tf.expand_dims(c_list[batch_number], axis=0)
output = tf.matmul(c, m)
output = tf.matmul(output, r)
outputs.append(output)
return tf.stack(outputs, axis=0)