是否可以调用丢失函数的TensorFlow最佳实践(以函数的形式)?除了Eager Execution兼容性之外的其他优点?

时间:2018-06-05 22:15:11

标签: tensorflow

Eager Execution要求传递给任何优化器的任何损失都是callabe,即以函数的形式。

所以这没关系

def loss_function():
    return tf.reduce_mean( tf.nn.sampled_softmax_loss(weights=softmax_weights, biases=softmax_biases, inputs=averaged_embeds,
                               labels=train_labels, num_sampled=num_sampled, num_classes=vocabulary_size))

但这不行

loss = tf.reduce_mean(
    tf.nn.sampled_softmax_loss(weights=softmax_weights, biases=softmax_biases, inputs=averaged_embeds,
                               labels=train_labels, num_sampled=num_sampled, num_classes=vocabulary_size))

并会引发此错误

`loss` passed to Optimizer.compute_gradients should be a function when eager execution is enabled.

我注意到,通常当新的Tensorflow功能需要某种练习时,即使不使用该功能,通常也会有多个与该要求相关的好处。例如,Eager执行还需要get_variable来定义变量。据我所知,没有理由使用variable而不是get_variable

除了使用Eager Execution之外,还有其他可以调用的功能吗?

1 个答案:

答案 0 :(得分:0)

关于损失问题(Akshay总结了问题评论中的变量问题):

构建图表时,Tensor的行为类似于futures,这就是Optimizer方法使用它的方式。然后可以在训练循环中多次评估此未来,并监控评估以生成梯度(通过向图中添加一组操作来查看中间值)。

Tensors是急切执行时的字面值,因此要获得相同的行为,需要将其包装在一个函数中(然后使用tf.GradientTape活动来运行以跟踪渐变)。

至于它是否是最佳实践,新的TensorFlow代码是图形/急切不可知的是一件好事,尽管编写不可知的训练循环通常比它的价值更多的努力。通常使用Tensors作为期货可能有点难以推理。