【问题标题】:Tensorflow multiple session.run( ) in same iteration同一迭代中的 TensorFlow 多个 session.run()
【发布时间】:2019-04-03 03:23:14
【问题描述】:

以下是 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() 执行优化器节点,它将执行其所有依赖节点。它还将运行底层的卷积网络和损失函数。

    sess.run(optimizer, feed_dict)

接下来如果下面的 sess.run() 执行 loss 节点,为什么它不使用当前权重执行 convnet。我并不是在推断它会再次运行优化。就算是要得出当前的loss,tensorflow难道不会执行convnet计算loss吗?

        loss, accuracy = sess.run([loss, accuracy],feed_dict)

【问题讨论】:

    标签: python tensorflow neural-network


    【解决方案1】:

    Session.Run 只会运行计算第一个参数中给出的图形元素。

    所以在模型 2 中,sess.run(optimizer, feed_dict) 只是为模型应用权重更新,loss, accuracy = sess.run([loss, accuracy],feed_dict) 只是在权重更新后计算模型的损失和准确率。整个计算不会运行两次,因为这些操作彼此独立。

    请注意 Session.Run docs 提到:

    在调用内部计算...操作的顺序是未定义的。

    因此,模型 1 甚至可能无法给出准确的损失和准确度,因为不清楚它是在权重更新之前还是之后测量的。 (但实际上这可能没问题)

    【讨论】:

    • 在模型 1 中,优化器是 sess.run( ) 的第一个提取。在那种情况下,我们也适合模型 1 吗?
    • 根据文档,我认为我们不能假设 optimizer 仅仅因为它在列表中的第一个就被首先评估。不过,就像我上面所说的那样,在实践中它可能会证明是 - 我对Session.Run 的内部结构了解得不够多,无法真正说出来。
    【解决方案2】:

    在模型 2 中,第一行代码在模型上运行优化器,第二行计算损失和准确率。它没有运行两次图表。

    模型 1 和模型 2 本质上是相同的,但为了简洁起见,要点转到模型 1。

    【讨论】:

      猜你喜欢
      • 2020-08-13
      • 2019-10-18
      • 2014-03-11
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      相关资源
      最近更新 更多