【问题标题】:don't know how to use tensorflow gradient不知道怎么用tensorflow梯度
【发布时间】:2020-03-05 09:34:16
【问题描述】:

我在使用tf.gradients 计算梯度时遇到了问题。 我的 x 是形状为 (4, 1) 的矢量 vtf.constant() 而我的yvsigmoid,形状也是(4, 1),所以y相对于的梯度x 应该是形状为(4, 4) 的对角矩阵。

我的代码:

c = tf.constant(sigmoid(x_0@w_0))
d = tf.constant(x_0@w_0)
Omega = tf.gradients(c, d)
_Omega = sess.run(Omega)

错误是

Fetch 参数 None 的类型无效。

另外,我认为使用tf.gradients 可能是错误的,可能还有其他一些函数可以计算这个。

我的问题:

  1. 指出我错在哪里以及如何使用 tf.gradients 解决它

  2. 或使用其他功能。

编辑: 想要像这样计算导数:参见 vector_by_vector 部分https://en.wikipedia.org/wiki/Matrix_calculus#Vector-by-vector 结果 Omega 如下所示:

[[s1(1-s1)   0         0          0   ]
 [0        s2(1-s2)    0          0   ]
 [0          0      s3(1-s3)      0   ]
 [0          0         0      s4(1-s4)]]

其中 si = sigmoid(x_0i@w_0),其中 x_0i 是 x_0 的第 i 行。 一般来说,计算一个向量在另一个向量上,应该是一个矩阵。

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    首先,您无法计算常数的梯度。你会得到 None 用于渐变的操作。这就是你错误的原因。计算梯度的一种方法是 tf graph(参见下面的代码),或者其他方法可以在 Eager 执行模式下使用 tf.GradientTape:

    import tensorflow as tf 
    import numpy as np 
    
    arr = np.random.rand(4, 1)
    ip = tf.Variable(initial_value=arr)
    sess = tf.Session()
    c_var = tf.math.sigmoid(ip)
    Omega = tf.gradients(c_var, ip)
    sess.run(tf.global_variables_initializer())
    _Omega = sess.run(Omega)
    print(_Omega)
    

    现在,您可以传递任何大小的向量。不过,不确定如何获得梯度的 (4, 4) 对角矩阵。

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2014-02-05
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 2019-11-16
      • 2018-08-08
      • 2018-03-24
      • 2021-07-19
      相关资源
      最近更新 更多