TensorFlow筆記-04-神經網路的實現過程,前向傳播

肖朋偉發表於2018-09-08

TensorFlow筆記-04-神經網路的實現過程,前向傳播

  • 基於TensorFlow的NN:用張量表示資料,用計算圖搭建神經網路,用會話執行計算圖,優化線上的權重(引數),得到模型
  • 張量(tensor):多維陣列(列表)
  • 階:張量的維數
  • 計算圖(Graph):搭建神經網路的計算過程,只搭建,不運算
  • 會話(Session):執行計算圖中的結點運算
  • 神經網路的引數:即計算圖中的權重,也可以說是神經元(後面會提到)線上的權重,用變數表示,一般會隨機生成這些引數。生成引數的方法是讓 w(神經元上的線) 等於 tf.Variable,把生成的方式寫在括號裡
  • 神經網路中常用的生成隨機數/陣列的函式有:
    TensorFlow筆記-04-神經網路的實現過程,前向傳播
  • 看不懂也沒有關係

  • 其中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.zeros([3,2,1]) 生成[3,2,1]

神經網路的搭建

神經網路的實現過程:

  • 1.準備資料,提取特徵,作為輸入餵給神經網路 (Neural Network,NN,神經網路簡稱NN)
  • 2.搭建NN結構,從輸入到輸出(先搭建計算圖,再用會話執行)
    (NN前向傳播演算法 ===> 計算輸出)
  • 3.大量特徵資料餵給NN,迭代優化NN引數
    (NN反向傳播演算法 ===> 優化引數訓練模型)
  • 4.使用訓練好的模型,預測和分類
  • 由此可見,基於神經網路的機器學習主要分兩個過程,即訓練過程和使用過程,訓練過程是第一步,第二步,第三步的迴圈迭代,使用的第四步,一旦引數優化完成就可以固定這些引數,實現特定應用了

前向傳播:

  • 前向傳播就是搭建模型計算過程,讓模型具有推理能力(以全連線網路為例),可以針對一組輸入給出相應的輸出
  • 舉個例子:
    生產一批零件將體積想 x1 和重量 x2 為特徵的輸入 NN,通過 NN 後輸出一個數值
  • 分析:
  • 體積和重量就是我們要選擇的特徵,把他們喂入神經網路,當體積和重量這組資料走過神經網路後,會得到一個輸出,
  • 假設輸入的特徵是:體積:0.7,重量0.5
  • 我們搭建的神經網路:
    TensorFlow筆記-04-神經網路的實現過程,前向傳播
  • 由神經網路可得,隱藏節點 a11 = x1w11 + x2w21 = 0.14 + 0.15 = 0.29
  • 同理算得節點 a12 = 32,a13 = 0.38,最終計算得到輸出層 Y= 0.015
  • 這便實現了前向傳播

前向傳播過程的 Tensorflow 描述:

  • 變數初始化,計算圖節點都要用到會話

    with tf.Session() as sess:(前面提到的 with 結構)

  • 變數初始化:
    • 在 sess.run 函式中用 tf.global_variables_initializer() 彙總所有待優化變數:

      init_op = tf.global_variables_initializer()
      sess.run(init_op)

  • 程式碼前向傳播檔案:https://xpwi.github.io/py/TensorFlow/tf05forward.py
# coding:utf-8
# 前向傳播
# 兩層簡單神經網路(全連線)
import tensorflow as tf

# 定義輸入和引數
x = tf.constant([[0.7, 0.5]])
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 tf05前向傳播 is:\n", sess.run(y))
   
# 結果:
# [[3.0904665]] 

執行結果:

這裡寫圖片描述

# coding:utf-8
# 前向傳播
# 兩層簡單神經網路(全連線)
import tensorflow as tf

# 定義輸入和引數
# 用placeholder實現輸入自定義(sess.run中喂1組資料)
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 tf05forward2 is:\n", sess.run(y, feed_dict={x:[[0.7,0.5]]}))

# 結果:
# [[3.0904665]]

一次向神經網路喂入n組特徵

# coding:utf-8
# 前向傳播
# 兩層簡單神經網路(全連線)
# 向神經網路喂入n組特徵
import tensorflow as tf

# 定義輸入和引數
# 用placeholder實現輸入自定義(sess.run中喂多組資料)None表示未知
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 tf05forward2 is:\n", 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))

執行結果

這裡寫圖片描述
前向傳播就到這裡了

更多文章:Tensorflow 筆記


  • 本筆記不允許任何個人和組織轉載

相關文章