Skip to main content
 首页 » 编程设计

python之tensorflow 中的 tf.Session() 之外的参数值是否可用

2025年01月19日32xing901022

我是 tensorflow 的新手,我正在按照本教程进行操作,该教程正在执行 variational 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 来训练和评估神经网络。但是如果在 sess 之外(例如从 # Sample from the posterior 开始的行),优化器训练的参数值是否仍然可用? (它们是全局变量还是 sess 中的局部变量)。或者它是否仍然可用,因为它使用的是相同的 session ? 如果我想使用这些参数来评估我的目标函数,我总是可以简单地用 sess.run 调用它们?如果我的代码中有多个训练步骤怎么办?

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

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

谢谢!

请您参考如下方法:

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

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

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

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

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

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

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

(2) Optimizer 是 OP( tensorflow 操作),它实际上根据反向传播更新权重变量。优化器(例如 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 集合中。