TensorFlow筆記-05-反向傳播,搭建神經網路的八股

肖朋偉發表於2018-09-08

TensorFlow筆記-05-反向傳播,搭建神經網路的八股

反向傳播

  • 反向傳播:
    • 訓練模型引數,在所有引數上用梯度下降,使用神經網路模型在訓練資料上的損失函式最小
  • 損失函式:(loss)
    • 計算得到的預測值 y 與已知答案 y_ 差距
    • 損失函式的計算有很多方法,均方誤差MSE是比較常用的方法之一
    • 關於損失函式,會在下一篇仔細講
  • 均方誤差:
    • 求前向傳播計算結果與已知答案之差的平方再求平均
      TensorFlow筆記-05-反向傳播,搭建神經網路的八股
    • 用 Tensorflow 函式表示:
      • loss = tf.reduce_mean(tf.square(y-y_))
  • 反向傳播訓練方法:
    • 以減小 loss 值為優化目標,有梯度下降,moment 優化器,adm 優化器等優化方法
  • 這三種優化方法分別是:
    • train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
    • train_step = tf.train.GMomentumOptimizer(0.001, 0.9).minimize(loss)
    • train_step = tf.train.AdamOptimizer(0.001).minimize(loss)

搭建神經網路的八股

  • 先回顧神經網路的實現過程,可以總結出:神經網路的搭建分4步:
    • 1.準備工作
    • 2.前向傳播
    • 3.反向傳播
    • 4.迴圈迭代

回顧一下,幫助理解

  • 1.準備資料,提取特徵,作為輸入餵給神經網路
  • 2.搭建神經網路結構,從輸入到輸出(先搭建計算圖,再用會話執行)
    (NN前向傳播演算法===>計算輸出)
  • 3.大量特徵資料餵給NN,迭代優化NN引數
    (NN反向傳播演算法===>優化引數訓練模型)
  • 4.使用訓練好的模型,預測和分類
  • 通過原始碼,進一步理解 神經網路的實現過程

案例及程式碼

# coding:utf-8
# 匯入模組,生成隨機資料集
import tensorflow as tf
# 匯入numpy模組,numpy是python的科學計算模組
import numpy as np
# 一次喂入神經網路多少組資料,數值不可以過大
BATCH_SIZE = 8
seed = 23455

# 基於seed產生隨機數
rng = np.random.RandomState(seed)
# 隨機數返回32行2列的矩陣 表示32組 體積和重量 作為輸入資料集
X = rng.rand(32, 2)
# 從32行2列的矩陣中 去除一行判斷如果和小於1 給Y賦值1 如果和不小於1 給Y賦值0
# 作為輸入資料集的標籤(正確答案)
Y = [[int(x0 + x1 <1)] for (x0, x1) in X]
print("X:\n", X)
print("Y:\n", Y)

# 定義神經網路的輸入,引數和輸出,定義前向傳播過程
x = tf.placeholder(tf.float32, shape=(None, 2))
# y_即為0或1
y_ = tf.placeholder(tf.float32, shape=(None, 1))

# w1為2行3列
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))

# matmul矩陣相乘
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

# 定義損失函式及反向傳播方法
loss = tf.reduce_mean(tf.square(y-y_))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
# 其他優化方法
# train_step = tf.train.GMomentumOptimizer(0.001, 0.9).minimize(loss)
# train_step = tf.train.AdamOptimizer(0.001).minimize(loss)

# 生成會話,訓練STEPS輪
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    # 輸出目前(未經訓練)的引數取值
    print("w1:\n", sess.run(w1))
    print("w2:\n", sess.run(w2))
    print("\n")

    # 訓練模型3000輪
    STEPS = 3000
    for i in range(STEPS):
        start = (i*BATCH_SIZE) % 32
        end = start + BATCH_SIZE
        sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
        # 沒500輪列印一次loss值
        if i % 500 == 0:
            total_loss = sess.run(loss, feed_dict={x: X, y_: Y})
            print("After %d training step(s), loss on all data is %g" %(i, total_loss))

    # 輸出訓練後的引數取值
    print("\n")
    print("w1:\n", sess.run(w1))
    print("w2:\n", sess.run(w2))

執行結果

X:
 [[0.83494319 0.11482951]
 [0.66899751 0.46594987]
 [0.60181666 0.58838408]
 [0.31836656 0.20502072]
 [0.87043944 0.02679395]
 [0.41539811 0.43938369]
 ........
 [0.10409134 0.88235166]
 [0.06727785 0.57784761]
 [0.38492705 0.48384792]
 [0.69234428 0.19687348]
 [0.42783492 0.73416985]
 [0.09696069 0.04883936]]
Y:
 [[1], [0], [0], [1], [1], [1], [1], [0], [1], [1], [1], [0], [0], [0], [0], [0], [0], [1], [0], [0], [1], [1], [0], [1], [0], [1], [1], [1], [1], [1], [0], [1]]
w1:
 [[-0.8113182   1.4845988   0.06532937]
 [-2.4427042   0.0992484   0.5912243 ]]
w2:
 [[-0.8113182 ]
 [ 1.4845988 ]
 [ 0.06532937]]

# 可以看到loss逐漸減小
After 0 training step(s), loss on all data is 5.13118
After 500 training step(s), loss on all data is 0.429111
After 1000 training step(s), loss on all data is 0.409789
After 1500 training step(s), loss on all data is 0.399923
After 2000 training step(s), loss on all data is 0.394146
After 2500 training step(s), loss on all data is 0.390597


w1:
 [[-0.7000663   0.91363174  0.0895357 ]
 [-2.3402493  -0.14641264  0.58823055]]
w2:
 [[-0.06024268]
 [ 0.91956186]
 [-0.06820709]]

執行結果分析

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

搭建神經網路的八股

  • 搭建神經網路的八股:準備,前向傳播,反向傳播,迭代
  • 以上面的程式碼為例
  • (1)準備
    • 1.import
    • 2.常量定義
    • 3.生成資料集
  • (2)前向傳播: 定義輸入,引數和輸出
    • x =
    • y_ =
    • w1 =
    • w2 =
    • a =
    • y =
  • (3)反向傳播:定義損失函式,反向傳播的方法
    • loss =
    • train_step =
  • (4)在with中完成迭代,生成會話,訓練STEPS輪
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)

    # 訓練模型3000輪
    STEPS = 3000
    for i in range(STEPS):
        start = (i*BATCH_SIZE) % 32
        end = start + BATCH_SIZE
        sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
        # 沒500輪列印一次loss值
        if i % 500 == 0:
            total_loss = sess.run(loss, feed_dict={x: X, y_: Y})
            print("After %d training step(s), loss on all data is %g" %(i, total_loss))

這樣4步就可以實現神經網路的搭建了

更多文章連結:Tensorflow 筆記


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

相關文章