Tensorflow筆記

轉載於人工智能實踐:Tensorflow筆記

基本概念

  • 基於 Tensorflow 的 NN:用張量表示數據,用計算圖搭建神經網絡,用會話執行計算圖,優化線上的權重(參數),得到模型。
  • 張量:張量就是多維數組(列表),用“階”表示張量的維度。
    0 階張量稱作標量,表示一個單獨的數; 舉例 S=123
    1 階張量稱作向量,表示一個一維數組; 舉例 V=[1,2,3]
    2 階張量稱作矩陣,表示一個二維數組,它可以有 i 行 j 列個元素,每個元素可以用行號和列號共同索引到;
    舉例 m=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    判斷張量是幾階的,就通過張量右邊的方括號數,0 個是 0 階,n 個是 n 階,張量可以表示 0 階到 n 階數組(列表);
    舉例 t=[ [ [… ] ] ]爲 3 階。
  • 數據類型:Tensorflow 的數據類型有 tf.float32tf.int32 等。
    例如 Tensorflow 的加法:
import tensorflow as tf       #引入模塊 
a = tf.constant([1.0, 2.0])   #定義一個張量等於[1.0,2.0] b = tf.constant([3.0, 4.0])   #定義一個張量等於[3.0,4.0] 
result = a+b                  #實現 a 加 b 的加法 
print(result)                 #打印出結果 

可以打印這樣一句話:

Tensor(“add:0”, shape=(2, ), dtype=float32)

意思爲 result 是一個名稱爲 add:0 的張量,shape=(2,)表示一維數組長度爲 2,
dtype=float32 表示數據類型爲浮點型。

  • 計算圖(Graph):搭建神經網絡的計算過程,是承載一個或多個計算節點的一張圖,只搭建網絡,不運算。

  • 神經網絡的基本模型是神經元,神經元的基本模型其實就是數學中的乘、加運算。

  • 我們搭建如下的計算圖:
    在這裏插入圖片描述
    x1、x2 表示輸入,w1、w2 分別是 x1 到 y 和 x2 到 y 的權重,y=x1*w1+x2*w2。
    我們實現上述計算圖:

import tensorflow as tf           #引入模塊 
x = tf.constant([[1.0, 2.0]])     #定義一個 2 階張量等於[[1.0,2.0]] 
w = tf.constant([[3.0], [4.0]])   #定義一個 2 階張量等於[[3.0],[4.0]] 
y = tf.matmul(x, w)          #實現 xw 矩陣乘法 
print(y)                          #打印出結果 

可以打印出這樣一句話:Tensor(“matmul:0”, shape(1,1), dtype=float32),從這裏我們可以看出,print 的結果顯示 y 是一個張量,只搭建承載計算過程的計算圖,並沒有進行實際的運算,如果我們想得到運算結果就需要使用到“會話 Session()”。

  • 會話(Session):執行計算圖中的節點運算。
    我們用 with 結構實現,語法如下:
with tf.Session() as sess: 
	print sess.run(y) 

對於剛剛所述計算圖,我們執行 Session()會話可得到矩陣相乘結果:

import tensorflow as tf           #引入模塊 
x = tf.constant([[1.0, 2.0]])     #定義一個 2 階張量等於[[1.0,2.0]] 
w = tf.constant([[3.0], [4.0]])   #定義一個 2 階張量等於[[3.0],[4.0]] y = tf.matmul(x, w)               #實現 xw 矩陣乘法 
print(y)                          #打印出結果 with tf.Session() as sess: 
print(sess.run(y))         		  #執行會話並打印出執行後的結果 可以打印出這樣的結果: 

打印出的結果爲:

Tensor(“matmul:0”, shape(1,1), dtype=float32) 
[[11.]]    

我們可以看到,運行Session()會話前只打印出y 是個張量的提示,運行Session()會話後打印出了 y 的結果 1.03.0 + 2.04.0 = 11.0。

神經網絡參數

  • 神經網絡的參數:是指神經元線上的權重 w,用變量表示,一般會先隨機生成
    這些參數。生成參數的方法是讓w 等於tf.Variable,把生成的方式寫在括號裏。 神經網絡中常用的生成隨機數/數組的函數有:
tf.random_normal()            生成正態分佈隨機數 
tf.truncated_normal()         生成去掉過大偏離點的正態分佈隨機數 
tf.random_uniform()           生成均勻分佈隨機數 
tf.zeros                      表示生成全 0 數組        
tf.ones                       表示生成全 1 數組       
tf.fill                       表示生成全定值數組     
tf.constant                   表示生成直接給定值的數組    

舉例:

  • ① w=tf.Variable(tf.random_normal([2,3],stddev=2, mean=0, seed=1)),表示生成正態分佈隨機數,形狀兩行三列,標準差是 2,均值是 0,隨機種子是 1。
  • ② w=tf.Variable(tf.Truncated_normal([2,3],stddev=2, mean=0, seed=1)),表示去掉偏離過大的正態分佈,也就是如果隨機出來的數據偏離平均值超過兩個 標準差,這個數據將重新生成。
  • ③ w=random_uniform(shape=7,minval=0,maxval=1,dtype=tf.int32,seed=1),表示從一個均勻分佈[minval maxval)中隨機採樣,注意定義域是左閉右開,即包含 minval,不包含 maxval。
  • ④ 除了生成隨機數, 還可以生成常量。tf.zeros([3,2],int32) 表示生成[[0,0],[0,0],[0,0]];tf.ones([3,2],int32)表示生成[[1,1],[1,1],[1,1];
    tf.fill([3,2],6)表示生成[[6,6],[6,6],[6,6]];tf.constant([3,2,1])表示生成[3,2,1]。
    注意:
  • ①隨機種子如果去掉每次生成的隨機數將不一致。
  • ②如果沒有特殊要求標準差、均值、隨機種子是可以不寫的。

神經網絡的搭建

當我們知道張量、計算圖、會話和參數後,我們可以討論神經網絡的實現過程了。
神經網絡的實現過程:

  1. 準備數據集,提取特徵,作爲輸入餵給神經網絡(Neural Network,NN)
  2. 搭建 NN 結構,從輸入到輸出(先搭建計算圖,再用會話執行)
    ( NN 前向傳播算法 ---------> 計算輸出)
  3. 大量特徵數據餵給 NN,迭代優化 NN 參數
    ( NN 反向傳播算法 ---------> 優化參數訓練模型)
  4. 使用訓練好的模型進行對未知數據的分類預測

 由此可見,基於神經網絡的機器學習主要分爲兩個過程,即訓練過程和使用過程。
 訓練過程是第一步、第二步、第三步的循環迭代,使用過程是第四步,一旦參數優化完成就可以固定這些參數,實現特定應用了。

前向傳播

  • 前向傳播就是搭建模型的計算過程,讓模型具有推理能力,可以針對一組輸入給出相應的輸出。
    假如輸入的特徵值是:體積 0.7 重量 0.5
    在這裏插入圖片描述由搭建的神經網絡可得,隱藏層節點 a11=x1* w11+x2*w21=0.14+0.15=0.29,同理算得節點 a12=0.32,a13=0.38,最終計算得到輸出層 Y=-0.015,這便實現了前向傳播過程。

  • 神經網絡共有幾層(或當前是第幾層網絡)都是指的計算層,輸入不是計算層。

反向傳播

  • 反向傳播:訓練模型參數,在所有參數上用梯度下降,使 NN 模型在訓練數據上的損失函數最小。

  • 損失函數(loss):計算得到的預測值 y 與已知答案 y_的差距。 損失函數的計算有很多方法,均方誤差 MSE 是比較常用的方法之一。

  • 均方誤差 MSE:求前向傳播計算結果與已知答案之差的平方再求平均。
    在這裏插入圖片描述

  • 反向傳播訓練方法:以減小 loss 值爲優化目標,有梯度下降、momentum 優化器、adam 優化器等優化方法。
    這三種優化方法用 tensorflow 的函數可以表示爲:

train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss) 
train_step=tf.train.MomentumOptimizer(learning_rate, momentum).minimize(loss) 
train_step=tf.train.AdamOptimizer(learning_rate).minimize(loss) 

三種優化方法區別如下:

  • ①tf.train.GradientDescentOptimizer()使用隨機梯度下降算法,使參數沿着梯度的反方向,即總損失減小的方向移動,實現更新參數。
  • 在這裏插入圖片描述

參數更新公式是
在這裏插入圖片描述
其中,𝐽(𝜃)爲損失函數,𝜃爲參數,𝛼爲學習率。

  • ②tf.train.MomentumOptimizer()在更新參數時,利用了超參數,參數更新公式是
    在這裏插入圖片描述
    其中,𝛼爲學習率,超參數爲𝛽,𝜃爲參數,𝑔(𝜃𝑖−1)爲損失函數的梯度。
  • ③tf.train.AdamOptimizer()是利用自適應學習率的優化算法,Adam 算法和隨機梯度下降算法不同。隨機梯度下降算法保持單一的學習率更新所有的參數,學習率在訓練過程中並不會改變。而 Adam 算法通過計算梯度的一階矩估計和二階矩估計而爲不同的參數設計獨立的自適應性學習率。
  • 學習率:決定每次參數更新的幅度。
    優化器中都需要一個叫做學習率的參數,使用時,如果學習率選擇過大會出現震盪不收斂的情況,如果學習率選擇過小,會出現收斂速度慢的情況。我們可以選個比較小的值填入,比如 0.01、0.001。

搭建神經網絡的步驟

神經網絡的搭建課分四步完成:準備工作、前向傳播、反向傳播和循環迭代。
1.導入模塊,生成模擬數據集;
import
常量定義
生成數據集
2.前向傳播:定義輸入、參數和輸出
x=       y_=
w1=     w2 =
a=       y =
3. 反向傳播:定義損失函數、反向傳播方法
loss=
train_step=
4. 生成會話,訓練 STEPS 輪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章