1. 程式人生 > >人工智慧實踐Tensorflow筆記:Tensorflow框架-3

人工智慧實踐Tensorflow筆記:Tensorflow框架-3

基於 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。
"""