gpt4 book ai didi

python - Tensorflow:相同的初始猜测产生完全不同的结果

转载 作者:太空宇宙 更新时间:2023-11-03 20:43:30 24 4
gpt4 key购买 nike

我是 Tensorflow 新手。我用普通的GD优化算法做了一个简单的多元回归。然而,当应用两个不同的变量定义时,即使初始猜测相同,我也会得到完全不同的结果。

这两种计算有什么区别?

当我定义变量时:

tau = tf.Variable([0.25, 0.25, 0.25, 0.25], name='parameter', dtype=tf.float64)
tau = tf.clip_by_value(tau, 0.1, 5.)

经过 10000 个 epoch 后,我得到了下面的结果。

tau= [0.28396885 0.24675105 0.26584612 1.37071573]

但是,当我将它们定义为标准化值时:

tau_norm = tf.Variable([0.025, 0.025, 0.025, 0.025], name='parameter', dtype=tf.float64)
tau_norm = tf.clip_by_value(tau_norm, 0.01, 0.5)
tau_max = 10
tau = tau_norm*tau_max

经过相同的 10000 个 epoch 后,我得到了完全不同的结果:

tau= [南0.22451382 2.70862284 1.46199275]

由于相同的初始猜测,我预计这两个计算会给出相同(或足够相似)的结果。然而,我所看到的并非如此。我想知道是什么导致了这种差异。

这里,我使用tensorflow-gpu 1.14.0,但GPU不用于此计算:

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="-1"
<小时/>

已更新

好吧,让我用一个例子来解释一下,代码改编自 here 。我想我所看到的基本上和下面的一样。

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="-1"
import tensorflow as tf
import numpy as np

x = tf.placeholder("float")
y = tf.placeholder("float")
w = tf.Variable([1.0, 2.0], name="w")

y_model = tf.multiply(x, w[0]) + w[1]
error = tf.square(y - y_model)
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(error)

model = tf.global_variables_initializer()

with tf.Session() as session:
session.run(model)
print("Initial guess: ", session.run(w))
np.random.seed(seed=100)
for i in range(1000):
x_value = np.random.rand()
y_value = x_value * 2 + 6
session.run(train_op, feed_dict={x: x_value, y: y_value})

w_value = session.run(w)
print("Predicted model: {a:.3f}x + {b:.3f}".format(a=w_value[0], b=w_value[1]))

从代码中,我得到了预测模型:2.221x + 5.882。但是,当我用

替换 w
w_norm = tf.Variable([0.5, 1.0], name = 'w_norm')
w = w_norm*2.0

结果是预测模型:2.004x + 5.998,即使它具有相同的初始猜测([1.2.])和相同的纪元数。我不知道是什么造成了这种差异。

最佳答案

造成这种差异的原因是GradientDescentOptimizer.minimize将针对 tf.Variables 进行优化,所以你的梯度下降不会应用于同一个方程。

一次,您可以最小化错误(y - (x*w[0] + w[1])对于 w 中的参数另一次你最小化错误 (y - (x*2*w[0] + 2*w[1])也适用于w

如果在代码中更改学习率,算法最终将得到相同的结果。为了考虑误差的平方(将范数的平方作为误差),如果将train_op = tf.train.GradientDescentOptimizer(0.04).minimize(error)中的速率设置为0.04而不是0.01。你应该得到相同的结果。

所以:

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="-1"
import tensorflow as tf
import numpy as np

x = tf.placeholder("float")
y = tf.placeholder("float")
w = tf.Variable([1.0, 2.0], name="w")

y_model = tf.multiply(x, w[0]) + w[1]
error = tf.square(y - y_model)
train_op = tf.train.GradientDescentOptimizer(0.04).minimize(error)

model = tf.global_variables_initializer()

with tf.Session() as session:
session.run(model)
print("Initial guess: ", session.run(w))
np.random.seed(seed=100)
for i in range(1000):
x_value = np.random.rand()
y_value = x_value * 2 + 6
session.run(train_op, feed_dict={x: x_value, y: y_value})

w_value = session.run(w)
print("Predicted model: {a:.3f}x + {b:.3f}".format(a=w_value[0], b=w_value[1]))

打印与

相同的结果
import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="-1"
import tensorflow as tf
import numpy as np

x = tf.placeholder("float")
y = tf.placeholder("float")
w_norm = tf.Variable([0.5, 1.0], name = 'w_norm')
w = w_norm*2.0

y_model = tf.multiply(x, w[0]) + w[1]
error = tf.square(y - y_model)
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(error)

model = tf.global_variables_initializer()

with tf.Session() as session:
session.run(model)
print("Initial guess: ", session.run(w))
np.random.seed(seed=100)
for i in range(1000):
x_value = np.random.rand()
y_value = x_value * 2 + 6
session.run(train_op, feed_dict={x: x_value, y: y_value})

w_value = session.run(w)
print("Predicted model: {a:.3f}x + {b:.3f}".format(a=w_value[0], b=w_value[1]))

关于python - Tensorflow:相同的初始猜测产生完全不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56729256/

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