在 Tensorflow 中查找方法的实现
Finding implementation of methods in Tensorflow
我想更改一些最小化优化器,例如在 Tensorflow 中使用的 AdadeltaOptimizer
。
我拿到了license,但是lib里没有代码,只有参考,那我怎么找实现呢?这是 API 的 Adadelta 示例:
@tf_export("train.AdadeltaOptimizer") class
AdadeltaOptimizer(optimizer.Optimizer)
Optimizer that implements the Adadelta algorithm.
See [M. D. Zeiler](http://arxiv.org/abs/1212.5701) ([pdf]
(http://arxiv.org/pdf/1212.5701v1.pdf))
第一个入口点是 python/training/adadelta.py
from tensorflow main repo. But you may notice it's a python wrapper, all ops are actually implemented in native C++ and loaded in python (this is the usual practice in tensorflow, see for instance this question: )。
例如,在core/kernels/training_ops.cc
you can find CPU impelmentation of ApplyAdadelta
op. GPU implementation of the same op is in core/kernels/training_ops_gpu.cu.cc
中:
template <typename T>
struct ApplyAdadelta<GPUDevice, T> {
void operator()(const GPUDevice& d, typename TTypes<T>::Flat var,
typename TTypes<T>::Flat accum,
typename TTypes<T>::Flat accum_update,
typename TTypes<T>::ConstScalar lr,
typename TTypes<T>::ConstScalar rho,
typename TTypes<T>::ConstScalar epsilon,
typename TTypes<T>::ConstFlat grad) {
Eigen::array<typename TTypes<T>::Tensor::Index, 1> bcast;
bcast[0] = grad.dimension(0);
Eigen::Sizes<1> single;
accum.device(d) = accum * rho.reshape(single).broadcast(bcast) +
grad.square() * (grad.constant(T(1)) -
rho.reshape(single).broadcast(bcast));
const auto update =
(accum_update + epsilon.reshape(single).broadcast(bcast)).sqrt() *
(accum + epsilon.reshape(single).broadcast(bcast)).rsqrt() * grad;
var.device(d) -= update * lr.reshape(single).broadcast(bcast);
accum_update.device(d) =
accum_update * rho.reshape(single).broadcast(bcast) +
update.square() *
(grad.constant(T(1)) - rho.reshape(single).broadcast(bcast));
}
};
如果您想修补 C++ 代码,则必须重建 .so
库。为了能够在 CPU 和 GPU 上 运行 你的新优化器,你必须接触并重建两者。
我想更改一些最小化优化器,例如在 Tensorflow 中使用的 AdadeltaOptimizer
。
我拿到了license,但是lib里没有代码,只有参考,那我怎么找实现呢?这是 API 的 Adadelta 示例:
@tf_export("train.AdadeltaOptimizer") class
AdadeltaOptimizer(optimizer.Optimizer)
Optimizer that implements the Adadelta algorithm.
See [M. D. Zeiler](http://arxiv.org/abs/1212.5701) ([pdf]
(http://arxiv.org/pdf/1212.5701v1.pdf))
第一个入口点是 python/training/adadelta.py
from tensorflow main repo. But you may notice it's a python wrapper, all ops are actually implemented in native C++ and loaded in python (this is the usual practice in tensorflow, see for instance this question:
例如,在core/kernels/training_ops.cc
you can find CPU impelmentation of ApplyAdadelta
op. GPU implementation of the same op is in core/kernels/training_ops_gpu.cu.cc
中:
template <typename T>
struct ApplyAdadelta<GPUDevice, T> {
void operator()(const GPUDevice& d, typename TTypes<T>::Flat var,
typename TTypes<T>::Flat accum,
typename TTypes<T>::Flat accum_update,
typename TTypes<T>::ConstScalar lr,
typename TTypes<T>::ConstScalar rho,
typename TTypes<T>::ConstScalar epsilon,
typename TTypes<T>::ConstFlat grad) {
Eigen::array<typename TTypes<T>::Tensor::Index, 1> bcast;
bcast[0] = grad.dimension(0);
Eigen::Sizes<1> single;
accum.device(d) = accum * rho.reshape(single).broadcast(bcast) +
grad.square() * (grad.constant(T(1)) -
rho.reshape(single).broadcast(bcast));
const auto update =
(accum_update + epsilon.reshape(single).broadcast(bcast)).sqrt() *
(accum + epsilon.reshape(single).broadcast(bcast)).rsqrt() * grad;
var.device(d) -= update * lr.reshape(single).broadcast(bcast);
accum_update.device(d) =
accum_update * rho.reshape(single).broadcast(bcast) +
update.square() *
(grad.constant(T(1)) - rho.reshape(single).broadcast(bcast));
}
};
如果您想修补 C++ 代码,则必须重建 .so
库。为了能够在 CPU 和 GPU 上 运行 你的新优化器,你必须接触并重建两者。