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之外,还有其他可以调用的功能吗?
答案 0 :(得分:0)
关于损失问题(Akshay总结了问题评论中的变量问题):
构建图表时,Tensor
的行为类似于futures,这就是Optimizer
方法使用它的方式。然后可以在训练循环中多次评估此未来,并监控评估以生成梯度(通过向图中添加一组操作来查看中间值)。
Tensors是急切执行时的字面值,因此要获得相同的行为,需要将其包装在一个函数中(然后使用tf.GradientTape
活动来运行以跟踪渐变)。
至于它是否是最佳实践,新的TensorFlow代码是图形/急切不可知的是一件好事,尽管编写不可知的训练循环通常比它的价值更多的努力。通常使用Tensors作为期货可能有点难以推理。