6、python教程進(jìn)階:tensorflow教程

tensorflow教程

一、基本概念:張量、計算圖、自動微分

1、張量

1)結(jié)構(gòu)操作

創(chuàng)建、索引切片,維度變換,合并分割

x=tf.Variable([[1,2],[3,4]],dtype=tf.float32)

a=tf.random.uniform([5],minval=0,maxval=10)\b=tf.random.normal([3,3],mean=0.0,stddev=1.0)

tf.gather

tf.reshape

tf.concat\tf.stack\tf.split

2)數(shù)學(xué)運(yùn)算

標(biāo)量運(yùn)算,向量運(yùn)算,矩陣運(yùn)算。

標(biāo)量運(yùn)算:加減乘除乘方,以及三角函數(shù),指數(shù),對數(shù)等常見函數(shù),邏輯比較運(yùn)算符等都是標(biāo)量運(yùn)算符。

標(biāo)量運(yùn)算符的特點(diǎn)是對張量實施逐元素運(yùn)算。

向量運(yùn)算:向量運(yùn)算符只在一個特定軸上運(yùn)算,將一個向量映射到一個標(biāo)量或者另外一個向量。 許多向量運(yùn)算符都以reduce開頭。

#tf.math.top_k可以用于對張量排序

a=tf.constant([1,3,7,5,4,8])

values,indices=tf.math.top_k(a,3,sorted=True)

tf.print(values)

tf.print(indices)

矩陣運(yùn)算:矩陣必須是二維的。類似tf.constant([1,2,3])這樣的不是矩陣。

矩陣運(yùn)算包括:矩陣乘法,矩陣轉(zhuǎn)置,矩陣逆,矩陣求跡,矩陣范數(shù),矩陣行列式,矩陣求特征值,矩陣分解等運(yùn)算。

#矩陣乘法

a=tf.constant([[1,2],[3,4]])

b=tf.constant([[2,0],[0,2]])

a@b

#等價于tf.matmul(a,b)除了一些常用的運(yùn)算外,大部分和矩陣有關(guān)的運(yùn)算都在tf.linalg子包中。

廣播機(jī)制:

TensorFlow的廣播規(guī)則和numpy是一樣的:

如果張量的維度不同,將維度較小的張量進(jìn)行擴(kuò)展,直到兩個張量的維度都一樣。

如果兩個張量在某個維度上的長度是相同的,或者其中一個張量在該維度上的長度為1,那么我們就說這兩個張量在該維度上是相容的。

如果兩個張量在所有維度上都是相容的,它們就能使用廣播。

廣播之后,每個維度的長度將取兩個張量在該維度長度的較大值。

在任何一個維度上,如果一個張量的長度為1,另一個張量長度大于1,那么在該維度上,就好像是對第一個張量進(jìn)行了復(fù)制。

tf.broadcast_to 以顯式的方式按照廣播機(jī)制擴(kuò)展張量的維度。

example1:

a=tf.constant([1,2,3])

b=tf.constant([[0,0,0],[1,1,1],[2,2,2]])

b+a

#等價于 b + tf.broadcast_to(a,b.shape)

<tf.Tensor: shape=(3, 3), dtype=int32, numpy=

array([[1, 2, 3],

? ? ? [2, 3, 4],

? ? ? [3, 4, 5]], dtype=int32)>

example2:

#計算廣播后計算結(jié)果的形狀,動態(tài)形狀,Tensor類型參數(shù)

c=tf.constant([1,2,3])

d=tf.constant([[1],[2],[3]])

tf.broadcast_dynamic_shape(tf.shape(c),tf.shape(d))

c+d#等價于 tf.broadcast_to(c,[3,3]) + tf.broadcast_to(d,[3,3])

<tf.Tensor: shape=(3, 3), dtype=int32, numpy=

array([[2, 3, 4],

? ? ? [3, 4, 5],

? ? ? [4, 5, 6]], dtype=int32)>

2、計算圖

有三種計算圖的構(gòu)建方式:靜態(tài)計算圖,動態(tài)計算圖,以及Autograph。

TensorFlow 2.0主要使用的是動態(tài)計算圖和Autograph。

動態(tài)計算圖易于調(diào)試,編碼效率較高,但執(zhí)行效率偏低。

靜態(tài)計算圖執(zhí)行效率很高,但較難調(diào)試。

而Autograph機(jī)制可以將動態(tài)圖轉(zhuǎn)換成靜態(tài)計算圖,兼收執(zhí)行效率和編碼效率之利。

當(dāng)然Autograph機(jī)制能夠轉(zhuǎn)換的代碼并不是沒有任何約束的,有一些編碼規(guī)范需要遵循,否則可能會轉(zhuǎn)換失敗或者不符合預(yù)期。

我們將著重介紹Autograph的編碼規(guī)范和Autograph轉(zhuǎn)換成靜態(tài)圖的原理。

并介紹使用tf.Module來更好地構(gòu)建Autograph。

本篇我們介紹使用Autograph的編碼規(guī)范。

一,Autograph編碼規(guī)范總結(jié)

1,被@tf.function修飾的函數(shù)應(yīng)盡可能使用TensorFlow中的函數(shù)而不是Python中的其他函數(shù)。例如使用tf.print而不是print,使用tf.range而不是range,使用tf.constant(True)而不是True.

2,避免在@tf.function修飾的函數(shù)內(nèi)部定義tf.Variable.

3,被@tf.function修飾的函數(shù)不可修改該函數(shù)外部的Python列表或字典等數(shù)據(jù)結(jié)構(gòu)變量。

二,Autograph的機(jī)制原理???

當(dāng)我們第一次調(diào)用這個被@tf.function裝飾的函數(shù)時,第一件事情是創(chuàng)建計算圖。即創(chuàng)建一個靜態(tài)計算圖,跟蹤執(zhí)行一遍函數(shù)體中的Python代碼,確定各個變量的Tensor類型,并根據(jù)執(zhí)行順序?qū)⑺阕犹砑拥接嬎銏D中。 在這個過程中,如果開啟了autograph=True(默認(rèn)開啟),會將Python控制流轉(zhuǎn)換成TensorFlow圖內(nèi)控制流。

三,Autograph和tf.Module概述???

前面在介紹Autograph的編碼規(guī)范時提到構(gòu)建Autograph時應(yīng)該避免在@tf.function修飾的函數(shù)內(nèi)部定義tf.Variable.

但是如果在函數(shù)外部定義tf.Variable的話,又會顯得這個函數(shù)有外部變量依賴,封裝不夠完美。

一種簡單的思路是定義一個類,并將相關(guān)的tf.Variable創(chuàng)建放在類的初始化方法中。而將函數(shù)的邏輯放在其他方法中。

這樣一頓猛如虎的操作之后,我們會覺得一切都如同人法地地法天天法道道法自然般的自然。

驚喜的是,TensorFlow提供了一個基類tf.Module,通過繼承它構(gòu)建子類,我們不僅可以獲得以上的自然而然,而且可以非常方便地管理變量,還可以非常方便地管理它引用的其它Module,最重要的是,我們能夠利用tf.saved_model保存模型并實現(xiàn)跨平臺部署使用。

實際上,tf.keras.models.Model,tf.keras.layers.Layer 都是繼承自tf.Module的,提供了方便的變量管理和所引用的子模塊管理的功能。

因此,利用tf.Module提供的封裝,再結(jié)合TensoFlow豐富的低階API,實際上我們能夠基于TensorFlow開發(fā)任意機(jī)器學(xué)習(xí)模型(而非僅僅是神經(jīng)網(wǎng)絡(luò)模型),并實現(xiàn)跨平臺部署使用。


參考資料:https://www.kesci.com/home/column/5d8ef3c3037db3002d3aa3a0(30天吃掉那只TensorFlow2.0)

分享

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容