tensorflow sequence_loss_by_example weight

时间:2016-09-29 13:43:22

标签: python numpy tensorflow

我想为tf.nn.seq2seq.sequence_loss_by_example制作权重张量。 我使用最多100步的RNN-LSTM,并按最大步数(100)对每个批次项进行零填充。

我的logits和标签的形状是这样的。

Tensor("dropout/mul_1:0", shape=(50000, 168), dtype=float32) # logits
Tensor("ArgMax:0", shape=(500, 100), dtype=int64)            # labels

50000用于500(batch_size)* 100(num_steps),168是类的数量,我将它们传递给sequence_loss_by_example,就像Tensorflow提供的ptb_word_lm.py代码一样。 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/rnn/ptb/ptb_word_lm.py

loss = tf.nn.seq2seq.sequence_loss_by_example(
            [logits],
            [tf.reshape(labels, [-1])],
            [tf.ones([cf.batch_size * cf.max_time_steps], dtype=tf.float32)])

但是,因为我的logits和标签是零填充的,所以损失是不正确的。从这个答案,https://stackoverflow.com/a/38502547/3974129,我试图将tf.ones([..])部分改为权重张量,但它们的基本条件与我的不同。

我有下面的步长信息,我在训练时喂它们。

self._x_len = tf.placeholder(tf.int64, shape=[self._batch_size])

例如,我为大小为5的批次提供长度信息[3,10,2,3,1]。它们也用于tf.nn.rnn()中的sequence_length。

我能想到的一种方法是迭代x_len,并使用每个项目作为每个权重中最后1的索引。

  

[0 0 0 0 0 .... 0 0 0] => [1 1 1 ... 1 0 0 0 0]

     

重量张量大小为100(最大时间步长)

但是如你所知,我不能使用张量内的值作为索引,因为它们还没有被送入。

如何制作这样的体重指数?

1 个答案:

答案 0 :(得分:0)