【问题标题】:Are the parameter values available outside tf.Session() in tensorflow?张量流中的 tf.Session() 之外的参数值是否可用?
【发布时间】:2018-09-02 13:39:57
【问题描述】:

我是 tensorflow 的新手,我正在关注这个教程,它正在做变分 droptout 来训练 NN https://gist.github.com/VikingPenguinYT/665769ba03115b1a0888893eaf1d4f13

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(10000):
    sess.run(train_step, {model_X: X, model_y: y})
    if i % 100 == 0:
        mse = sess.run(model_mse, {model_X: X, model_y: y})
        print("Iteration {}. Mean squared error: {:.4f}.".format(i, mse))

# Sample from the posterior.
n_post = 1000
Y_post = np.zeros((n_post, X_pred.shape[0]))
for i in range(n_post):
    Y_post[i] = sess.run(model_pred, {model_X: X_pred})

我的问题是:

(1) 我现在使用 tf.Session 来训练和评估 NN。但是如果在 sess 之外(例如,从 #Sample from theterior 开始的行),优化器训练的参数值是否仍然可用? (它们是全局变量还是 sess 中的局部变量)。或者它仍然可用,因为它使用的是相同的会话? 如果我想使用这些参数来评估我的目标函数,我总是可以简单地用 sess.run 调用它们?如果我的代码中有多个训练步骤怎么办?

(2) 此代码使用所有训练数据进行一次更新,对吗?我可以切换到新元吗? (为什么这里使用 AdmaOptimizer 而不是 Backprop?) 对于这个变分 dropout 问题,训练和测试会话都保留了 dropout。 AdmaOptimizer 和 Backprop 是否能够自动将 dropout 考虑在内? (虽然看起来很聪明......)或者如果我使用 Backprop 会有问题吗?

(3) 训练过程仅通过 tf.variables 更新定义的变量(本例中为 M 和 m)对吗?那些中间变量呢? (本例中为 W)。

谢谢!

【问题讨论】:

    标签: python tensorflow machine-learning


    【解决方案1】:

    (1) 是否仍然可用,因为它使用的是相同的会话?

    是的。创建会话时会初始化变量。它们甚至不存在于会话之外。如果您在一个会话中训练了一个网络,然后想要运行推理,那么它就像sess.run([your_output_op], feed_dict=...) 一样微不足道。

    请注意,您在 tensorflow 中实际上有 4 种类型的张量(数据):

    1) 占位符 - tf.placeholder(...) - 这些是您需要使用 feed_dict 传递到网络中的张量。请注意,如果您在计算中不使用占位符,则不需要将其传入。最明显的例子是您的标签,它们在训练期间需要,但在推理时不需要。

    2) 变量 - tf.Variable(...) - 这些是可变张量,在对 sess.run() 的调用之间保留(关闭会话后没有任何东西保留)。一个常见的例子是你的神经网络的权重。

    3) OP(计算张量) - tf.add(a,b) - op(操作)是计算图的一部分。一个例子是你的损失函数的结果。这些值不会在对sess.run 的调用之间保留,它们是在对sess.run 的任何特定调用期间动态计算的(如果需要)。

    4) 常量 - tf.constant(42) 顾名思义。

    (2) 优化器是 OP(张量流操作),它实际上基于反向传播更新权重变量。优化器(例如 Adam、SGD、Rmsprop 等)将更新所有 GraphKeys.TRAINABLE_VARIABLES(所有可训练变量的默认集合),但是当您变得更高级时,您可以具体定义优化器更新哪些变量(当您遇到此类用例,它们是不平凡的用例)。请注意,Adam 是众多此类优化器之一。简单的 SGD(随机梯度下降)是另一种这样的优化器。将 Adam 视为 SGD 的更精致版本。

    (3) 尝试打印出所有可训练的变量,看看里面有什么。这些是优化器默认操作的变量:Using tf.trainable_variables() to show names of trainable variables

    TRAINABLE_VARIABLES 集合是 tensorflow 中的标准约定。大多数 tensorflow 操作都会知道它们是否应该默认将变量添加到 TRAINABLE_VARIABLES 并做正确的事情而无需担心。每当您使用 tf.Variable(...) 定义权重时,您创建的变量都会默认添加到 TRAINABLE_VARIABLES 集合中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      相关资源
      最近更新 更多