@tf.function 使用
Tensorflow2.1代码像普通的Python代码一样简单。在Tensorflow 2.0中,会自动的对被@tf.function装饰的函数进行AutoGraph优化.
|
|
代码非常易读,但是也带来了执行效率低的问题,因为代码需要依赖Python的解释器来进行计算,无法对数据流以及计算图进行优化.
为了在代码可读性和代码速度之间保持平衡,Tensorflow 2.0引入了tf.function
这一概念.
我们来粗浅的看一下被tf.function
装饰的函数第一次执行时都做了什么:
- 函数被执行并且被跟踪(tracing).Eager execution处于关闭状态,所有的Tensorflow函数被当做
tf.Operation
进行图的创建. - AutoGraph被唤醒,去检测Python代码可以转为Tensorflow的逻辑,比如while > tf.while, for > tf.while, if > tf.cond, assert > tf.assert.
- 通过以上两部,我们对函数进行建图,为了保证Python代码中每一行的执行顺序,
tf.control_dependencies
被自动加入到代码中.保证第i行执行完后我们会执行第i+1行. - 返回tf.Graph,根据函数名和输入参数,我们将这个graph存到一个cache中.
- 对于任何一个该函数的调用,我们会重复利用cache中的计算图进行计算.
示例:
|
|
咦,为什么代码报错了?
tf.function
可能会对一段Python函数进行多次执行来构图,在多次执行的过程中,同样的Variable被创建了多次,产生错误.
这其实也是一个很容易混乱的概念,在eager mode下一个Variable是一个Python object,所以会在执行范围外被销毁.但是在tf.function
的装饰下,Variable变成了tf.Variable
,是在Graph中持续存在的.
把一个在eager mode下正常执行的函数转换到Tensorflow图形式,需要一边思考着计算图一边构建程序.
解决方案:
|
|
|
|
Tf.keras.Metrics
Reference: https://blog.csdn.net/qq_39507748/article/details/105267168
reset_states()
,清除之前的计算结果,相当于复位重新开始计算result()
,计算并且返回结果update_state()
,将每一次更新的数据作为一组数据,这样在真正计算的时候会计算出每一组的结果,然后求多组结果的平均值。但并不会直接计算,计算还是在调用result()
时完成
1、tf.keras.metrics.Accuracy
|
|
2、tf.keras.metrics.BinaryAccuracy
|
|
3、tf.keras.metrics.BinaryCrossentropy
|
|
4、tf.keras.metrics.CategoricalAccuracy
|
|
5、tf.keras.metrics.CategoricalCrossentropy
|
|
6、tf.keras.metrics.SparseCategoricalAccuracy
|
|
7、tf.keras.metrics.SparseCategoricalCrossentropy
|
|
数据预处理形式
图片数据建模示例
|
|
|
|
文本数据预处理方式
|
|
时序数据预处理方式
|
|
Jupiter 查看文档; 导出代码成py