天天看點

人工智能實踐Tensorflow筆記:Tensorflow架構-3

基于 Tensorflow 的 NN:

用張量表示資料,用計算圖搭建神經網絡,用會話執行計算圖,優化線上的權重(參數),得到模型。

張量tensor:

張量就是多元數組(清單),用“階”表示張量的次元。

0 階張量稱作 标量scalar

1 階張量稱作 向量vector []

2 階張量稱作 矩陣matrix [[]]

資料類型:

Tensorflow 的資料類型有 tf.float32、tf.int32 等。

計算圖(Graph):

搭建神經網絡的計算過程,是承載一個或多個計算節點的一張圖,隻搭建網絡,不運算。

人工智能實踐Tensorflow筆記:Tensorflow架構-3

會話(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、使用訓練好的模型預測和分類

訓練過程和使用過程

前向傳播:

就是搭模組化型的計算過程,讓模型具有推理能力,可以針對一組輸入給出相應的輸出。

人工智能實踐Tensorflow筆記:Tensorflow架構-3

待優化的參數:

W 前節點編号,後節點編号(層數)

神經網絡共有幾層(或目前是第幾層網絡)都是指的計算層,輸入不是計算層

反向傳播:

訓練模型參數,在所有參數上用梯度下降,使 NN 模型在訓練資料上的損失函數最小。

損失函數(loss):

計算得到的預測值 y 與已知答案 y_的差距。

均方誤差 MSE:

求前向傳播計算結果與已知答案之差的平方再求平均。

loss_mse = tf.reduce_mean(tf.square(y_ - y))

人工智能實踐Tensorflow筆記:Tensorflow架構-3

反向傳播訓練方法:

以減小 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。
"""      

繼續閱讀