以下是Tensorflow NN训练部分的2个代码模式。
我发现使用模型1是合乎逻辑的。但是我经常在多个地方看到模型2。我觉得Model 2是错误的。对于相同数据的每次迭代,模型是否都会在会话中运行两次图形?我是否缺少某些东西,人们是否会出于其他任何原因呢?
模型1
for epoch in range(epochs):
for iteration in range(num_tr_iter):
_, loss, accuracy = sess.run([optimizer, loss, accuracy], feed_dict)
模型2
for epoch in range(epochs):
for iteration in range(num_tr_iter):
sess.run(optimizer, feed_dict)
loss, accuracy = sess.run([loss, accuracy],feed_dict)
编辑:正在扩展问题以更加清楚
如果下面的sess.run()执行优化器节点,它将执行其所有从属节点。它将同时运行底层的convnet和loss函数。
sess.run(optimizer, feed_dict)
接下来,如果下面的sess.run()执行损失节点,为什么不使用当前权重执行convnet。我并不是在推断它将再次运行优化。即使达到当前损失,张量流也不会执行卷积并计算损失吗?
loss, accuracy = sess.run([loss, accuracy],feed_dict)
答案 0 :(得分:1)
Session.Run
将仅运行计算第一个参数中指定的图形元素。
因此,在模型2中,sess.run(optimizer, feed_dict)
仅对模型应用权重更新,而loss, accuracy = sess.run([loss, accuracy],feed_dict)
仅在权重更新后计算模型的损失和准确性。由于这些操作彼此独立,因此整个计算不会运行两次。
请注意,Session.Run docs提到:
在调用中评估...操作的顺序是不确定的。
因此,模型1甚至可能无法给出准确的损失和准确性,因为不清楚是在重量更新之前还是之后进行测量。 (实际上,这可能很好)
答案 1 :(得分:0)
在模型2中,第一行代码在模型上运行优化器,第二行计算损失和准确性。它没有两次运行图形。
模型1和模型2本质上是相同的,但为简洁起见,请注意模型1。