梯度下降的代码在哪里?
Where is the code for gradient descent?
运行一些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次出现,都是uses,不是definitions。
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 代码库的人都可以指出相关源代码在哪里吗?
实现进一步转到本机 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();
}
};
运行一些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次出现,都是uses,不是definitions。
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 代码库的人都可以指出相关源代码在哪里吗?
实现进一步转到本机 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();
}
};