天天看點

Autograph的使用規範

有三種計算圖的建構方式:靜态計算圖,動态計算圖,以及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)
           

複制

Autograph的使用規範
Autograph的使用規範

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()
           

複制

Autograph的使用規範
@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()

           

複制

Autograph的使用規範

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)
           

複制

Autograph的使用規範
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)
           

複制

Autograph的使用規範