5

Chạy một số thử nghiệm với TensorFlow, muốn xem xét việc thực hiện một số chức năng chỉ để xem chính xác cách thức thực hiện một số việc, bắt đầu với trường hợp đơn giản là tf.train.GradientDescentOptimizer. Tải zip của toàn bộ mã nguồn từ github, chạy một số tìm kiếm trên cây nguồn, đã đến:Mã cho độ dốc gốc ở đâu?

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(

Được rồi, vì vậy có lẽ mã thực tế là trong apply_gradient_descent, tìm kiếm cho rằng ... không có. Chỉ có ba lần xuất hiện trong toàn bộ cây nguồn, tất cả đều được sử dụng, không phải định nghĩa.

Còn khoảng training_ops thì sao? Có một tệp nguồn có tên gợi ý:

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 

... ở trên là toàn bộ nội dung của tệp đó. Hmm.

Tôi đã tìm thấy tập tin này:

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

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

mà dường như để khẳng định như vậy và như vậy các file khác là mã đối tượng, được tạo ra trong quá trình xây dựng - nhưng mà là mã nguồn chúng được tạo ra từ đâu?

Vì vậy, đây là thời điểm tôi từ bỏ và yêu cầu trợ giúp. Bất cứ ai có thể quen thuộc với các cơ sở mã TensorFlow điểm tôi đến nơi mà các mã nguồn có liên quan là?

Trả lời

7

Việc triển khai tiếp tục chuyển đến mã C++ gốc. Dưới đây là ApplyGradientDescent thực hiện 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; 
    } 
}; 

thực hiện CPU là 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(); 
    } 
}; 
Các vấn đề liên quan