1.session.run() 调用tensorflow的后台获取conv的值
2.后台裁剪计算图,计算出哪些节点是需要的,并且将节点放置在合适的计算设备上
3.每个设备执行相应的子图,使用 executor
4通过调用Compute()方法,executor调用相应卷积操作的tensorflow::OpKernel
"Conv2D"
OpKernel 在这里实施,Compute()方法在这里,这个实施方法是比较复杂的,要做专门的优化。
创建graph的时候,可跟踪查看到调用顺序
tf.nn.conv2d(...) -> tf.nn_ops.conv2d(...) -> tf.gen_nn_ops.conv2d(...) -> _op_def_lib.apply_op("Conv2D", ...) -> ?
但是,这里面有些函数gen_nn_ops.py 是机器编译生成的,有些不大理解?
tf.nn.conv2d()是C++实现的,调用优化代码例如Eigen(cpu平台)或者cuDNN库(GPU平台),可查看这里
tf.nn.conv2d()是在调用session.run()的时候执行的,
input = tf.placeholder(tf.float32)
filter = tf.Variable(tf.truncated_normal([5, 5, 3, 32], stddev=0.1)
conv = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME')
result = sess.run(conv, feed_dict={input: ...}) # <== Execution happens here.
"Conv2D"
OpKernel 在这里实施,Compute()方法在这里,这个实施方法是比较复杂的,要做专门的优化。