【问题标题】:LSTM Followed by Mean Pooling (TensorFlow)LSTM 后跟均值池 (TensorFlow)
【发布时间】:2017-09-04 16:02:57
【问题描述】:

我知道LSTM Followed by Mean Pooling 有一个类似的主题,但那是关于 Keras 的,我在纯 TensorFlow 中工作。

我有一个 LSTM 网络,其中循环由以下人员处理:

outputs, final_state = tf.nn.dynamic_rnn(cell,
                                         embed,
                                         sequence_length=seq_lengths,
                                         initial_state=initial_state)

我为每个样本传递正确的序列长度(用零填充)。在任何情况下,输出都包含不相关的输出,因为根据序列长度,某些样本会产生比其他样本更长的输出。

现在我正在通过以下方法提取最后一个相关输出:

def extract_axis_1(data, ind):
    """
    Get specified elements along the first axis of tensor.
    :param data: Tensorflow tensor that will be subsetted.
    :param ind: Indices to take (one for each element along axis 0 of data).
    :return: Subsetted tensor.
    """

    batch_range = tf.range(tf.shape(data)[0])
    indices = tf.stack([batch_range, ind], axis=1)
    res = tf.reduce_mean(tf.gather_nd(data, indices), axis=0)

我将sequence_length - 1 作为索引传递。关于最后一个主题,我想选择所有相关输出,然后选择平均池,而不是只选择最后一个。

现在,我尝试将嵌套列表作为索引传递给 extract_axis_1,但 tf.stack 不接受。

有什么解决方法吗?

【问题讨论】:

  • “相关输出”是什么意思?通常,您训练网络也预测“STOP”符号:您的实际输出是“GO”符号和“STOP”符号之间的内容。 “相关输出”过滤后你打算做什么?
  • 我的意思是可能有 100 个输出(展开单元的数量),但输入序列的大小仅为 10。我想要对应于这 10 个输入/单元的输出。在获得这些之后,我想对它们进行平均,然后预测一个二元类(带有一个简单的全连接层)。现在我正在尝试使用唯一的最后一个相关输出,但事实证明这很难。

标签: tensorflow lstm pooling rnn


【解决方案1】:

你可以利用tf.contrib.seq2seq.sequence_loss函数的weight参数。

来自文档:

weights:形状张量 [batch_size, sequence_length] 和 dtype float。权重构成序列中每个预测的权重。使用 weights 作为掩码时,将所有有效时间步设置为 1,将所有填充时间步设置为 0,例如tf.sequence_mask 返回的掩码。

您需要计算一个二进制掩码来区分有效输出和无效输出。然后你可以把这个掩码提供给损失函数的weights 参数(可能你会想要使用这样的损失);该函数在计算损失时不会考虑权重为 0 的输出。

如果您不能/不需要使用序列丢失,您可以手动执行完全相同的操作。你计算一个二进制掩码,然后将你的输出乘以这个掩码,并将这些作为输入提供给你的全连接层。

【讨论】:

  • 现在我只使用最后一个相关的输出。由于仅使用该相关输出计算损失,我真的不需要屏蔽我的输出。我错了吗?
  • 但是你说你想尝试所有相关的输出,而不仅仅是最后一个
  • 没错,但由于我想对它们进行平均(在时间轴上),无论如何我都必须在计算损失之前进行掩蔽。
  • 无论如何都需要加权。您应该执行以下操作:avg(output*mask) / sum(mask)。但是,请考虑使用所有输出,而不仅仅是它们的平均值。这是完全不同的。平均会使您丢失预测的时间信息。
  • 我认为你的观点很好。所以mask 基本上是包含 1 和 0 的张量(然后 * 表示 tf.matmul())?
猜你喜欢
  • 2016-07-25
  • 1970-01-01
  • 2018-12-28
  • 2019-04-10
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多