人工智能實(shí)踐Tensorflow筆記:Tensorflow框架-3
張量tensor:
張量就是多維數(shù)組(列表),用“階”表示張量的維度。
0 階張量稱作 標(biāo)量scalar
1 階張量稱作 向量vector []
2 階張量稱作 矩陣matrix [[]]
數(shù)據(jù)類型:
Tensorflow 的數(shù)據(jù)類型有 tf.float32、tf.int32 等。
計算圖(Graph):
搭建神經(jīng)網(wǎng)絡(luò)的計算過程,是承載一個或多個計算節(jié)點(diǎn)的一張圖,只搭建網(wǎng)絡(luò),不運(yùn)算。
會話(Session):
執(zhí)行計算圖中的節(jié)點(diǎn)運(yùn)算。
神經(jīng)網(wǎng)絡(luò)的參數(shù):
是指神經(jīng)元線上的權(quán)重 w
神經(jīng)網(wǎng)絡(luò)中常用的生成隨機(jī)數(shù)/數(shù)組的函數(shù)
函數(shù) |
說明 |
tf.random_normal() |
生成正態(tài)分布隨機(jī)數(shù) |
tf.truncated_normal() |
生成去掉過大偏離點(diǎn)的正態(tài)分布隨機(jī)數(shù) |
tf.random_uniform() |
生成均勻分布隨機(jī)數(shù) |
tf.zeros |
表示生成全 0 數(shù)組 |
tf.ones |
表示生成全 1 數(shù)組 |
tf.fill |
表示生成全定值數(shù)組 |
tf.constant |
表示生成直接給定值的數(shù)組 |
神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)過程:
1、準(zhǔn)備數(shù)據(jù)集,提取特征,作為輸入喂給神經(jīng)網(wǎng)絡(luò)(Neural Network,NN)
2、搭建 NN 結(jié)構(gòu),從輸入到輸出(先搭建計算圖,再用會話執(zhí)行)
( NN 前向傳播算法 計算輸出)
3、大量特征數(shù)據(jù)喂給 NN,迭代優(yōu)化 NN 參數(shù)
( NN 反向傳播算法 優(yōu)化參數(shù)訓(xùn)練模型)
4、使用訓(xùn)練好的模型預(yù)測和分類
訓(xùn)練過程和使用過程
前向傳播:
就是搭建模型的計算過程,讓模型具有推理能力,可以針對一組輸入給出相應(yīng)的輸出。
待優(yōu)化的參數(shù):
W 前節(jié)點(diǎn)編號,后節(jié)點(diǎn)編號(層數(shù))
神經(jīng)網(wǎng)絡(luò)共有幾層(或當(dāng)前是第幾層網(wǎng)絡(luò))都是指的計算層,輸入不是計算層
反向傳播:
訓(xùn)練模型參數(shù),在所有參數(shù)上用梯度下降,使 NN 模型在訓(xùn)練數(shù)據(jù)上的損失函數(shù)最小。
損失函數(shù)(loss):
計算得到的預(yù)測值 y 與已知答案 y_的差距。
均方誤差 MSE:
求前向傳播計算結(jié)果與已知答案之差的平方再求平均。
loss_mse = tf.reduce_mean(tf.square(y_ - y))
反向傳播訓(xùn)練方法:
以減小 loss 值為優(yōu)化目標(biāo),有梯度下降、momentum 優(yōu)化器、adam 優(yōu)化器等優(yōu)化方法。
隨機(jī)梯度下降算法
train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
超參數(shù)
train_step=tf.train.MomentumOptimizer(learning_rate, momentum).minimize(loss)
自適應(yīng)學(xué)習(xí)率的優(yōu)化算法
train_step=tf.train.AdamOptimizer(learning_rate).minimize(loss)
學(xué)習(xí)率:決定每次參數(shù)更新的幅度。
進(jìn)階:反向傳播參數(shù)更新推導(dǎo)過程
搭建神經(jīng)網(wǎng)絡(luò)的八股
準(zhǔn)備工作
前向傳播
反向傳播
循環(huán)迭代
linux:
vim ~/.vimrc 寫入:
set ts=4 表示使 Tab 鍵等效為 4 個空格
set nu 表示使 vim 顯示行號 nu 是 number 縮寫
“提示 warning”,是因?yàn)橛械碾娔X可以支持加速指令,
但是運(yùn)行代碼時并沒有啟動這些指令。
“提示 warning”暫時屏蔽掉。主目錄下的 bashrc 文件,
加入這樣一句 export TF_CPP_MIN_LOG_LEVEL=2,把“提示warning”等級降低
“0”(顯示所有信息)
“1”(不顯示 info),
“2”代表不顯示 warning,
“3”代表不顯示 error。一般不建議設(shè)置成 3
source 命令用于重新執(zhí)行修改的初始化文件
使之立即生效,而不必注銷并重新登錄。
代碼示例
隨機(jī)產(chǎn)生 32 組生產(chǎn)出的零件的體積和重量,訓(xùn)練 3000 輪,每 500 輪輸出一次損
失函數(shù)。下面我們通過源代碼進(jìn)一步理解神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)過程:
# -*- coding: utf-8 -*- # @File : 搭建神經(jīng)網(wǎng)絡(luò)八股.py # @Date : 2018-06-02 # 搭建神經(jīng)網(wǎng)絡(luò)的八股 # 準(zhǔn)備工作 -> 前向傳播 -> 反向傳播 -> 循環(huán)迭代 # 1、導(dǎo)入模塊,生成模擬數(shù)據(jù)集; import tensorflow as tf import numpy as np BACH_SIZE = 8 SEED = 23455 # 基于隨機(jī)數(shù)產(chǎn)生 32行2列的隨機(jī)數(shù) rng = np.random.RandomState(SEED) X = rng.rand(32, 2) # 隨機(jī)數(shù)組, 浮點(diǎn)數(shù),[0, 1)均勻分布 # 輸入數(shù)據(jù)集的標(biāo)簽(正確答案)x0+x11 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、定義神經(jīng)網(wǎng)絡(luò)的輸入、參數(shù)和輸出,定義前向傳播過程; x = tf.placeholder(tf.float32, shape=(None, 2)) y_ = tf.placeholder(tf.float32, shape=(None, 1)) # 生成正態(tài)分布隨機(jī)數(shù),形狀兩行三列,標(biāo)準(zhǔn)差是 1,隨機(jī)種子是 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、定義損失函數(shù)及反向傳播方法 # 均方誤差 loss = tf.reduce_mean(tf.square(y - y_)) # 隨機(jī)梯度下降算法,使參數(shù)沿著梯度的反方向,即總損失減小的方向移動,實(shí)現(xiàn)更新參數(shù)。 train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss) # 4、生成會話,訓(xùn)練 STEPS 輪 with tf.Session() as session: init_option = tf.global_variables_initializer() session.run(init_option) # 輸出未經(jīng)訓(xùn)練的參數(shù)值 print("w1: \n", session.run(w1)) print("w2 \n", session.run(w2)) print("\n") # 訓(xù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)) # 訓(xùn)練后的取值 print("w1\n", session.run(w1)) print("w2\n", session.run(w2)) """ 由神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)結(jié)果,我們可以看出,總共訓(xùn)練 3000 輪,每輪從 X 的數(shù)據(jù)集 和 Y 的標(biāo)簽中抽取相對應(yīng)的從 start 開始到 end 結(jié)束個特征值和標(biāo)簽,喂入神經(jīng) 網(wǎng)絡(luò),用 sess.run 求出 loss,每 500 輪打印一次 loss 值。經(jīng)過 3000 輪后,我 們打印出最終訓(xùn)練好的參數(shù) w1、w2。 """