gpt4 book ai didi

python - 变量和损失评估的奇怪顺序

转载 作者:行者123 更新时间:2023-12-01 07:27:12 24 4
gpt4 key购买 nike

我想使用tf.identity在优化步骤之前之后复制损失和变量:

这是之前的情况:

  1. 复制当前损失和变量(保存变量和相关损失)
  2. 运行一步优化(更改损失和值)
  3. 重复

这是之后的情况:

  1. 运行一步优化(更改损失和值)
  2. 复制当前损失和变量(保存变量和相关损失)
  3. 重复

通过“复制”,我的意思是在计算图中创建节点,以使用 tf.identity 存储当前的损失值和变量。

<小时/>

不知何故,这就是实际发生的情况:

  1. 复制丢失
  2. 运行一步优化(更改损失和值)
  3. 复制变量(该值与步骤 1 中保存的损失不对应)
  4. 重复

如何解决这个问题?

我可以在第 3 步之后立即再次评估损失。但这意味着在每个周期中浪费一次对损失的评估。

<小时/>

测试:

  1. 复制损失和变量
  2. 运行优化步骤以及复制损失和变量。

如果损失和变量的复制总是发生在优化步骤之前,那么步骤 1 和步骤 2 中制作的副本将是相同的。

否则,步骤 1 和步骤 2 中制作的副本可能会有所不同。

import numpy as np
import tensorflow as tf

x = tf.get_variable('x', initializer=np.array([1], dtype=np.float64))
loss = x * x

optim = tf.train.AdamOptimizer(1)

## Control Dependencies ##
loss_ident = tf.identity(loss) # <-- copy loss
x_ident = tf.identity(x) # <-- copy variable
with tf.control_dependencies([loss_ident, x_ident]):
train_op = optim.minimize(loss)

## Run ##
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
for i in range(1000):
# step 1
a_, x1_ = sess.run([loss, x_ident])
# step 2
b_, x2_ = sess.run([loss_ident, x_ident, train_op])[:-1]
print("loss:", a_, b_)
assert np.allclose(a_, b_)
print("variables:", x1_, x2_)
assert np.allclose(x1_, x2_)

结果:

           step 1    step 2
loss: [1.] [1.]
variables: [1.] [1.58114875e-07] # <-- not the same
AssertionError

不幸的是,步骤 1 和步骤 2 中变量的副本不同。因此,变量的复制并不总是发生在优化之前

最佳答案

我不完全清楚为什么控制依赖项不适用于张量。但您可以让它与变量和 tf.assign() 一起使用。这是我的解决方案。根据我的理解,您所需要的只是在 train_op 之前发生的副本。从我所做的一些快速测试来看,这似乎有效。

import tensorflow as tf

tf.reset_default_graph()

x = tf.get_variable('x', initializer=np.array([1], dtype=np.float64))
x_ident = tf.get_variable('x_ident', initializer=np.array([1], dtype=np.float64))
loss = x * x
loss_ident = tf.get_variable('loss', initializer=np.array([1.0]), dtype=tf.float64)
optim = tf.train.AdamOptimizer(1)

## Control Dependencies ##
loss_ident = tf.assign(loss_ident, loss, name='loss_assign') # <-- copy loss
x_ident = tf.assign(x_ident, x, name='x_assign') # <-- copy variable
with tf.control_dependencies([x_ident, loss_ident]):
train_op = optim.minimize(loss)

## Run ##
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
for i in range(10):
# step 1

a, x1 = sess.run([loss_ident, x_ident])
# step 2
b, x2, _ = sess.run([loss_ident, x_ident, train_op])


#print("loss:", a_, b_)
print('ab',a,b)
print('x1x2',x1, x2)
assert np.allclose(a, b)
#print("variables:", x1_, x2_)
assert np.allclose(x1, x2)

Hopefully, this is what you're looking for.

关于python - 变量和损失评估的奇怪顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57386360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com