使用Tensorflow后端在Keras中实现双编码器LSTM



双编码器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)

相关内容

最新更新