【问题标题】:Finding implementation of methods in Tensorflow在 TensorFlow 中查找方法的实现
【发布时间】:2018-03-07 00:43:48
【问题描述】:

我想更改一些最小化优化器,例如在 Tensorflow 中使用的 AdadeltaOptimizer。 我获得了许可证,但 lib 中没有代码,只有参考,那么我怎样才能找到实现呢?以下是 Adadelta API 示例:

@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 optimization tensorflow gradient-descent


    【解决方案1】:

    第一个入口点是来自 tensorflow 主仓库的 python/training/adadelta.py。但是你可能会注意到它是一个 python 包装器,所有的操作实际上都是在原生 C++ 中实现并在 python 中加载(这是 tensorflow 中的常用做法,例如参见这个问题:Where is the code for gradient descent?)。

    例如,在core/kernels/training_ops.cc 中,您可以找到ApplyAdadelta op 的CPU 实现。相同操作的 GPU 实现在 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 上运行新的优化器,您必须同时接触并重建两者。

    【讨论】:

    • 如果我想制作新的 adadelta 而不是包含在 tensorflow 中,我只需要重写 c++ 函数?
    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 2017-02-24
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多