Tensorflow 如何可视化实际的底层计算代码?

Tensorflow 如何可视化实际的底层计算代码?,tensorflow,tensorflow-gpu,Tensorflow,Tensorflow Gpu,我在学习Tensorflow 在一些测试中,我希望看到Tensorflow计算的实际代码。实际上,在定义了图形之后,它会生成它将要去计算的会话 但是,我无法计算出实际计算的位置(例如,a*b、a+b、e^a等)。我期待代码在C++中实现。例如,我想查看tanh操作的代码,但是,即使在查看了cwise_op_tanh.cc文件之后,我也找不到它 我能得到一些建议吗?操作的体系结构在中进行了解释。它是灵活的,用于自动代码生成,所以一开始很混乱 在寻找实现时,我通常在源代码中搜索REGISTER\u

我在学习Tensorflow

在一些测试中,我希望看到Tensorflow计算的实际代码。实际上,在定义了图形之后,它会生成它将要去计算的会话

但是,我无法计算出实际计算的位置(例如,a*b、a+b、e^a等)。我期待代码在C++中实现。例如,我想查看
tanh
操作的代码,但是,即使在查看了
cwise_op_tanh.cc
文件之后,我也找不到它


我能得到一些建议吗?

操作的体系结构在中进行了解释。它是灵活的,用于自动代码生成,所以一开始很混乱

在寻找实现时,我通常在源代码中搜索
REGISTER\u OP
字符串。此宏向TensorFlow引擎注册一个操作(有关详细信息,请参阅前面的链接,它更复杂)。宏应该给出所有“指针”来知道在哪里查看。当存在每种设备类型(CPU、GPU、特殊GPU)或分支/组合的实现时,它可能会变得复杂

例如,在
tanh
上,我在源代码中查找
tanh
,或者似乎约定是
tanh

> cd /path/to/tensorflow/source
> grep -R REGISTER_OP tensorflow | grep -i tanh
tensorflow/core/ops/math_grad.cc:REGISTER_OP_GRADIENT("Tanh", TanhGrad);
tensorflow/core/ops/math_grad.cc:REGISTER_OP_GRADIENT("Atanh", AtanhGrad);
tensorflow/core/ops/math_ops.cc:REGISTER_OP("Tanh").UNARY_COMPLEX();
tensorflow/core/ops/math_ops.cc:REGISTER_OP("Atanh").UNARY_COMPLEX();
tensorflow/core/ops/math_ops.cc:REGISTER_OP("TanhGrad").UNARY_GRADIENT_COMPLEX();
tensorflow/core/ops/nn_ops.cc:REGISTER_OP("_MklTanh")
tensorflow/core/ops/nn_ops.cc:REGISTER_OP("_MklTanhGrad")
结果:
tensorflow/core/ops/math_ops.cc:REGISTER_OP(“Tanh”).UNARY_COMPLEX()看起来像我们正在寻找的。这导致了一个
一元复杂的
宏定义:

#define UNARY_COMPLEX()                                                  \
  Input("x: T")                                                          \
      .Output("y: T")                                                    \
      .Attr("T: {half, bfloat16, float, double, complex64, complex128}") \
      .SetShapeFn(shape_inference::UnchangedShape)
实际实现通常是一个封装在
SetShapeFn
调用中的函数。但实现通常也是委托的,就像这里一样。我们知道
tanh
是一种系数操作,再搜索一点,
tensorflow/core/kernels/cwise_op_tanh.cc
tensorflow/core/kernels/cwise_op_gpu tanh.cu.cc
是唯一注册
tanh
的内核。但这一次,这些文件使用“实用程序”,如
REGISTER5
,以实现更紧凑的锅炉板注册。例如,我们可以发现:

REGISTER5(UnaryOp, CPU, "Tanh", functor::tanh, float, Eigen::half, double,
      complex64, complex128);
它最终调用
REGISTER\u KERNEL\u BUILDER
——的
REGISTER\u OP
——来注册注册操作的实际实现。查看代码,实现是
functor::tanh
,它是实际实现的包装,通常委托给特征线性代数库。有时,本征函数本身可能会进行一些更进一步的运算

注:

  • 加速搜索的一种方法是使用
    REGISTER
    而不是
    REGISTER\u OP
    作为搜索模式。不过,这将带来更多的结果
  • 所有代码提取都来自当前的TensorFlow版本(提交
    ac8e67399d75edce6a9f94afaa2adb577035966e
    )。注意代码经常更改
  • 由于各种原因,Tensorflow正在迁移到一种更抽象的体系结构,称为。因此,上述解释将变得过时

你所说的“实际上,在定义了图形之后,它会生成它将要计算的会话”到底是什么意思?我的意思是,在进行培训之前,我们定义了图形并生成tf.session()。然后将根据我们想要得到的输出执行图形(将执行计算)。不是吗?根据我们想要得到的结果?您的意思是根据我们传递给会话对象的
run
方法的参数的值。。。对不起,英语不好。那么,你到底为什么要提到会话和图表呢?