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