基于 Tensorflow 的 NN:
用張量表示資料,用計算圖搭建神經網絡,用會話執行計算圖,優化線上的權重(參數),得到模型。
張量tensor:
張量就是多元數組(清單),用“階”表示張量的次元。
0 階張量稱作 标量scalar
1 階張量稱作 向量vector []
2 階張量稱作 矩陣matrix [[]]
資料類型:
Tensorflow 的資料類型有 tf.float32、tf.int32 等。
計算圖(Graph):
搭建神經網絡的計算過程,是承載一個或多個計算節點的一張圖,隻搭建網絡,不運算。
會話(Session):
執行計算圖中的節點運算。
神經網絡的參數:
是指神經元線上的權重 w
神經網絡中常用的生成随機數/數組的函數
函數 | 說明 |
tf.random_normal() | 生成正态分布随機數 |
tf.truncated_normal() | 生成去掉過大偏離點的正态分布随機數 |
tf.random_uniform() | 生成均勻分布随機數 |
tf.zeros | 表示生成全 0 數組 |
tf.ones | 表示生成全 1 數組 |
tf.fill | 表示生成全定值數組 |
tf.constant | 表示生成直接給定值的數組 |
神經網絡的實作過程:
1、準備資料集,提取特征,作為輸入喂給神經網絡(Neural Network,NN)
2、搭建 NN 結構,從輸入到輸出(先搭建計算圖,再用會話執行)
( NN 前向傳播算法 計算輸出)
3、大量特征資料喂給 NN,疊代優化 NN 參數
( NN 反向傳播算法 優化參數訓練模型)
4、使用訓練好的模型預測和分類
訓練過程和使用過程
前向傳播:
就是搭模組化型的計算過程,讓模型具有推理能力,可以針對一組輸入給出相應的輸出。
待優化的參數:
W 前節點編号,後節點編号(層數)
神經網絡共有幾層(或目前是第幾層網絡)都是指的計算層,輸入不是計算層
反向傳播:
訓練模型參數,在所有參數上用梯度下降,使 NN 模型在訓練資料上的損失函數最小。
損失函數(loss):
計算得到的預測值 y 與已知答案 y_的差距。
均方誤差 MSE:
求前向傳播計算結果與已知答案之差的平方再求平均。
loss_mse = tf.reduce_mean(tf.square(y_ - y))
反向傳播訓練方法:
以減小 loss 值為優化目标,有梯度下降、momentum 優化器、adam 優化器等優化方法。
随機梯度下降算法
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)
學習率:決定每次參數更新的幅度。
進階:反向傳播參數更新推導過程
搭建神經網絡的八股
準備工作
前向傳播
反向傳播
循環疊代
linux:
vim ~/.vimrc 寫入:
set ts=4 表示使 Tab 鍵等效為 4 個空格
set nu 表示使 vim 顯示行号 nu 是 number 縮寫
“提示 warning”,是因為有的電腦可以支援加速指令,
但是運作代碼時并沒有啟動這些指令。
“提示 warning”暫時屏蔽掉。主目錄下的 bashrc 檔案,
加入這樣一句 export TF_CPP_MIN_LOG_LEVEL=2,把“提示warning”等級降低
“0”(顯示所有資訊)
“1”(不顯示 info),
“2”代表不顯示 warning,
“3”代表不顯示 error。一般不建議設定成 3
source 指令用于重新執行修改的初始化檔案
使之立即生效,而不必登出并重新登入。
代碼示例
随機産生 32 組生産出的零件的體積和重量,訓練 3000 輪,每 500 輪輸出一次損
失函數。下面我們通過源代碼進一步了解神經網絡的實作過程:
# -*- coding: utf-8 -*-
# @File : 搭建神經網絡八股.py
# @Date : 2018-06-02
# 搭建神經網絡的八股
# 準備工作 -> 前向傳播 -> 反向傳播 -> 循環疊代
# 1、導入子產品,生成模拟資料集;
import tensorflow as tf
import numpy as np
BACH_SIZE = 8
SEED = 23455
# 基于随機數産生 32行2列的随機數
rng = np.random.RandomState(SEED)
X = rng.rand(32, 2) # 随機數組, 浮點數,[0, 1)均勻分布
# 輸入資料集的标簽(正确答案)x0+x1<1 -> 1 x0+x1>=1 -> 0
Y = [[int(x0 + x1 < 1)] for (x0, x1) in X]
print("X: \n%s"%X)
print("Y: \n%s"%Y)
# 2、定義神經網絡的輸入、參數和輸出,定義前向傳播過程;
x = tf.placeholder(tf.float32, shape=(None, 2))
y_ = tf.placeholder(tf.float32, shape=(None, 1))
# 生成正态分布随機數,形狀兩行三列,标準差是 1,随機種子是 1
w1 = tf.Variable(tf.random_normal(shape=[2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal(shape=[3, 1], stddev=1, seed=1))
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
# 3、定義損失函數及反向傳播方法
# 均方誤差
loss = tf.reduce_mean(tf.square(y - y_))
# 随機梯度下降算法,使參數沿着梯度的反方向,即總損失減小的方向移動,實作更新參數。
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
# 4、生成會話,訓練 STEPS 輪
with tf.Session() as session:
init_option = tf.global_variables_initializer()
session.run(init_option)
# 輸出未經訓練的參數值
print("w1: \n", session.run(w1))
print("w2 \n", session.run(w2))
print("\n")
# 訓練模型
STEPS = 3000
for i in range(STEPS):
start = (i*BACH_SIZE)%32
end = start + BACH_SIZE
session.run(train_step, feed_dict={x: X[start: end], y_: Y[start: end]})
if i %500 == 0:
total_loss = session.run(loss, feed_dict={x: X, y_:Y})
print("ssetp %d, loss %s"% (i, total_loss))
# 訓練後的取值
print("w1\n", session.run(w1))
print("w2\n", session.run(w2))
"""
由神經網絡的實作結果,我們可以看出,總共訓練 3000 輪,每輪從 X 的資料集
和 Y 的标簽中抽取相對應的從 start 開始到 end 結束個特征值和标簽,喂入神經
網絡,用 sess.run 求出 loss,每 500 輪列印一次 loss 值。經過 3000 輪後,我
們列印出最終訓練好的參數 w1、w2。
"""