TensorFlow框架用Python搭建神經網絡八股:準備,前傳,後傳,迭代

一、神經網絡的參數
√神經網絡的參數:是指神經元線上的權重 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、使用訓練好的模型預測和分類
由此可見,基於神經網絡的機器學習主要分爲兩個過程,即訓練過程和使用過程。
訓練過程是第一步、第二步、第三步的循環迭代,使用過程是第四步,一旦參數
優化完成就可以固定這些參數,實現特定應用了。
很多實際應用中,我們會先使用現有的成熟網絡結構,喂入新的數據,訓練相應
模型,判斷是否能對喂入的從未見過的新數據作出正確響應,再適當更改網絡結
構,反覆迭代,讓機器自動訓練參數找出最優結構和參數,以固定專用模型。
三、前向傳播
√前向傳播就是搭建模型的計算過程,讓模型具有推理能力,可以針對一組輸入
給出相應的輸出。
舉例
假如生產一批零件,體積爲 x1,重量爲 x2,體積和重量就是我們選擇的特徵,
把它們喂入神經網絡,當體積和重量這組數據走過神經網絡後會得到一個輸出。

假如輸入的特徵值是:體積 0.7 重量 0.5

由搭建的神經網絡可得,隱藏層節點 a11=x1* w11+x2*w21=0.14+0.15=0.29,同
理算得節點 a12=0.32,a13=0.38,最終計算得到輸出層 Y=-0.015,這便實現了
前向傳播過程。
√推導:
第一層
√X 是輸入爲 1X2 矩陣
用 x 表示輸入,是一個 1 行 2 列矩陣,表示一次輸入一組特徵,這組特徵包含了
體積和重量兩個元素。
√W 前節點編號,後節點編號(層數) 爲待優化的參數
對於第一層的 w 前面有兩個節點,後面有三個節點 w 應該是個兩行三列矩陣,
我們這樣表示:

√神經網絡共有幾層(或當前是第幾層網絡)都是指的計算層,輸入不是計算層,
所以 a 爲第一層網絡,a 是一個一行三列矩陣。
我們這樣表示:
a(1)=[a11, a12, a13]=XW(1)
第二層
√參數要滿足前面三個節點,後面一個節點,所以 W(2) 是三行一列矩陣。
我們這樣表示:

我們把每層輸入乘以線上的權重 w,這樣用矩陣乘法可以計算出輸出 y 了。
a= tf.matmul(X, W1)
y= tf.matmul(a, W2)
由於需要計算結果,就要用 with 結構實現,所有變量初始化過程、計算過程都
要放到 sess.run 函數中。對於變量初始化,我們在 sess.run 中寫入
tf.global_variables_initializer 實現對所有變量初始化,也就是賦初值。對
於計算圖中的運算,我們直接把運算節點填入 sess.run 即可,比如要計算輸出
y,直接寫 sess.run(y) 即可。
在實際應用中,我們可以一次喂入一組或多組輸入,讓神經網絡計算輸出 y,可
以先用 tf.placeholder 給輸入佔位。如果一次喂一組數據 shape 的第一維位置
寫 1,第二維位置看有幾個輸入特徵;如果一次想喂多組數據,shape 的第一維
位置可以寫 None 表示先空着,第二維位置寫有幾個輸入特徵。這樣在 feed_dict
中可以喂入若干組體積重量了。
√前向傳播過程的 tensorflow 描述:
√變量初始化、計算圖節點運算都要用會話(with 結構)實現
with tf.Session() as sess:
sess.run()
√變量初始化:在 sess.run 函數中用 tf.global_variables_initializer()匯
總所有待優化變量。
init_op = tf.global_variables_initializer()
sess.run(init_op)
√計算圖節點運算:在 sess.run 函數中寫入待運算的節點
sess.run(y)
√用 tf.placeholder 佔位,在 sess.run 函數中用 feed_dict 喂數據
喂一組數據:
x = tf.placeholder(tf.float32, shape=(1, 2))
sess.run(y, feed_dict={x: [[0.5,0.6]]})
喂多組數據:
x = tf.placeholder(tf.float32, shape=(None, 2))
sess.run(y, feed_dict={x: [[0.1,0.2],[0.2,0.3],[0.3,0.4],[0.4,0.5]]})
舉例
這是一個實現神經網絡前向傳播過程,網絡可以自動推理出輸出 y 的值。
①用 placeholder 實現輸入定義(sess.run 中喂入一組數據)的情況
第一組喂體積 0.7、重量 0.5

coding:utf-8

import tensorflow as tf

定義輸入和參數

x=tf.placeholder(tf.float32,shape=(1,2))
w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))

定義前向傳播過程

a=tf.matmul(x,w1)
y=tf.matmul(a,w2)

用會話計算結果

with tf.Session() as sess:
init_op=tf.global_variables_initializer()
sess.run(init_op)
print ”y in tf3_3.py is:\n”,sess.run(y,feed_dict={x:[[0.7,0.5]]})
②用 placeholder 實現輸入定義(sess.run 中喂入多組數據)的情況
第一組喂體積 0.7、重量 0.5,第二組喂體積 0.2、重量 0.3,第三組喂體積 0.3 、
重量 0.4,第四組喂體積 0.4、重量 0.5.

coding:utf-8

import tensorflow as tf

定義輸入和參數

x=tf.placeholder(tf.float32,shape=(None,2))
w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))

定義前向傳播過程

a=tf.matmul(x,w1)
y=tf.matmul(a,w2)

用會話計算結果

with tf.Session() as sess:
init_op=tf.global_variables_initializer()
sess.run(init_op)
print”y in tf3_4.py is:\n”,sess.run(y,feed_dict={x:[[0.7,0.5],
[0.2,0.3],[0.3,0.4],[0.4,0.5]]})

3.3
一、反向傳播
√反向傳播:訓練模型參數,在所有參數上用梯度下降,使 NN 模型在訓練數據
上的損失函數最小。
√損失函數(loss):計算得到的預測值 y 與已知答案 y_的差距。
損失函數的計算有很多方法,均方誤差 MSE 是比較常用的方法之一。
√均方誤差 MSE:求前向傳播計算結果與已知答案之差的平方再求平均。

用 tensorflow 函數表示爲:
loss_mse = tf.reduce_mean(tf.square(y_ - y))
√反向傳播訓練方法:以減小 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()使用隨機梯度下降算法,使參數沿着
梯度的反方向,即總損失減小的方向移動,實現更新參數。

二、搭建神經網絡的八股
我們最後梳理出神經網絡搭建的八股,神經網絡的搭建課分四步完成:準備工作、
前向傳播、反向傳播和循環迭代。
√0.導入模塊,生成模擬數據集;
import
常量定義
生成數據集
√1.前向傳播:定義輸入、參數和輸出
x= y_=
w1= w2=
a= y=
√2. 反向傳播:定義損失函數、反向傳播方法
loss=
train_step=
√3. 生成會話,訓練 STEPS 輪
with tf.session() as sess
Init_op=tf. global_variables_initializer()
sess_run(init_op)
STEPS=3000
for i in range(STEPS):
start=
end=
sess.run(train_step, feed_dict:)
舉例
隨機產生 32 組生產出的零件的體積和重量,訓練 3000 輪,每 500 輪輸出一次損
失函數。下面我們通過源代碼進一步理解神經網絡的實現過程:
0.導入模塊,生成模擬數據集;

1.定義神經網絡的輸入、參數和輸出,定義前向傳播過程;

  1. 定義損失函數及反向傳播方法

3.生成會話,訓練 STEPS 輪

由神經網絡的實現結果,我們可以看出,總共訓練 3000 輪,每輪從 X 的數據集
和 Y 的標籤中抽取相對應的從 start 開始到 end 結束個特徵值和標籤,喂入神經
網絡,用 sess.run 求出 loss,每 500 輪打印一次 loss 值。經過 3000 輪後,我
們打印出最終訓練好的參數 w1、w2。

這樣四步就可以實現神經網絡的搭建了。

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