TensorFlow中sess.run仅取optimizer与同时取cost和optimizer的差异
关于TensorFlow中
sess.run(optimizer)与sess.run([cost, optimizer])的区别 这是个很棒的问题,很多刚接触TensorFlow的同学都会有这个疑惑!咱们一步步拆解清楚:
首先得明白optimizer = tf.train.AdagradOptimizer(1.0).minimize(cost)到底做了什么:minimize()方法其实是两步操作的封装——先计算cost相对于模型参数的梯度,再用梯度去更新参数。所以optimizer本身是依赖cost的,当你调用sess.run(optimizer)时,TensorFlow确实会先计算cost(为了求梯度),但这个cost的计算结果不会返回给你,只是在内部完成了梯度计算和参数更新的流程。
那为什么要写sess.run([cost, optimizer])呢?这完全不是冗余,反而很实用:
- 当我们需要监控训练进度时(比如打印当前的损失值、绘制loss曲线),就需要拿到
cost的具体数值。如果只runoptimizer,虽然cost被计算了,但你获取不到这个结果;把cost放进run的列表里,就能一次性得到当前的损失值,同时完成参数更新。 - 更重要的是:TensorFlow的计算图会自动复用依赖项,这里
cost只会被计算一次——既用来给optimizer计算梯度,又把结果返回给你,完全不会重复计算,效率反而比分开sess.run(cost)再sess.run(optimizer)要高(分开两次run的话,cost会被计算两次,纯粹浪费算力)。
总结一下:
- 如果只是单纯训练模型,不需要监控损失,用
sess.run(optimizer)就足够了; - 如果需要跟踪损失变化,就用
sess.run([cost, optimizer]),这不仅不冗余,还能高效地同时获取损失值和完成参数更新。
内容的提问来源于stack exchange,提问作者SantoshGupta7
相关产品推荐
相关产品推荐

