1. tf.py_func
这个功能允许我们定义普通的python代码, 将tensor传入,并像操作numpy array一样去处理这些tensor数据。 在处理完之后,再以tensor返回出去。
官方API: https://www.tensorflow.org/api_docs/python/tf/py_func
使用实例
def my_func(x):
# x will be a numpy array with the contents of the placeholder below
return np.sinh(x)
input = tf.placeholder(tf.float32)
y = tf.py_func(my_func, [input], tf.float32)
2. 未纳入graph的节点
tensorflow会将我们定义的操作整合成一个完整的graph。需要注意的是,一些节点因为后续没有被使用,会被排除在graph外面。 最终这些节点不会被执行。
例如当我们想在执行中打印输出我们想观察的变量值时,我们会使用tf.Print
操作。 但是如果这个结果的输出没被执行时,则这个op
不会被执行。
## 如果后续这个value没被调用,则该打印输出不会被执行
value = tf.Print(value,[value_1, value_2,value3], "three values I wanna watch: ")
尤其在一些执行一些并没有输出的op
时,我们更难通过在这些op后续增加节点,将其纳入graph中。我们可以通过tf.control_dependencies
来控制节点间的依赖,保证一些节点得到执行。
# ## 通过控制依赖保证 save_image_op 得到执行
with tf.control_dependencies([save_image_op]):
tensor_x= tf.identity(tensor_x)
3. 添加一行代码,使用Winograd算法加快训练速度
执行时加上这么一行代码可以加快训练速度。
Fast Convolution算法主要有基于Lagrange插值的Cook-Toom算法和基于中国剩余定理(Chinese remainder theorem)的Winograd算法。
解释很好的博客链接:
https://blog.csdn.net/u013498583/article/details/79481144
https://blog.csdn.net/qq_32998593/article/details/86177151
https://blog.csdn.net/antkillerfarm/article/details/78769624
# Using the Winograd non-fused algorithms provides a small performance boost.
os.environ['TF_ENABLE_WINOGRAD_NONFUSED'] = '1'