有三種計算圖的建構方式:靜态計算圖,動态計算圖,以及Autograph。
TensorFlow 2.0主要使用的是動态計算圖和Autograph。
動态計算圖易于調試,編碼效率較高,但執行效率偏低。
靜态計算圖執行效率很高,但較難調試。
而Autograph機制可以将動态圖轉換成靜态計算圖,兼收執行效率和編碼效率之利。
當然Autograph機制能夠轉換的代碼并不是沒有任何限制的,有一些編碼規範需要遵循,否則可能會轉換失敗或者不符合預期。
我們将着重介紹Autograph的編碼規範和Autograph轉換成靜态圖的原理。
并介紹使用tf.Module來更好地建構Autograph。
本篇我們介紹使用Autograph的編碼規範。
一,Autograph編碼規範概述
1,被@tf.function修飾的函數應盡可能使用TensorFlow中的函數而不是Python中的其他函數。例如使用tf.print而不是print,使用tf.range而不是range,使用tf.constant(True)而不是True.
2,避免在@tf.function修飾的函數内部定義tf.Variable.
3,被@tf.function修飾的函數不可修改該函數外部的Python清單或字典等資料結構變量。
二,Autograph編碼規範說明
1,被@tf.function修飾的函數應盡量使用TensorFlow中的函數而不是Python中的其他函數。
import numpy as np
import tensorflow as tf
@tf.function
def np_random():
a = np.random.randn(3,3)
tf.print(a)
@tf.function
def tf_random():
a = tf.random.normal((3,3))
tf.print(a)
複制
2,避免在@tf.function修飾的函數内部定義tf.Variable.
# 避免在@tf.function修飾的函數内部定義tf.Variable.
x = tf.Variable(1.0,dtype=tf.float32)
@tf.function
def outer_var():
x.assign_add(1.0)
tf.print(x)
return(x)
outer_var()
outer_var()
複制
@tf.function
def inner_var():
x = tf.Variable(1.0,dtype = tf.float32)
x.assign_add(1.0)
tf.print(x)
return(x)
#執行将報錯
#inner_var()
#inner_var()
複制
3,被@tf.function修飾的函數不可修改該函數外部的Python清單或字典等結構類型變量
tensor_list = []
#@tf.function #加上這一行切換成Autograph結果将不符合預期!!!
def append_tensor(x):
tensor_list.append(x)
return tensor_list
append_tensor(tf.constant(5.0))
append_tensor(tf.constant(6.0))
print(tensor_list)
複制
tensor_list = []
@tf.function #加上這一行切換成Autograph結果将不符合預期!!!
def append_tensor(x):
tensor_list.append(x)
return tensor_list
append_tensor(tf.constant(5.0))
append_tensor(tf.constant(6.0))
print(tensor_list)
複制