我想为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(最大时间步长)
但是如你所知,我不能使用张量内的值作为索引,因为它们还没有被送入。
如何制作这样的体重指数?
答案 0 :(得分:0)