【问题标题】:Tensorflow gradients: without automatic implicit sum张量流梯度:没有自动隐式求和
【发布时间】:2017-02-20 22:43:51
【问题描述】:

在 tensorflow 中,如果一个有两个张量 xy,并且希望使用 tf.gradients(y,x) 相对于 x 具有 y 的梯度。那么实际得到的是:

gradient[n,m] = sum_ij d y[i,j]/ d x[n,m]

y 的索引有一个总和,有没有办法避免这个隐式总和?获取整个梯度张量gradient[i,j,n,m]?

【问题讨论】:

    标签: python tensorflow gradient


    【解决方案1】:

    对于未来的读者:

    Tensorflow 已经取得了一些进步,至于 tf2.7(甚至可能是更早的版本)这个问题的答案是使用 tf.GradientTape.jacobian

    https://www.tensorflow.org/guide/advanced_autodiff#jacobians

    【讨论】:

      【解决方案2】:

      这是我的工作,只取每个分量的导数(@Yaroslav 也提到过),然后在 2 阶张量(矩阵)的情况下再次将它们打包在一起:

      import tensorflow as tf
      
      def twodtensor2list(tensor,m,n):
          s = [[tf.slice(tensor,[j,i],[1,1]) for i in range(n)] for j in range(m)]
          fs = []
          for l in s:
              fs.extend(l)
          return fs
      
      def grads_all_comp(y, shapey, x, shapex):
          yl = twodtensor2list(y,shapey[0],shapey[1])
          grads = [tf.gradients(yle,x)[0] for yle in yl]
          gradsp = tf.pack(grads)
          gradst = tf.reshape(gradsp,shape=(shapey[0],shapey[1],shapex[0],shapex[1]))
          return gradst
      

      现在grads_all_comp(y, shapey, x, shapex) 将以所需格式输出等级 4 的张量。这是一种非常低效的方式,因为所有东西都需要被分割并重新包装在一起,所以如果有人找到更好的方法,我会非常有兴趣看到它。

      【讨论】:

        【解决方案3】:

        没有办法。 TensorFlow 0.11 tf.gradients 实现了标准的反向模式 AD,它给出了标量的导数。您需要分别为每个y[i,j] 调用tf.gradients

        【讨论】:

        • 不推荐使用此答案,至于 tf2.7(也可能是早期版本),请参阅下面的答案
        猜你喜欢
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        • 2021-05-12
        • 2020-09-16
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 2023-03-27
        相关资源
        最近更新 更多