一.概念回顧及補充
- 基於TensorFlow的NN(神經網絡):用張量表示數據,用計算圖搭建神經網絡,用會話session執行計算圖,優化線上的權重(參數),得到模型,最後進行測試
- 張量(tensor):多維數組(列表)
- 階:張量的維數
- 計算圖(Graph):搭建神經網絡的計算過程,只搭建,不運算
- 會話(Session):執行計算圖中的結點運算
- 神經網絡的參數:即計算圖中的權重,也可以說是神經元(後面會提到)線上的權重,用變量表示,一般會隨機生成這些參數。生成參數的方法是讓 w(神經元上的線) 等於 tf.Variable,把生成的方式寫在括號裏
- 神經網絡中常用的生成隨機數/數組的函數有:
-
其中Variable有4種:zeros,ones,fill,constant
-
tf.zeros····全0數組··············tf.zeros([3,2],int32) 生成[[0,0],[0,0],[0,0]]
tf.ones·····全1數組··············tf.ones([3,2],int32) 生成[[1,1],[1,1],[1,1]]
tf.fill·······全定值數組··············tf.fill([3,2],6) 生成[[6,6],[6,6],[6,6]]
tf.constant··直接給值··············tf.constant([3,2,1]) 生成[3,2,1]
二.神經網絡的搭建
2.1 神經網絡的實現過程:
- 1.準備數據,提取特徵,作爲輸入餵給神經網絡 (Neural Network,NN,神經網絡簡稱NN)的訓練集
- 2.搭建NN結構,從輸入到輸出(先搭建計算圖,再用會話執行)
(NN前向傳播算法 ===> 計算輸出) - 3.大量特徵數據餵給NN,迭代優化NN參數
(NN反向傳播算法 ===> 優化參數訓練模型) - 4.使用訓練好的模型,預測和分類
由此可見,基於神經網絡的機器學習主要分兩個過程,即訓練過程和使用過程,訓練過程是第一步(數據集準備),第二步(搭建神經網絡框架),第三步的循環迭代(優化線上參數),一旦參數優化完成就可以固定這些參數,模型確定就可以測試。
2.2 前向傳播:
前向傳播就是搭建模型計算過程,讓模型具有推理能力(以全連接網絡爲例),可以針對一組輸入給出相應的輸出
舉個例子:
生產一批零件將體積設 x1 和重量設 x2 爲特徵的輸入 NN,通過 NN 後輸出一個數值
分析:
- 體積和重量就是我們要選擇的特徵,把他們喂入神經網絡,當體積和重量這組數據走過神經網絡後,會得到一個輸出,
- 假設輸入的特徵是:體積:0.7,重量0.5
- 搭建的神經網絡:
- 由神經網絡可得,隱藏節點 a11 = x1w11 + x2w21 = 0.14 + 0.15 = 0.29
- 同理算得節點 a12 = 32,a13 = 0.38,最終計算得到輸出層 Y= 0.015
- 這便實現了前向傳播,從前往後計算
具體的tensorflow實現:
在實際代碼中喂入訓練集需要提前在神經網絡框架中佔位,所以需要:
x = tf.placeholder(tf.float32, shape=(1, 2)) #輸入值x,1*2,佔位符,喂入一組數據
x = tf.placeholder(tf.float32, shape=(None, 2)) #輸入值x,N*2,佔位符,喂入多組數據
喂入一組數據:
import tensorflow as tf
#定義輸入和參數
x = tf.placeholder(tf.float32, shape=(1, 2)) #輸入值x,1*2,佔位符
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1)) #線上權重w1,2*3
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1)) #線上權重w2,3*1
#定義前向傳播
a = tf.matmul(x, w1) #1*2和2*3得到1*3
y = tf.matmul(a, w2) #1*3和3*1得到1*1
#用會話session計算節點結果
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op) #會話變量初始化
print("y:", sess.run(y, feed_dict={x: [[0.7, 0.5]]})) #喂一組數據
print("w1:", sess.run(w1))
print("w2:", sess.run(w2))
運行結果:
喂入多組數據:
import tensorflow as tf
#定義輸入和參數
x = tf.placeholder(tf.float32, shape=(None, 2)) #輸入值x,N*2,佔位符
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1)) #線上權重w1,2*3
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1)) #線上權重w2,3*1
#定義前向傳播
a = tf.matmul(x, w1) #N*2和2*3得到N*3
y = tf.matmul(a, w2) #N*3和3*1得到N*1
#用會話session計算節點結果
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op) #會話變量初始化
print("y:", sess.run(y, feed_dict={x: [[0.7, 0.5], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]})) #喂多組數據
print("w1:", sess.run(w1))
print("w2:", sess.run(w2))
運行結果: