【问题标题】:When does Tensorflow update weights and biases?Tensorflow 什么时候更新权重和偏差?
【发布时间】:2017-07-15 05:11:30
【问题描述】:

tensorflow 何时更新 for 循环中的权重和偏差?

以下是来自 tf 的 github 的代码。 mnist_softmax.py

for _ in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
  1. tensorflow 何时更新权重和偏差?
  2. 在运行sess.run() 时会更新它们吗?如果是这样,是否意味着在这个程序中,tf 更新权重和偏差 1000 次?
  3. 还是在完成整个 for 循环后更新它们?
  4. 如果 2. 正确,我的下一个问题是,tf 是否每次都使用不同的训练数据更新模型(因为它使用 next_batch(100)。总共有 1000*100 个训练数据点。但所有数据点都是仅单独考虑一次。我是正确的还是我误解了什么?
  5. 如果 3. 是正确的,那么在仅仅一个更新步骤之后,模型就被训练出来了,这很奇怪吗? 我想我一定是误解了什么,如果有人能给我提示或参考一些材料,那就太好了。

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:
    1. 每次运行 train_step 时都会更新权重。
    2. 是的,它在这个程序中更新权重 1000 次。
    3. 见上文
    4. 是的,你是对的,它一次加载一个包含 100 个点的小批量并使用它来计算梯度。
    5. 一点也不奇怪。您不一定需要一次又一次地查看相同的数据,所需要的只是您有足够的数据使网络能够收敛。如果需要,您可以对相同的数据进行多次迭代,但由于该模型没有很多参数,因此它会在一个 epoch 内收敛。

    Tensorflow 通过创建计算网络输出所需的计算图来工作。每个基本操作,如矩阵乘法、加法,你能想到的任何东西都是这个计算图中的节点。在您遵循的 tensorflow mnist 示例中,40-46 行定义了网络架构

    • x:占位符
    • y_:占位符
    • W:变量 - 这是在训练期间学习的
    • b:变量 - 这也是在训练期间学习的

    该网络表示一个简单的线性回归模型,其中使用 y = W*x + b 进行预测(参见第 43 行)。

    接下来,为您的网络配置训练过程。此代码使用交叉熵作为损失函数来最小化(见第 57 行)。最小化是使用梯度下降算法完成的(见第 59 行)。

    此时,您的网络已完全构建。现在您需要运行这些节点,以便执行实际计算(到目前为止尚未执行任何计算)。

    在执行 sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 的循环中,tf 计算 train_step 的值,这导致 GradientDescentOptimizer 尝试最小化 cross_entropy,这就是训练的进展方式。

    【讨论】:

    • 为什么不需要一遍又一遍地训练相同的数据集?总共有 1000*100 个数据,我认为它需要一次又一次地迭代整个数据集,直到达到局部最小值。我说的对吗?
    • @ZianLai 你不一定需要一次又一次地看到相同的数据,只需要你有足够的数据让网络收敛。如果需要,您可以对相同的数据进行多次迭代,但由于该模型没有很多参数,因此它会在一个 epoch 中收敛。
    • @LakshayGarg 如何在每次迭代中访问更新权重?如果我在每次迭代中使用 weights.eval(),它会在运行会话之前给我默认值。
    猜你喜欢
    • 2019-12-29
    • 2017-02-26
    • 2019-08-29
    • 1970-01-01
    • 2017-12-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多