为了账号安全,请及时绑定邮箱和手机立即绑定

使用 word2vec 作为 tensorflow 输入的 LSTM 的可变句子长度

使用 word2vec 作为 tensorflow 输入的 LSTM 的可变句子长度

沧海一幻觉 2021-06-27 12:51:43
我正在使用 word2vec 作为输入构建 LSTM 模型。我正在使用张量流框架。我已经完成了词嵌入部分,但我仍然坚持使用 LSTM 部分。这里的问题是我有不同的句子长度,这意味着我必须进行填充或使用具有指定序列长度的 dynamic_rnn 。我和他们两个都在挣扎。填充。填充的令人困惑的部分是当我做填充时。我的模型就像word_matrix=model.wv.syn0X = tf.placeholder(tf.int32, shape)data = tf.placeholder(tf.float32, shape)data = tf.nn.embedding_lookup(word_matrix, X)然后,我将 word_matrix 的单词索引序列输入 X。我担心如果我将零填充到输入 X 的序列中,那么我会错误地继续输入不必要的输入(在本例中为 word_matrix[0])。所以,我想知道 0 填充的正确方法是什么。如果您让我知道如何使用 tensorflow 实现它,那就太好了。dynamic_rnn 为此,我声明了一个包含所有句子长度的列表,并在结尾处将它们与 X 和 y 一起提供。在这种情况下,我不能批量输入输入。然后,我遇到了这个错误(ValueError: as_list() is not defined on an unknown TensorShape.),在我看来,sequence_length 参数只接受列表?(虽然我的想法可能完全不正确)。以下是我的代码。X = tf.placeholder(tf.int32)labels = tf.placeholder(tf.int32, [None, numClasses])length = tf.placeholder(tf.int32)data = tf.placeholder(tf.float32, [None, None, numDimensions])data = tf.nn.embedding_lookup(word_matrix, X)lstmCell = tf.contrib.rnn.BasicLSTMCell(lstmUnits, state_is_tuple=True)lstmCell = tf.contrib.rnn.DropoutWrapper(cell=lstmCell, output_keep_prob=0.25)initial_state=lstmCell.zero_state(batchSize, tf.float32)value, _ = tf.nn.dynamic_rnn(lstmCell, data, sequence_length=length,                             initial_state=initial_state, dtype=tf.float32)我在这部分很挣扎,因此非常感谢任何帮助。
查看完整描述

1 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

Tensorflow 不支持可变长度的 Tensor。所以当你声明一个 Tensor 时,list/numpy 数组应该有一个统一的形状。

  1. 从您的第一部分开始,我了解到您已经能够在序列长度的最后一个时间步长中填充零。这才是理想的情况。这是它应该如何寻找批量大小为 4、最大序列长度为 10 和 50 个隐藏单元的方法 ->

    [4,10,50] 将是整个批次的大小,但在内部,当您尝试可视化填充时,它的形状可能是这样的 ->

    `[[5+5pad,50],[10,50],[8+2pad,50],[9+1pad,50]`

    每个垫将代表一个序列长度为 1 的隐藏状态大小为 50 张量。全都充满了零。看看这个问题,并且这其中更多地了解垫手动如何。

  2. 您将使用动态 rnn 的确切原因是您不想在填充序列上计算它。该tf.nn.dynamic_rnn API将确保通过传递的sequence_length参数。

    对于上面的示例,该参数将是:[5,10,8,9]对于上面的示例。您可以通过对每个批处理组件的非零实体求和来计算它。一种简单的计算方法是:

    data_mask = tf.cast(data, tf.bool)
    data_len = tf.reduce_sum(tf.cast(data_mask, tf.int32), axis=1)

    并将其传递到tf.nn.dynamic_rnnapi 中:

    tf.nn.dynamic_rnn(lstmCell, data, sequence_length=data_len, initial_state=initial_state)



查看完整回答
反对 回复 2021-06-29
  • 1 回答
  • 0 关注
  • 319 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信