Tensorflow梯度通过while_loop

时间:2018-05-24 21:19:09

标签: python tensorflow machine-learning

我有一个张量流模型,其中图层的输出是2d张量,比如t = [[1,2], [3,4]]

下一层需要一个由此张量的每个行组合组成的输入。也就是说,我需要把它变成t_new = [[1,2,1,2], [1,2,3,4], [3,4,1,2], [3,4,3,4]]

到目前为止,我已经尝试过:

1)tf.unstack(t, axis=0)遍历它的行并将每个组合附加到缓冲区,然后t_new = tf.stack(buffer, axis=0)。当形状未指定时,这将之外,即。没有......

2)我使用了tf.while_loop来生成索引idx=[[0,0], [0,1], [1,0], [1,1]],然后生成t_new = tf.gather(t, idx)。 我的问题是:我应该在此back_prop中将True设置为False还是tf.while_loop?我只在循环中生成索引。不确定back_prop甚至意味着什么。

另外,你知道一种更好的方法来实现我的需求吗?

这是while_loop:

i = tf.constant(0)
j = tf.constant(0)
idx = tf.Variable([], dtype=tf.int32)
def body(i, j, idx):
    c = tf.concat([idx, [i, j]], axis=0)
    i, j = tf.cond(tf.equal(j, sentence_len - 1),
                   lambda: (i + 1, 0),
                   lambda: (i, j + 1))
    return i, j, c
_, _, indices = tf.while_loop(lambda i, j, _: tf.less(i, sentence_len),
                             body,
                             [i, j, idx],
                             shape_invariants=[i.get_shape(),
                                               j.get_shape(),
                                               tf.TensorShape([None])])

现在我可以t_new = tf.gather(t, indices)

但我对tf.while_loop的{​​{1}}的含义感到非常困惑 - 总的来说,特别是在这里。

2 个答案:

答案 0 :(得分:0)

在这种情况下,您可以将back_prop设为false。它不需要通过指数的计算来反向传播,因为该计算并不依赖于任何学习的变量。

答案 1 :(得分:0)

这取决于具体情况。如果要对可区分函数生成的某些功能建立索引,则需要反向传播。但是,如果您正在索引某些输入占位符或某些类型的输入数据,那么您可以将其保持为假,就像@Aaron所说的那样。