Tensorflow在同一迭代中有多个session.run()

时间:2018-10-30 06:06:36

标签: python tensorflow neural-network

以下是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)

2 个答案:

答案 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。