【问题标题】:Where is the code for gradient descent?梯度下降的代码在哪里?
【发布时间】:2018-04-21 01:28:20
【问题描述】:

用TensorFlow做一些实验,想看看一些函数的实现只是为了看看有些事情到底是怎么做的,从tf.train.GradientDescentOptimizer这个简单的案例开始。从 github 下载了完整源代码的 zip,在源代码树上运行了一些搜索,得到:

C:\tensorflow-master\tensorflow\python\training\gradient_descent.py

class GradientDescentOptimizer(optimizer.Optimizer):

  def _apply_dense(self, grad, var):
    return training_ops.apply_gradient_descent(

好的,所以大概实际代码在apply_gradient_descent 中,搜索过...不在那里。整个源代码树中只出现了 3 次,都是使用,而不是定义。

training_ops 呢?确实存在具有暗示性名称的源文件:

C:\tensorflow-master\tensorflow\python\training\training_ops.py

from tensorflow.python.training import gen_training_ops
# go/tf-wildcard-import
# pylint: disable=wildcard-import
from tensorflow.python.training.gen_training_ops import *
# pylint: enable=wildcard-import

...以上是该文件的全部内容。嗯。

我确实找到了这个文件:

C:\tensorflow-master\tensorflow\python\BUILD

tf_gen_op_wrapper_private_py(
    name = "training_ops_gen",
    out = "training/gen_training_ops.py",
)

这似乎证实了这样那样的其他文件是目标代码,在构建过程中生成 - 但它们生成的源代码在哪里?

所以这就是我放弃并寻求帮助的时候了。任何熟悉 TensorFlow 代码库的人都可以指出相关源代码在哪里吗?

【问题讨论】:

    标签: python tensorflow machine-learning gradient-descent


    【解决方案1】:

    实现进一步进入本机 c++ 代码。这是ApplyGradientDescent GPU 实现(core/kernels/training_ops_gpu.cu.cc):

    template <typename T>
    struct ApplyGradientDescent<GPUDevice, T> {
      void operator()(const GPUDevice& d, typename TTypes<T>::Flat var,
                      typename TTypes<T>::ConstScalar lr,
                      typename TTypes<T>::ConstFlat grad) {
        Eigen::array<typename TTypes<T>::Tensor::Index, 1> bcast;
        bcast[0] = grad.dimension(0);
        Eigen::Sizes<1> single;
        var.device(d) -= lr.reshape(single).broadcast(bcast) * grad;
      }
    };
    

    CPU 实现是here (core/kernels/training_ops.cc):

    template <typename T>
    struct ApplyGradientDescent<CPUDevice, T> {
      void operator()(const CPUDevice& d, typename TTypes<T>::Flat var,
                      typename TTypes<T>::ConstScalar lr,
                      typename TTypes<T>::ConstFlat grad) {
        var.device(d) -= grad * lr();
      }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 2016-06-13
      • 2014-01-11
      • 2019-04-15
      相关资源
      最近更新 更多