Tensorflow:无效的计算

Ufuk Can Bicici

我是 tensorflow 的新手,并试图了解计算图的工作原理。我正在 tensorflow 网站上研究非常基本的线性回归示例。我有以下一段代码:

import numpy as np
import tensorflow as tf


def manual_loss(_w, _b, _x, _y):
    _loss = 0.0
    n = len(_x)
    for j in range(n):
       _loss += (_w * _x[j] + _b - _y[j]) ** 2
    return _loss


def manual_grads(_w, _b, _x, _y):
     n = len(_x)
     g_w = 0.0
     g_b = 0
     for j in range(n):
         g_w += 2.0 * (_w * _x[j] + _b - _y[j]) * _x[j]
         g_b += 2.0 * (_w * _x[j] + _b - _y[j])
     return g_w, g_b


# Model parameters
W = tf.Variable([0.3], dtype=tf.float32)
b = tf.Variable([-0.3], dtype=tf.float32)
_W = 0.3
_b = -0.3
# Model input and output
x = tf.placeholder(tf.float32)
linear_model = W * x + b
y = tf.placeholder(tf.float32)
# loss
loss = tf.reduce_sum(tf.square(linear_model - y))  # sum of the squares
grads = tf.gradients(loss, [W, b])
# training data
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]
# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)  
lr = 0.001
for i in range(1000):
    results = sess.run([loss, W, b, grads], {x: x_train, y: y_train})
    loss_value = results[0]
    W_value = results[1]
    b_value = results[2]
    grad_W = results[3][0]
    grad_b = results[3][1]
    manual_loss_value = manual_loss(_w=_W, _b=_b, _x=x_train, _y=y_train)
    manual_grad_W, manual_grad_b = manual_grads(_w=_W, _b=_b, _x=x_train, _y=y_train)
    new_W_value = W_value - lr * grad_W
    new_b_value = b_value - lr * grad_b
    W = tf.assign(W, value=new_W_value)
    b = tf.assign(b, value=new_b_value)
    print("***********************")
    print("loss={0}".format(loss_value))
    print("manual_loss_value={0}".format(manual_loss_value))
    print("W={0}".format(W_value))
    print("b={0}".format(b_value))
    print("manual_W={0}".format(_W))
    print("manual_b={0}".format(_b))
    print("grad_W={0}".format(grad_W))
    print("grad_b={0}".format(grad_b))
    print("manual_grad_W={0}".format(manual_grad_W))
    print("manual_grad_b={0}".format(manual_grad_b))
    print("***********************")
    _W -= lr * manual_grad_W
    _b -= lr * manual_grad_b

我只是尝试将梯度下降应用于一个简单的 (w*X - b - Y)^2 模型。我没有故意使用 Tensorflow 自己的优化器,我想了解底层的图更新机制。为了检查系统计算的梯度是否正确,我还为线性回归实现了自己的损失和梯度计算函数。不幸的是,tensorflow 似乎没有按预期计算损失函数和梯度。这是我得到的输出:

 ***********************
 loss=23.65999984741211
 manual_loss_value=23.659999999999997
 W=[ 0.30000001]
 b=[-0.30000001]
 manual_W=0.3
 manual_b=-0.3
 grad_W=[ 52.]
 grad_b=[ 15.59999943]
 manual_grad_W=52.0
 manual_grad_b=15.599999999999998
 ***********************
 ***********************
 loss=23.65999984741211
 manual_loss_value=20.81095744
 W=[ 0.24800001]
 b=[-0.31560001]
 manual_W=0.248
 manual_b=-0.3156
 grad_W=[ 52.]
 grad_b=[ 15.59999943]
 manual_grad_W=48.568
 manual_grad_b=14.4352
 ***********************

如您所见,tensorflow 在第二次迭代中为 W 和 b 计算了错误的损失值和梯度,实际上与第一次迭代相同。在某些试验中,它开始偏离第三次或第四次迭代的实际值;并不总是在第二个。我在这里做错了吗?一旦我获得 W 和 b 的值及其梯度,我就会tf.assign()在训练循环中更新它们的值问题出在这里吗?用张量流更新变量是一种错误的方式吗?刚开始就遇到这样的问题真的很令人沮丧。

彼得罗托特拉

我认为使用tf.assign. 该命令tf.assign创建分配节点,应该运行该节点才能生效。你应该改成这样

assign_W_placeholder = tf.placeholder(tf.float32)
assign_b_placeholder = tf.placeholder(tf.float32)
assign_W_node = tf.assign(W, assign_W_placeholder)
assign_b_node = tf.assign(b, assign_b_placeholder)

然后在 for 循环中,添加类似

sess.run(assign_W_node, feed_dict={assign_W_placeholder: new_W_value}
sess.run(assign_b_node, feed_dict={assign_b_placeholder: new_b_value}

在这些之后,tensorflow 和 manual 给出相同的结果。

完整代码:

import numpy as np
import tensorflow as tf


def manual_loss(_w, _b, _x, _y):
    _loss = 0.0
    n = len(_x)
    for j in range(n):
       _loss += (_w * _x[j] + _b - _y[j]) ** 2
    return _loss


def manual_grads(_w, _b, _x, _y):
     n = len(_x)
     g_w = 0.0
     g_b = 0
     for j in range(n):
         g_w += 2.0 * (_w * _x[j] + _b - _y[j]) * _x[j]
         g_b += 2.0 * (_w * _x[j] + _b - _y[j])
     return g_w, g_b


# Model parameters
W = tf.Variable([0.3], dtype=tf.float32)
b = tf.Variable([-0.3], dtype=tf.float32)
_W = 0.3
_b = -0.3
# Model input and output
x = tf.placeholder(tf.float32)
linear_model = W * x + b
y = tf.placeholder(tf.float32)

assign_W_placeholder = tf.placeholder(tf.float32)
assign_b_placeholder = tf.placeholder(tf.float32)
assign_W_node = tf.assign(W, assign_W_placeholder)
assign_b_node = tf.assign(b, assign_b_placeholder)

# loss
loss = tf.reduce_sum(tf.square(linear_model - y))  # sum of the squares
grads = tf.gradients(loss, [W, b])
# training data
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]
# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)  
lr = 0.001
for i in range(1000):
    results = sess.run([loss, W, b, grads], {x: x_train, y: y_train})
    loss_value = results[0]
    W_value = results[1]
    b_value = results[2]
    grad_W = results[3][0]
    grad_b = results[3][1]
    manual_loss_value = manual_loss(_w=_W, _b=_b, _x=x_train, _y=y_train)
    manual_grad_W, manual_grad_b = manual_grads(_w=_W, _b=_b, _x=x_train, _y=y_train)
    new_W_value = W_value - lr * grad_W
    new_b_value = b_value - lr * grad_b
    sess.run([assign_W_node, assign_b_node], 
             feed_dict={assign_W_placeholder: new_W_value, assign_b_placeholder: new_b_value})
    print("***********************")
    print("loss={0}".format(loss_value))
    print("manual_loss_value={0}".format(manual_loss_value))
    print("W={0}".format(W_value))
    print("b={0}".format(b_value))
    print("manual_W={0}".format(_W))
    print("manual_b={0}".format(_b))
    print("grad_W={0}".format(grad_W))
    print("grad_b={0}".format(grad_b))
    print("manual_grad_W={0}".format(manual_grad_W))
    print("manual_grad_b={0}".format(manual_grad_b))
    print("***********************")
    _W -= lr * manual_grad_W
    _b -= lr * manual_grad_b

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

流浪的usbfilter使来宾计算机进入无效状态

来自分类Dev

流浪的Laravel框,访客计算机进入无效状态

来自分类Dev

moment.js“无效日期”计算时差

来自分类Dev

Tensorflow:如何替换计算图中的节点?

来自分类Dev

TensorFlow中的缓存计算

来自分类Dev

是否可以修改现有的TensorFlow计算图?

来自分类Dev

TensorFlow中的异步计算

来自分类Dev

Tensorflow中的同步与异步计算

来自分类Dev

用于分布式计算的Tensorflow设置

来自分类Dev

TensorFlow的无效参数错误(形状不兼容)

来自分类Dev

TensorFlow:计算Hessian矩阵(和高阶导数)

来自分类Dev

TensorFlow:在计算图中删除/添加变量

来自分类Dev

使用TensorFlow进行成对距离计算

来自分类Dev

Tensorflow:空的计算图和垃圾回收

来自分类Dev

Tensorflow错误:无效的参数:形状必须是向量

来自分类Dev

无效的类型,必须为字符串或Tensor [TensorFlow]

来自分类Dev

如何在我的计算机上找到TensorFlow的版本?

来自分类Dev

tensorflow keras无法在预测阶段退出(设置学习阶段无效)

来自分类Dev

启用在本地计算机上使用Tensorflow JS

来自分类Dev

Python:使用TensorFlow计算神经网络的准确性

来自分类Dev

如何在Google计算引擎上运行Tensorflow GPU容器?

来自分类Dev

Tensorflow 2.0中的梯度计算

来自分类Dev

Tensorflow对象检测API无效甚至丢失率低

来自分类Dev

TensorFlow SparseCategoricalAccuracy度量标准计算

来自分类Dev

按有效日期和无效日期计算单位

来自分类Dev

Python中的井字游戏计算机,语法无效

来自分类Dev

剔除即使在对象无效后仍保留对计算属性的订阅

来自分类Dev

TensorFlow指标无效(超出范围)

来自分类Dev

如何使用TensorFlow计算矩阵运算?

来自分类Dev

Tensorflow:空的计算图和垃圾回收

Related 相关文章

  1. 1

    流浪的usbfilter使来宾计算机进入无效状态

  2. 2

    流浪的Laravel框,访客计算机进入无效状态

  3. 3

    moment.js“无效日期”计算时差

  4. 4

    Tensorflow:如何替换计算图中的节点?

  5. 5

    TensorFlow中的缓存计算

  6. 6

    是否可以修改现有的TensorFlow计算图?

  7. 7

    TensorFlow中的异步计算

  8. 8

    Tensorflow中的同步与异步计算

  9. 9

    用于分布式计算的Tensorflow设置

  10. 10

    TensorFlow的无效参数错误(形状不兼容)

  11. 11

    TensorFlow:计算Hessian矩阵(和高阶导数)

  12. 12

    TensorFlow:在计算图中删除/添加变量

  13. 13

    使用TensorFlow进行成对距离计算

  14. 14

    Tensorflow:空的计算图和垃圾回收

  15. 15

    Tensorflow错误:无效的参数:形状必须是向量

  16. 16

    无效的类型,必须为字符串或Tensor [TensorFlow]

  17. 17

    如何在我的计算机上找到TensorFlow的版本?

  18. 18

    tensorflow keras无法在预测阶段退出(设置学习阶段无效)

  19. 19

    启用在本地计算机上使用Tensorflow JS

  20. 20

    Python:使用TensorFlow计算神经网络的准确性

  21. 21

    如何在Google计算引擎上运行Tensorflow GPU容器?

  22. 22

    Tensorflow 2.0中的梯度计算

  23. 23

    Tensorflow对象检测API无效甚至丢失率低

  24. 24

    TensorFlow SparseCategoricalAccuracy度量标准计算

  25. 25

    按有效日期和无效日期计算单位

  26. 26

    Python中的井字游戏计算机,语法无效

  27. 27

    剔除即使在对象无效后仍保留对计算属性的订阅

  28. 28

    TensorFlow指标无效(超出范围)

  29. 29

    如何使用TensorFlow计算矩阵运算?

  30. 30

    Tensorflow:空的计算图和垃圾回收

热门标签

归档