1. 程式人生 > >tensorflow新手入門學習筆記

tensorflow新手入門學習筆記

tensorflow新手入門學習筆記

入門基本內容

tensorflow是一個很有意思的框架。tensor是這個框架裡的一個主要的資料型別,本質類似一個多維陣列。框架的主體是,一般只使用預設圖即可。高階用法可以管理多個圖。在這個框架中所有運算(option)都是一個節點,資料(tensor)就在不同的節點間流動(flow),通過運算髮生改變,這就是tensorflow名稱的由來。在建立階段,將需要的節點加入圖中,之後通過圖呼叫不同節點進行運算。不同節點之間是並行執行的。

option

option即節點,就像是一個函式,資料傳進來,然後返回運算後的結果。
新增option的語法為 y = tf.option(x1,x1,…,xn)。
其中輸入輸出均為tensor,一般輸入都是其他option的輸出。如果需要使用臨時

的tensor作為輸入,則需要使用以下程式碼。

x1 = tf.placeholder(tf.types.float32)

這行程式碼就建立了一個float32型別的臨時tensor,實際使用時需要給input1臨時賦值,使用feed語句。

feed_dict={x1:[7.]}

完整程式碼示例如下:

x1 = tf.placeholder(tf.types.float32) #建立一個臨時tensor
x2 = tf.constant(3.0) #建立一個返回常量的option
y = tf.add(x1 , x2) #建立一個執行加法的option

feed語句在呼叫時使用,後面講。

變數

在tensorflow中使用tf.Variable建立變數:

#建立一個值為0,名字為“one_variable”的變數
x = tf.Variable(0, name = "one_variable")

變數有很多操作,因為剛入門,只寫最簡單的賦值操作:

x = tf.Variable(0., name = "one_variable") #建立變數
value = tf.constant(2.0) #建立常量
update = tf.assign(x, value) #用value給x賦值,注意要型別相同

框架的啟動

tensorflow框架的主體是,程式的運算節點都是新增在裡的,在執行時通過取得節點的運算結果。

sess = tf.Session() #建立圖物件,沒有引數的預設情況下啟動預設圖

要通過取得節點的運算結果,就要了解tensorflow中的fetch概念。
fetch英文原義是去某個地方取得某個東西,這裡的意思也類似。fetch指從中獲取某一個或者某幾個節點的運算結果。
程式碼如下:

x1 = tf.constant(2.0)           #一個返回常量值的節點
x2 = tf.constant(3.0)           #另一個返回常量值的節點
sess = tf.Session()             #建立圖物件
y = sess.run(x1)                #執行圖,取得x1值並返回,即fetch
print(y)                        #輸出y
#輸出結果:2.0
y = sess.run([x1, x2])          #執行圖,取得x1, x2值並返回,即fetch
print(y)                        #輸出y
#輸出結果:[2.0, 3.0]

需要注意的是,在節點沒有先後順序,是並行的。fetch時,會自動執行所有涉及到的節點,一次取回所有結果。
下面就附上入門篇比較完整的程式碼,慶祝自己又熟練掌握了一種“Hello, World!”:

import tensorflow as tf

#基本變數與常量節點定義
hello = tf.constant('Hello, World!')
one = tf.constant(1.0)
three = tf.constant(3.0)
temp = tf.placeholder(tf.float32)
variable = tf.Variable(0.0, name = 'counter')

#主要計算節點定義
add_one_three = tf.add(one, three)
add_variable_one = tf.add(variable, one)
add_one_temp = tf.add(one, temp)
update = tf.assign(variable, add_variable_one)

#初始化節點,有變數時需要
init_op = tf.global_variables_initializer()

#建立圖物件
sess = tf.Session()

#初始化
sess.run(init_op)

#計算與輸出
y = sess.run(hello)
print(y)
#輸出:b'Hello, World'

y = sess.run([one, three])
print(y)
#輸出:[1.0, 3.0]

y = sess.run(add_one_three)
print(y)
#輸出:4.0

y = sess.run(add_one_temp, feed_dict = {temp: 9.0})
print(y)
#輸出:10.0

for i in range(3):
    sess.run(update)
    y = sess.run(variable)
    print(y)
#輸出:
#1.0
#2.0
#3.0

#關閉圖
sess.close()

tensorflow執行時兩個警告消除方法

在跑demo的過程中一直有兩個警告,雖然沒有什麼影響,但是還是很不舒服,一頓操作後終於解決了這兩個問題。

FutureWarning: Conversion of the second argument of issubdtype from float to np.floating is deprecated. In future, it will be treated as np.float64 == np.dtype(float).type.

這個是庫裡h5py包版本過舊,更新即可,使用命令:

pip install h5py==2.8.0rc1

更新後警告就消失了。

Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2

這個是因為tensorflow支援對cpu的優化,但是預設安裝的tensorflow都是X86_64的SIMD版本,跟AVX2的SIMD版本cpu指令集不同。
解決辦法就是先解除安裝現有的tensorflow,使用指令:

pip uninstall tensorflow

然後在github上找到自己版本的tensorflow下載。
連結如下:
windows
其他作業系統
我下載的是1.12.0\py36\CPU\avx2,因為我的python版本是3.6,之後使用指令:

pip install tensorflow-1.12.0-cp36-cp36m-win_amd64.whl

重新安裝下載的tensorflow即可。
注:下載不同版本的tensorflow使用的安裝指令也不同,先在cmd中進入下載檔案所在的目錄再使用指令安裝,不然會找不到檔案。