經過對神經網絡的理解,以分類網絡為例囊拜,我認為其就是構建了一個高維非線性的函數(shù)映射,其基礎還是線性映射比搭,通過激活函數(shù)等操作將整體映射轉化為非線性冠跷。而訓練過程就是一個擬合的過程。個人在寫這個教程是建立在對神經網絡有了一定基礎認知之后寫的身诺,但是目的是Tensorflow的使用蜜托,所以不再贅述神經網絡的細節(jié)。
3.1 Tensorflow訓練線性運算
首先從簡單的入手霉赡,使用Tensorflow構建一個線性映射進行訓練橄务,可以理解為一個深度神經網絡沒有激活函數(shù)的神經元。
3.1.1 構建訓練數(shù)據
首先我們需要構造訓練數(shù)據穴亏,這個需要使用Numpy(教程)的隨機數(shù)方法蜂挪,Numpy在神經網絡中多有運用,最好掌握一下嗓化,構建原始數(shù)據代碼如下:
import tensorflow as tf
import numpy as np
x_data = np.random.rand(100).astype(np.float32)
y_data = 0.5 * x_data + 0.1
3.1.2 構建計算圖
構建原始數(shù)據之后棠涮,我們需要設計計算圖,也就是設計張量的流向刺覆,因為我們設計的是線性運算严肪,需要設置Weights和bias,設計代碼如下:
# 設計計算圖
Weights = tf.Variable(tf.random_uniform([1],-1,1))
bias = tf.Variable(tf.zeros([1]))
# 這個y是我們訓練出來的y,y_data是groundtruth诬垂,我們要根據x_data訓練去擬合y_data
y = Weights * x_data + bias
3.1.3 定義loss和選擇優(yōu)化器
在神經網絡中我們知道,需要根據需要選擇不同的loss伦仍,比如交叉熵结窘,二范式距離等,這個以后運用多了有了一定理解會專門寫一個章節(jié)介紹loss和優(yōu)化器充蓝。對于本例隧枫,我先使用簡單的二范式距離,將y和y_data做loss谓苟,選擇優(yōu)化器為梯度下降法官脓,代碼如下:
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
對于本例來說,訓練我們想達到的迭代的目的就是y和y_data構建的二范式loss在梯度下降法的作用下盡可能小涝焙,loss和優(yōu)化器之前定義過卑笨,我們需要告訴tensorflow我們進行網絡訓練的期望是什么,是最小化loss仑撞,如下所示:
train = optimizer.minimize(loss)
3.1.4 迭代訓練
首先迭代進行計算之前的問題是參數(shù)的初始化赤兴,比如Weights和bias,雖然他們定義了tf.Variable()但是并沒有進行實際的計算隧哮,參考lesson2的解釋桶良。我們可以定義會話去挨個調用sess.run(name.initializer)讓他們進行初始化的實際操作。但是會很麻煩沮翔,所以我們定義如下的全局初始化器陨帆,這樣之后我們sess.run(init)就可以實現(xiàn)全局的初始化。
init = tf.global_variables_initializer()
定義會話并進行迭代輸出采蚀,每迭代20次輸出一次結果:
sess = tf.Session()
sess.run(init)
for step in range(10000):
sess.run(train)
if step % 20 == 0:
print(step,sess.run(Weights),sess.run(bias))
sess.close()
3.1.5 準確率評測
一般來說這一部分會存在用于評估準確率和模型效果疲牵,因為我們只寫了簡單的線性擬合訓練就不在寫這一部分,主要我現(xiàn)在不怎么會
3.1.6 完整代碼和訓練結果
完整代碼:
import tensorflow as tf
import numpy as np
x_data = np.random.rand(100).astype(np.float32)
y_data = 0.5 * x_data + 0.1
Weights = tf.Variable(tf.random_uniform([1],-1,1))
bias = tf.Variable(tf.zeros([1]))
y = Weights * x_data + bias
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for step in range(1000):
sess.run(train)
if step % 20 == 0:
print(step,sess.run(Weights),sess.run(bias))
sess.close()
訓練過程:
3.2 本例中涉及的Tensorflow的函數(shù)接口
3.2.1 tf.Varible()
該函數(shù)是Tensorflow聲明變量所用榆鼠,返回值為一個張量瑰步,括號內傳參為該變量的初始化值及大小等
3.2.2 Tensorflow隨機數(shù)生成函數(shù)
函數(shù)名稱 | 隨機數(shù)分布 | 主要參數(shù) |
---|---|---|
tf.random_normal | 正態(tài)分布 | 平均值、標準差璧眠、取值類型 |
tf.truncated_normal | 正態(tài)分布缩焦,但如果隨機出來的值偏離平均值超過兩個標準差,那么這個數(shù)就會被重新隨機 | 平均值责静、標準差袁滥、取值類型 |
tf.random_uniform | 均勻分布 | 最小最大取值、取值類型 |
tf.random_gama | Gamma分布 | 形狀參數(shù)alpha灾螃,尺度參數(shù)beta题翻,取值類型 |
3.2.3 Tensorflow常數(shù)生成函數(shù)
函數(shù)名稱 | 功能 | 樣例 |
---|---|---|
tf.zeros | 產生全0數(shù)組 | tf.zeros([2,3],int32)->[[0,0,0],[0,0,0]] |
tf.ones | 產生全1數(shù)組 | tf.ones([2,3],int32)->[[1,1,1],[1,1,1]] |
tf.fill | 產生一個全部為給定數(shù)字的數(shù)組 | tf.fill([2,3],9)->[[9,9,9],[9,9,9]] |
tf.constant | 產生一個給定數(shù)值的常量 | tf.constant([1,2,3])->[1,2,3] |
3.2.4 優(yōu)化器和loss函數(shù)
這個之后單獨找一節(jié)我詳細敘述,我現(xiàn)在這一部分也懵懂狀態(tài)