Stay Hungry.Stay Foolish.

TensorFlow Notes

tf.nn.softmax_cross_entropy_with_logits_v2

反向传播会同时对 logitslabels 起作用, 要禁止反向传播对 labels 起作用,将 labels 传递给 tf.stop_gradients 即可:

tf.nn.softmax_cross_entropy_with_logits_v2(
                    labels=tf.stop_gradient(labels),
                    logits=logits
                )

tf.nn.softmax_cross_entropy_with_logits

反向传播会同时只会对 logits 作用,该方法已弃用 。

解释:
在监督学习中,labels 可以视为常量,不参与方向传播,只需要调整权重来拟合 labels。但有些情况(如对抗神经网络labels 可能来自不同的地方,因此引入tf.nn.softmax_cross_entropy_with_logits_v2

tf.identity

tf.identity 官方注释为:Return a tensor with the same shape and contents as input.

tf.identity is useful when you want to explicitly transport tensor between devices (like, from GPU to a CPU). The op adds send/recv nodes to the graph, which make a copy when the devices of the input and the output are different.

另,如果想 y 在每次执行(evaluated)之前对 x 加1,可能你会这样写:

x = tf.Variable(0.0)
x_plus_1 = tf.assign_add(x, 1)

with tf.control_dependencies([x_plus_1]):
    y = x
init = tf.initialize_all_variables()

with tf.Session() as session:
    init.run()
    for i in xrange(5):
        print(y.eval())

但是结果输出为 0, 0, 0, 0, 0。因为 control_dependencies 块并没有添加新的节点,但是可以使用 tf.identity 实现:

x = tf.Variable(0.0)
x_plus_1 = tf.assign_add(x, 1)

with tf.control_dependencies([x_plus_1]):
    y = tf.identity(x)
init = tf.initialize_all_variables()

with tf.Session() as session:
    init.run()
    for i in xrange(5):
        print(y.eval())

这次结果输出为:1, 2, 3, 4, 5。
再例如:

with tf.control_dependencies([loss_averages_op]):
  total_loss = tf.identity(total_loss)

这样可以保证 loss_averages_optotal_loss 之前执行执行。

参考

  1. https://stats.stackexchange.com/questions/327348/how-is-softmax-cross-entropy-with-logits-different-from-softmax-cross-entropy-wi

⬆️

写的不错,帮助到了您,赞助一下主机费~

扫一扫,用支付宝赞赏
扫一扫,用微信赞赏
2018-07-13 22:11

反向传播会同时对 logits 和 labels 起作用, 要禁止反向传播对 labels 起作用,将 labels 传递给 tf.stop_gradients 即可: