在前邊幾期的文章中,筆者已經用TensorFlow進行的一些基礎性的探索工做,想必你們對TensorFlow框架也是很是的好奇,本着發揚雷鋒精神,筆者將詳細的闡述TensorFlow框架的基本用法,並盡力作到通俗易懂,對得起讀者花費的時間。python
行文目錄linux
本文從如下三個方面,展開對TensorFlow的剖析:git
TensorFlow框架概述數組
TensorFlow基本操做瀏覽器
TensorBoard使用網絡
TensorFlow框架概述app
2015年11月9日,爲加速深度學習的發展,Google發佈了深度學習框架TensorFlow,通過幾年的發展,TensorFlow成爲了最流行的深度學習框架。框架
TensorFlow從名字上解釋就是Tensor(張量)+Flow(流)。什麼是張量呢?張量是矢量概念的推廣,能夠表示任意維度的數據,如一維數組,二維矩陣,N維數據。TensorFlow的運行過程實質就是張量從圖的一端流動到另外一端的計算過程。下文簡單闡述TensorFlow的一些基本概念。dom
圖函數
深度學習框架分爲「動態計算圖」和「靜態計算圖」,支持動態計算圖的被稱爲動態框架,支持靜態計算圖的被稱爲靜態框架。
靜態框架:先定義計算執行順序和內存分配策略,而後按照規定的計算順序和資源進行計算。打個比方,在蓋大樓的時候,靜態框架就比如設計師團隊與施工團隊分離,設計師設計好圖紙以後,施工團隊纔開始按照圖紙方案進行施工。
動態框架:聲明和執行一塊兒執行。相似於設計師和施工團隊一起工做,設計師說先「打地基」,施工團隊就開始施工打地基。
TensorFlow支持靜態和動態兩種方式,通常TensorFlow程序分爲兩個階段,圖的構建階段和圖的執行階段。
操做
圖中節點就是一個操做,好比,一次加法運算就是一個操做,構建變量的初始值也是一個操做。構建圖的過程當中,須要把全部操做肯定下來,好比指定操做在哪臺設備上執行。一些基本操做以下所示:
1#定義變量a操做
2a = tf.Variable(1.0, name="a")
3#定義操做b=a+1
4b = tf.add(a, 1, name="b")
5#定義操做c=b+1
6c = tf.add(b, 1, name="c")
7#定義操做d=b+10
8d = tf.add(b, 10, name="d")
操做之間存在依賴關係,這種依賴被稱爲邊,操做與邊相鏈接就構成了一張圖,如圖1所示:
圖1 數據流圖
會話
TensorFlow的計算須要在會話中執行,當建立一個會話時,若是沒有傳遞參數,會啓動默認的圖來構造圖結構,並將圖中定義的操做根據定義狀況分發到CPU或者GPU上執行。
1import tensorflow as tf
2#定義常量
3v1 = tf.constant(1, name="value1")
4v2 = tf.constant(1, name="value2")
5#v1+v2
6add_op = tf.add(v1, v2, name="add_op_name")
7#建立會話
8with tf.Session() as sess:
9 result = sess.run(add_op)
10 print("1 + 1 = %.0f" % result)
TensorFlow基本操做
定義常量、變量和佔位符
定義常量:a = tf.constant(1, name="value1")
定義變量:v2 = tf.Variable(0.01,name=」weight2」)
注意:變量須要通過初始化以後才能使用,常量不須要
定義佔位符:v3 = tf.placeholder("float")
1import tensorflow as tf
2#定義常量
3a = tf.constant(1, name="value1")
4#定義變量
5v1 = tf.Variable(0.001)
6v2 = tf.Variable(v1.initialized_value() * 2)
7#定義佔位符
8v3 = tf.placeholder("float")
9v4 = tf.placeholder("float")
10y = tf.mul(v3, v4) #構造一個op節點
11
12init = tf.global_variables_initializer()
13with tf.Session() as sess:
14 #變量初始化
15sess.run(init)
16 print("v1 is:")
17 print(sess.run(v1))
18 print("v2 is:")
19 print(sess.run(v2))
20#佔位符操做
21 print sess.run(y, feed_dict={v3: 3, v4: 3})
TensorFlow函數
筆者對TensorFlow中經常使用的函數進行了簡單彙總,可是並非很是全面,若是有須要,後續筆者會單獨寫一篇文章來詳細的描述TensorFlow中函數的用法。
表1 TF經常使用函數彙總
函數族 | 函數介紹 | 經常使用函數 |
---|---|---|
Math | 數學函數 | add(加), sub(減), mul(乘), Div(除),mod(取模)、abs(取絕對值)、log(計算log)、sin(正弦) |
Array | 數組操做 | concat(合併), slice(切片), Split(分割) |
Matrix | 矩陣操做 | diag(返回一個只有對角線的矩陣)、matul(矩陣相乘), matrix_inverse(求逆矩陣), matrix_determinant(求行列式) |
Activation Functions | 激活函數 | relu、relu六、sigmoid、tanh、dropout |
Convolution | 卷積函數 | conv2d、conv3d |
Pooling | 池化函數 | avg_pool(平均池化)、max_pool、max_pool_with_argmax、avg_pool3d、max_pool3d |
Normalization | 數據標準化 | l2_normalize(2範數標準化)、normalize_moments(均值方差歸一化) |
Losses | 損失函數 | l2_loss(偏差平方和) |
Classification | 分類函數 | sigmoid_cross_entropy_with_logits(交叉熵)、softmax、log_softmax、softmax_cross_entropy_with_logits |
Recurrent Neural Networks | 循環神經網絡 | rnn、bidirectional_rnn(雙向rnn)、state_saving_rnn(可存儲調用狀態rnn) |
Checkpointing | 模型保存與加載 | save(存儲), restore(裝載) |
TensorBoard使用
當訓練一個複雜的神經網絡時候,常常會根據狀況調整網絡結構。好比,在訓練過程當中根據訓練集和驗證集的準確率,來判斷是否存在過擬合,或者查看訓練過程當中損失函數。通常能夠將這些數據打印到日誌文件,可是當信息比較多的時候,直接看日誌文件不直觀。爲了更好的理解、調試和優化網絡,TensorFlow提供了一套數據可視化工具TensorBoard。
下邊舉一個例子來演示一下如何收集訓練過程當中的數據,而且利用TensorBoard將數據展現出來。本例中要進行線性擬合,擬合的函數大體爲,但2和10事先不知道,經過訓練獲得。訓練的完整代碼以下:
1#coding=utf-8
2import numpy as np
3import tensorflow as tf
4
5# 構建圖
6x = tf.placeholder(tf.float32)
7y = tf.placeholder(tf.float32)
8weight = tf.get_variable("weight", [], tf.float32, initializer=tf.random_normal_initializer())
9biase = tf.get_variable("biase", [], tf.float32, initializer=tf.random_normal_initializer())
10pred = tf.add(tf.multiply(x, weight, name="mul_op"), biase, name="add_op")
11
12#損失函數
13loss = tf.square(y - pred, name="loss")
14#優化函數
15optimizer = tf.train.GradientDescentOptimizer(0.01)
16#計算梯度,應用梯度操做
17grads_and_vars = optimizer.compute_gradients(loss)
18train_op = optimizer.apply_gradients(grads_and_vars)
19
20#收集值的操做
21tf.summary.scalar("weight", weight)
22tf.summary.scalar("biase", biase)
23tf.summary.scalar("loss", loss[0])
24
25merged_summary = tf.summary.merge_all()
26
27summary_writer = tf.summary.FileWriter('./log_graph' )
28summary_writer.add_graph(tf.get_default_graph())
29init_op = tf.global_variables_initializer()
30
31with tf.Session() as sess:
32 sess.run(init_op)
33 for step in range(500):
34 train_x = np.random.randn(1)
35 train_y = 2 * train_x + np.random.randn(1) * 0.01 + 10
36 _, summary = sess.run([train_op, merged_summary], feed_dict={x:train_x, y:train_y})
37 summary_writer.add_summary(summary, step)
執行代碼以後,會將日誌文件寫入log_graph文件夾下,執行以下命令運行TensorBoard:
1tensorboard --logdir=./log_graph
而後在瀏覽器中輸入:http://ip:6006,打開TensorBoard的界面,從界面能夠看到:
(1)圖的結構
圖2 數據流圖
(2)損失函數變化
圖3 損失函數變化圖
(3)擬合係數變化:
圖4 係數和截距項變化圖
從上圖能夠直觀看出,隨着訓練的次數增長,係數趨近2,截距項趨近10,偏差愈來愈小。