Tensorflow筆記—3—神經網絡搭建之前向傳播

一.概念回顧及補充

  • 基於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))

運行結果:

 

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