一.簡介node
1.tensorflow (tensor+flow)(張量+流動):維度(dimension number)(秩)(Rank)爲0、一、2時分別稱爲標量(數字)(scalar)、向量(vector)(一維數組)和矩陣(二維數組),維度爲3時是3階張量,維度大於3時是N階張量。張量(數據結構:多維數組)本質是數據,因此tensorflow是用來處理數據(張量)流動的框架,尤爲多維張量,較多涉及機器學習和深度學習等。流:計算模型:張量之間經過計算而轉換的過程python
2.tensorflow利用了數據流圖,(數據流圖用「結點」(nodes)和「線」(edges)的有向圖來描述數學計算),因此tensorflow包括 數據(Data)、流(Flow)、圖(Graph)三大部分。數組
3.Tensorflow架構分爲三個部分:預處理數據、tensor創建模型、訓練和評估模型。瀏覽器
4.TensorBoard能夠圖形化和直觀地監控TensorFlow正在作什麼。網絡
5.使用圖(Graph)表示計算流程,在會話(Session)中執行圖,使用張量(Tensor)表示數據,使用變量(Variable)維護狀態,使用feed和fetch爲任意的操做賦值或從中獲取數據session
6.運行過程:(1)建立或導入數據,(2)建立圖(結構):一個計算任務中的全部變量和計算方式、、、數據結構
7.它是開放源代碼軟件庫,用於高性能數值計算,將計算工做部署到多種平臺GPU,CPU等設備()架構
二.構建計算圖並執行框架
1.計算圖(至關於數據流圖):計算圖上每一個節點爲一個張量對象(操做或張量),節點之間的邊表示計算之間的關係(即數據傳遞)(實線--數據流動,虛線--控制依賴)。邊是有方向的,代表運行的順序dom
2.計算圖的構建包括節點和邊。
(1)節點能夠有0個或多個輸出,但只能有一個輸出。包括:常量、變量、佔位符;
(2)邊表示運算操做之間流動的張量
(3)計算圖的執行要經過session會話對象。
常量
1 import tensorflow as tf # 導入包 2 3 # 定義常量,它將做爲一個節點加入到默認計算圖內,它運行時值不會改變,無需初始化 4 # 1.定義的常量能夠是字符串,數字,張量... 5 t_1 = tf.constant('常量') 6 t_2 = tf.constant([4, 3, 2]) 7 t_3 = tf.constant(4) 8 9 # 2.屬性name可選,建議寫(tensorboard可視化),類型dtype=None, 形狀shape=None 10 ten1 = tf.constant([[1,2,3],[2,4,5]], dtype=tf.float16, shape=[3,2],name='tens1') 11 12 # 3.能夠建立特殊常量(張量對象),相似numpy建立數組 13 t_4 = tf.zeros([3,2],tf.int32) # 建立一個全部元素爲零的張量 14 t_5 = tf.ones([2,5],tf.int32) # 建立一個全部元素都設爲 1 的張量 15 t_6 = tf.linspace(2.0,5.0,5) # 等差序列 16 t_7 = tf.range(10) # 生成一個數字序列 17 t_8 = tf.random_normal([2, 3]) # 建立一個正態分佈隨機數組 18 t_9 = tf.random_crop(t_8,[2,5],seed=12) # 將給定的張量隨機裁剪爲指定的大小 19 t_10 = tf.random_shuffle(t_8) # 以隨機的順序來呈現訓練樣本 20 tf.set_random_seed(54) # 爲全部隨機產生的張量設置種子 21 22 # 上下文管理,創建對話(session)並顯示運行(run)結果,並關閉會話(session),釋放資源 23 with tf.Session() as sess: 24 print(t_2) # 一個張量對象 25 print(sess.run(t_2)) # 運行張量對象並獲取值 26 print(t_2.eval()) # 獲取張量值, 27 --------------------------------------------------------- 28 [4 3 2] 29 [4 3 2]
變量
1 import tensorflow as tf 2 # Varial(value,name)變量,運行過程當中會改變,建立時必須有顯示初始化的常量/隨機值 3 4 # 變量要有初始化操做,變量一般在神經網絡中表示權重和偏置 5 t_1 = tf.Variable(2, name='w1') # 建立變量(值,類型,名稱) 6 t_2 = tf.Variable(4, name='w2') 7 t_3 = tf.assign(t_1, t_2) # assign更新節點,替代賦值, 8 # init_op = t_1.initializer() # 個別變量初始化 9 10 with tf.Session() as sess: 11 init = tf.global_variables_initializer() # 在它以前全部變量初始化,本質是一個操做靜態節點 12 sess.run(init) # 必須運行(初始化變量)這個操做 13 print(sess.run(t_1)) 14 print(sess.run(t_2)) 15 print(sess.run(t_3)) 16 --------------------------------------------------- 17 2 18 4 19 4
佔位符
1 # 佔位符 placeholder ,有些變量定義時不知道其值,只有真正開始運行程序時才由外部輸入,好比訓練數據,這時候須要佔位符 2 # tf.placeholder(dtype,shape=None,name=None) 相似動態變量,函數的參數或c、python中格式化輸出時的%佔位符 3 # feed提交數據,Fetch提取數據 4 import tensorflow as tf 5 6 a = tf.placeholder(tf.float32, name='A') # 佔位符,無需初始化,但運行時需feed_dict字典傳參 7 b = tf.placeholder(tf.float32, name='B') 8 c = tf.multiply(a, b, name='C') 9 d= tf.subtract(a, b, name='D') 10 11 init = tf.global_variables_initializer() 12 13 with tf.Session() as sess: 14 sess.run(init) 15 result = sess.run(c, feed_dict={a: 8.0, b: 3.5}) # feed_dict字典格式參數傳值 16 result2 = sess.run([c,d], feed_dict={a: [8.0,2.0,6.3], b: [6.2,3.2,3.5]}) # 返回值相似列表 17 # 多個操做能夠經過一次feed完成執行 18 print(result2[0]) # 取第一個c 19 ------------------------------------------- 20 [49.6 6.4 22.050001]
會話:擁有並管理tensorflow程序運行時的全部資源,當計算完成時須要關閉會話幫助系統回收資源
1 #會話,Tensorflow不會自動生成默認的會話,須要手動指定 2 import tensorflow as tf 3 tf.reset_default_graph() # reset_default_graph() 清除計算圖default graph 和不斷增長的節點 4 value = tf.Variable(0, name='value',trainable=False) #無需參加訓練 5 sess = tf.Session() 6 with sess.as_default(): #指定默認會話,則能夠經過tf.Tensor.eval函數來計算一個張量的取值 7 print(value.eval()) #eval必需要有默認會話,若上面沒有指定則print(re.eval(session=sess)) 8 9 # 2.在交互式環境下設置默認會話 10 sess = tf.InteractiveSession() # 自動地將生成的會話註冊爲默認會話 11 print(value.eval()) 12 sess.close()
(4)其餘
shape(a,b,c,...)#a最外圍元素個數,b次外圍元素個數,
.get_shape()得到張量的結構
dtype類型(14):默認:不帶小數點會被認爲int32,帶小數點會被認爲float32
三.可視化tensorboard
利用日誌
1 #tensorboard 是 tensorflow的可視化工具 2 # 經過tensorflow程序運行過程當中輸出的日誌文件可視化tensorflow程序的運行轉檯 3 # tb和tf程序跑在不一樣的進程中 4 # 1.定義日誌存放路徑 5 import tensorflow as tf 6 tf.reset_default_graph() # 清除計算圖default graph 和不斷增長的節點 7 logdir = 'E:\python_work\machine_learning\tensflow_learning' # 存放日誌的路徑 8 9 # 構建一個計算圖,定義要顯示的信息 10 value = tf.Variable(0, name='value') 11 one = tf.constant(1) 12 new_value = tf.add(value, one) 13 updata_value = tf.assign(value, new_value) # 更新節點,替代賦值 14 # 建立一個操做,用於記錄損失值loss,後面在tensorboard中scalars中可見 15 # sum_loss_op = tf.summary.scalar('loss',loss_function) 16 # tf.summary.image('input',image,10) #輸入的樣本圖像加入summary 17 # tf.summary.histogram('forward',forward),前向輸出值在以直方圖顯示 18 # tf.summary.scalar('loss',loss_function) 將loss損失以標量顯示 19 # tf.summary.scalar('accuracy',accuracy) 將accuracy以標量顯示 20 init = tf.global_variables_initializer() # 變量初始化 21 22 with tf.Session() as sess: 23 sess.run(init) # 執行初始化操做 24 for _ in range(10): 25 sess.run(updata_value) 26 print(sess.run(value)) 27 28 #構建結束 29 30 # 3.生成一個寫日誌的writer,並將當前的Tensorflow計算圖寫入日誌 31 merged_summary_op = tf.summary.merge_all() #合併全部summary 32 writer = tf.summary.FileWriter(logdir,tf.get_default_graph()) 33 writer.close() 34 35 # 4.利用存儲的日誌啓動tensorboard 36 # 在anaconda prompt中先進入日誌存放的目錄(重要) 37 # 在運行tensorboard ,並將日誌的地址指向程序日誌輸出的地址 38 # 命令:tensorboard --logdir=/path/log 39 # 啓動服務的端口默認爲6006;使用--port參數能夠改變啓動服務的端口 40 #最後瀏覽器查看
四.CPU和GPU
GPU:優先考慮,計算密集型的程序,易於並行的程序,速度快
CPU:適合矩陣運算,神經網絡的處理過程正好適合GPU發揮性能