Python Tensor FLow簡單使用方法實(shí)例詳解
本文實(shí)例講述了Python Tensor FLow簡單使用方法。分享給大家供大家參考,具體如下:
1、基礎(chǔ)概念
Tensor表示張量,是一種多維數(shù)組的數(shù)據(jù)結(jié)構(gòu)。Flow代表流,是指張量之間通過計(jì)算而轉(zhuǎn)換的過程。TensorFLow通過一個(gè)計(jì)算圖的形式表示編程過程,數(shù)據(jù)在每個(gè)節(jié)點(diǎn)之間流動(dòng),經(jīng)過節(jié)點(diǎn)加工之后流向下一個(gè)節(jié)點(diǎn)。
計(jì)算圖是一個(gè)有向圖,其組成如下:節(jié)點(diǎn):代表一個(gè)操作。邊:代表節(jié)點(diǎn)之間的數(shù)據(jù)傳遞和控制依賴,其中實(shí)線代表兩個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)傳遞關(guān)系,虛線代表兩個(gè)節(jié)點(diǎn)之間存在控制相關(guān)。
張量是所有數(shù)據(jù)的表示形式,可以將其理解為一個(gè)多維數(shù)組。零階張量就是標(biāo)量(scalar),表示一個(gè)數(shù),一階張量為一維數(shù)組,即向量(vector)。n階張量也就是n維數(shù)組。張量并不保存具體數(shù)字,它保存的是計(jì)算過程。
下面的例子是將節(jié)點(diǎn)1、2的值相加得到節(jié)點(diǎn)3。
import tensorflow as tf node1=tf.constant(3.0,tf.float32,name='node1') #創(chuàng)建浮點(diǎn)數(shù)節(jié)點(diǎn) node2=tf.constant(4.0,tf.float32,name='node2') node3=tf.add(node1,node2) #節(jié)點(diǎn)三進(jìn)行相加操作,源于節(jié)點(diǎn)1、2 ses=tf.Session() print(node3) #輸出張量:Tensor("Add_3:0", shape=(), dtype=float32) print(ses.run(node3)) #通過會(huì)話運(yùn)行節(jié)點(diǎn)三,將節(jié)點(diǎn)1、2相加,輸出:7.0 ses.close() #不使用時(shí),關(guān)閉會(huì)話
直接print(node3)輸出的結(jié)果不是具體的值,而是張量結(jié)構(gòu)。因?yàn)閯?chuàng)建計(jì)算圖只是建立了計(jì)算模型,只有會(huì)話執(zhí)行run()才能獲得具體結(jié)果。
Tensor("Add_3:0", shape=(), dtype=float32)中,Add表示節(jié)點(diǎn)名稱,3表示這是該節(jié)點(diǎn)的第3個(gè)輸出。shape表示張量的維度信息,()代表標(biāo)量。dtype表示張量的類型,每個(gè)張量的類型唯一,如果不匹配會(huì)報(bào)錯(cuò),不帶小數(shù)點(diǎn)的默認(rèn)類型為int32,帶小數(shù)點(diǎn)默認(rèn)為float35。下面的例子為更復(fù)雜的張量類型:
tensor1=tf.constant([[[1,1,1],[1,2,1]], [[2,1,1],[2,2,1]], [[3,1,1],[3,2,1]], [[4,1,1],[4,2,1]]],name='tensor1') print(tensor1) ss=tf.Session() print(ss.run(tensor1)[3,0,0]) #訪問tensor1的具體元素 #輸出:Tensor("tensor1:0", shape=(4, 2, 3), dtype=int32) 4
其中shape=(4,2,3)表示tensor1的最外層有4個(gè)數(shù)組,每個(gè)數(shù)組內(nèi)有2個(gè)子數(shù)組,子數(shù)組由3個(gè)數(shù)字構(gòu)成??梢酝ㄟ^多維數(shù)組的方式訪問其中的具體元素,[3,0,0]即為第四個(gè)數(shù)組中第一個(gè)子數(shù)組的第一個(gè)元素,4。
計(jì)算圖中還有的節(jié)點(diǎn)表示操作,例如加減乘除、賦初值等,操作有自己的屬性,需要在創(chuàng)建圖的時(shí)候就確定,操作之間有先后等依賴關(guān)系,通過圖的邊可以直觀地看出來。
2、運(yùn)算
會(huì)話
會(huì)話(Session)擁有并管理TensorFLow的所有資源,通過Session運(yùn)行計(jì)算才能得到結(jié)果,計(jì)算完成后記得關(guān)閉會(huì)話回收資源。下面是使用Session的流程:
#定義計(jì)算圖 tensor1=tf.constant([1,2,3]) #創(chuàng)建會(huì)話 ss=tf.Session() #利用會(huì)話進(jìn)行計(jì)算操作 print(ss.run(tensor1)) #關(guān)閉會(huì)話 ss.close()
也可以通過python上下文管理器來使用Session,當(dāng)退出上下文時(shí)會(huì)自動(dòng)關(guān)閉Session并釋放資源
tensor1=tf.constant([1,2,3]) with tf.Session() as ss: #上下文管理器 print(ss.run(tensor1))
還可以通過指定默認(rèn)會(huì)話,使用eval()獲取張量的值:
tensor1=tf.constant([1,2,3]) ss=tf.Session() with ss.as_default(): #指定默認(rèn)會(huì)話 print(tensor1.eval())
在交互式環(huán)境下通過InteractiveSession()自動(dòng)將生成的會(huì)話設(shè)為默認(rèn):
tensor1=tf.constant([1,2,3]) ss=tf.InteractiveSession() #自動(dòng)注冊默認(rèn)會(huì)話 print(tensor1.eval()) ss.close()
變量、常量
TensorFLow通過constant函數(shù)完成對常量的定義,可以為其賦初值與命名
a=tf.constant(10,'int_a')
而變量不僅需要定義,還需要經(jīng)過初始化后才可以使用,初始化操作不僅需要定義,還需要執(zhí)行
node1=tf.Variable(3.0,name='node1') #定義變量 node2=tf.Variable(4.0,name='node2') res=tf.add(node1,node2,name='res') ss=tf.Session() init=tf.global_variables_initializer() #定義全部變量的初始化操作 ss.run(init) #執(zhí)行初始化操作 print(ss.run(res)) ss.close()
TensorFLow的變量一般不需要手動(dòng)賦值,因?yàn)橄到y(tǒng)會(huì)在訓(xùn)練過程中自動(dòng)調(diào)整。如果不希望由模型自動(dòng)賦值,可以在定義時(shí)指定屬性trainable=False,并通過assign函數(shù)來手動(dòng)賦值
var1=tf.Variable(0,name='var') one=tf.constant(1) var2=tf.add(var1,one) #變量1加1得到變量2 update=tf.assign(var1,var2) #定義update操作,將變量2賦值給變量1 init=tf.global_variables_initializer() ss=tf.Session() ss.run(init) for _ in range(10): ss.run(update) #執(zhí)行update操作 print(ss.run(var1)) ss.close() #輸出:1 2 3 4 5 6 7 8 9 10
在執(zhí)行ss.run(update)操作時(shí),由于update需要var1和var2依賴,而得到var2需要執(zhí)行add操作,因此只需要run一個(gè)update就會(huì)觸發(fā)整個(gè)計(jì)算網(wǎng)絡(luò)。
占位符
有時(shí)在定義變量的時(shí)候,并不知道它的具體值,只有在運(yùn)行的時(shí)候才輸入對應(yīng)數(shù)值,而tensorflow中變量的定義需要賦初值,這時(shí)就需要使用占位符placeholder來進(jìn)行定義,并在計(jì)算時(shí)傳入具體數(shù)值。一個(gè)簡單的使用例子:
node1=tf.placeholder(tf.float32,name='node1') #定義占位符,規(guī)定其類型、結(jié)構(gòu)、名字 node2=tf.placeholder(tf.float32,name='node2') m=tf.multiply(node1,node2,'multinode') ss=tf.Session() res=ss.run(m,feed_dict={node1:1.2,node2:3.4}) #在運(yùn)行時(shí)通過feed_dict為占位符賦值 print(res) ss.close()
也可以把多個(gè)操作放到一次feed操作完成
node1=tf.placeholder(tf.float32,[3],name='node1') #第二個(gè)參數(shù)規(guī)定占位符的類型為3維數(shù)組 node2=tf.placeholder(tf.float32,[3],name='node2') m=tf.multiply(node1,node2,'multinode') s=tf.subtract(node1,node2,'subnode') ss=tf.Session() #將m,s兩個(gè)操作放到一起,并返回兩個(gè)結(jié)果 resm,ress=ss.run([m,s],feed_dict={node1:[1.0,2.0,4.0],node2:[3.0,5.0,6.0]}) print(resm) #輸出:[ 3. 10. 24.] ss.close()
3、TensorBoard
TensorBoard是TensorFLow的可視化工具,通過程序運(yùn)行中輸出的日志文件可視化地表示TensorFLow的運(yùn)行狀態(tài)。其編程如下:
node1=tf.Variable(3.0,name='node1') node2=tf.Variable(4.0,name='node2') res=tf.add(node1,node2,name='res') ss=tf.Session() init=tf.global_variables_initializer() ss.run(init) print(ss.run(res)) ss.close() #清除default graph和其他節(jié)點(diǎn) tf.reset_default_graph() #定義日志存放的默認(rèn)路徑 logdir='D:\Temp\TensorLog' #生成writer將當(dāng)前的計(jì)算圖寫入日志 writer=tf.summary.FileWriter(logdir,tf.get_default_graph()) writer.close()
TensorBoard已經(jīng)隨Anaconda安裝完成,首先通過Anaconda Prompt進(jìn)入日志文件的存放目錄,然后輸入tensorboard --logdir=D:\Temp\TensorLog,設(shè)定日志的存放路徑,完成之后在瀏覽器的localhost:6006端口就可以看到TensorBoard,也可以通過--port命令修改默認(rèn)端口。
利用TensorBoard顯示圖片,通過summary.image()將格式化的圖片數(shù)據(jù)顯示,其中輸入的image_imput數(shù)據(jù)是四維格式,第一維表示一次輸入幾行數(shù)據(jù),-1表示不確定。28,28,1表示圖片數(shù)據(jù)為28×28大小,且其色彩通道為1。
通過summary.histogram()可以顯示直方圖數(shù)據(jù)。通過summary.scalar()可以顯示標(biāo)量數(shù)據(jù)。在所有summary定義完成后,可以通過summary.merge_all()函數(shù)定義一個(gè)匯總操作,將所有summary聚合起來。
在創(chuàng)建session后定義writer用于日志文件的寫入,在進(jìn)行訓(xùn)練時(shí),每批次訓(xùn)練都將執(zhí)行一次merge操作,并將結(jié)果寫入日志。
如下為通過多層神經(jīng)網(wǎng)絡(luò)解決MNIST手寫識(shí)別問題的例子,將其中的一些數(shù)據(jù)通過TensorBoard顯示出來:
#TensorBoard使用 #定義日志保存位置 log_dir='D:\Temp\MachineLearning\TensorLog' #顯示圖片 image_input=tf.reshape(x,[-1,28,28,1]) tf.summary.image('input',image_input,10) #一次最多顯示圖片數(shù):10 #顯示直方圖 tf.summary.histogram('Y',Y3) #顯示標(biāo)量loss tf.summary.scalar('loss',loss_function) tf.summary.scalar('accurancy',accuracy) #定義匯總summary操作 merge_op=tf.summary.merge_all() ss=tf.Session() ss.run(tf.global_variables_initializer()) #定義writer writer=tf.summary.FileWriter(log_dir,ss.graph) for epoch in range(train_epochs): for batch in range(batch_num): #分批次讀取數(shù)據(jù)進(jìn)行訓(xùn)練 xs,ys=mnist.train.next_batch(batch_size) ss.run(optimizer,feed_dict={x:xs,y:ys}) #執(zhí)行summary操作并將結(jié)果寫入日志文件 summary_str=ss.run(merge_op,feed_dict={x:xs,y:ys}) writer.add_summary(summary_str,epoch) loss,acc=ss.run([loss_function,accuracy],\ feed_dict={x:mnist.validation.images,y:mnist.validation.labels}) print('第%2d輪訓(xùn)練:損失為:%9f,準(zhǔn)確率:%.4f'%(epoch+1,loss,acc))
運(yùn)行結(jié)果如下圖所示分別為圖片、accuracy、loss標(biāo)量圖、Y1直方圖以及隨之生成的分布圖:
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python加密解密算法與技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python中比較大小的幾種方法實(shí)例總結(jié)
在Python編程中經(jīng)常需要比較兩個(gè)數(shù)的值,并根據(jù)大小關(guān)系進(jìn)行賦值操作,下面這篇文章主要給大家介紹了關(guān)于Python中比較大小的幾種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03conda與jupyter notebook kernel核環(huán)境不一致的問題解決
本文記錄在使用conda時(shí)候出現(xiàn)的問題,jupter notebook中的環(huán)境不一致導(dǎo)致的,具有一定的參考價(jià)值,感興趣的可以了解一下2023-05-05用Python實(shí)現(xiàn)服務(wù)器中只重載被修改的進(jìn)程的方法
這篇文章主要介紹了用Python實(shí)現(xiàn)服務(wù)器中只重載被修改的進(jìn)程的方法,包括用watchdog來檢測文件的變化等,實(shí)現(xiàn)起來充分體現(xiàn)了Python作為動(dòng)態(tài)語言的靈活性,強(qiáng)烈推薦!需要的朋友可以參考下2015-04-04python3調(diào)用百度翻譯API實(shí)現(xiàn)實(shí)時(shí)翻譯
這篇文章主要為大家詳細(xì)介紹了python3調(diào)用百度翻譯API,實(shí)現(xiàn)實(shí)時(shí)翻譯,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08python PIL Image 圖像處理基本操作實(shí)例
這篇文章主要介紹了python PIL Image 圖像處理基本操作實(shí)例包括圖片加載、灰度圖,圖像通道分離和合并,在圖像上輸出文字,圖像縮放,圖像閾值分割、 二值化,圖像裁剪需要的朋友可以參考下2022-04-04Python中的優(yōu)先隊(duì)列(priority?queue)和堆(heap)
這篇文章主要介紹了Python中的優(yōu)先隊(duì)列(priority?queue)和堆(heap),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09python使用itchat模塊給心愛的人每天發(fā)天氣預(yù)報(bào)
這篇文章主要介紹了python使用itchat模塊給心愛的人每天發(fā)天氣預(yù)報(bào),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11python 計(jì)算數(shù)組中每個(gè)數(shù)字出現(xiàn)多少次--“Bucket”桶的思想
這篇文章主要介紹了python 計(jì)算數(shù)組中每個(gè)數(shù)字出現(xiàn)多少次--“Bucket”桶的思想,需要的朋友可以參考下2017-12-12