我想为tf.nn.seq2seq.sequence_loss_by_example做重量张量。我使用的是最大100步的RNN,并且用最大的步骤(100)将每个批处理项目进行零填充。
我的日志和标签的形状都是这样的。
Tensor("dropout/mul_1:0", shape=(50000, 168), dtype=float32) # logits
Tensor("ArgMax:0", shape=(500, 100), dtype=int64) # labels50000是500(batch_size) * 100(num_steps),168个是类数,我将它们像Tensorflow提供的ptb_word_lm.py代码一样传递给sequence_loss_by_example。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)])但是,由于我的逻辑和标签都是零填充的,所以损失是不正确的.从这个答案,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,它们也用于sequence_length中的tf.nn.rnn()。
我可以想到的一种方法是迭代x_len,并在每个权重中使用每一项作为最后1的索引。
0 0 0.0 0 0 => 1 1.1 0 0 0 尺寸为100的重量张量(最大时间步长)
但是正如你所知道的,我不能使用张量内的值作为指数,因为它们还没有被喂入。
我怎么能做这样的重量张量呢?
发布于 2016-10-03 06:22:31
使用tensorflow creating mask of varied lengths和rnn.py解决了问题。我可以为每一个最大的步骤建立索引,并屏蔽它们。
https://stackoverflow.com/questions/39772033
复制相似问题