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

双编码器LSTM

我想在TensorFlow Keras API中实现这个模型。我对如何在Keras中实现sigmoid(CMR)函数感到困惑,如何合并两个LSTM的输出并计算上述函数?如何合并两个LSTM的输出并计算上述函数?

这里的RNN指的是LSTM

C和R是由两个LSTM编码成固定维度的句子。然后将它们通过一个函数sigmoid(CMR)。我们可以假设R和C都是256维的矩阵,M是一个256*256的矩阵。矩阵M是在训练过程中学习的。

解决方案:

假设你只考虑LSTMs的最终输出,而不是整个序列,每个LSTM模型的输出形状将是(batch_size, 256)。

现在,我们有以下向量和它们的形状。

C: (batch_size, 256)

R: (batch_size, 256)

M: (256, 256).

最简单的情况是 batch_size = 1. 那么..,

C: (1, 256)

R: (1, 256)

所以,在数学上,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)

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何在visual studio ide扩展自定义中调用自定义函数?

2022-9-8 14:29:43

未分类

divs在容器div中的水平排列不稳定。

2022-9-8 14:29:45

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索