1.什么是tensorflow
Tensorflow是神經(jīng)網(wǎng)絡(luò)框架。
2.Tensorflow中個重要概念
· Tensor:即張量,在TensorFlow的范疇里,可以簡單的理解為多維數(shù)組
· Flow:中文翻譯過來是“流”,它形象的表達(dá)了張量之間通過計算相互轉(zhuǎn)化的過程
Tensorflow與傳統(tǒng)的程序結(jié)構(gòu)不一樣,tensorflow將程序分為兩個獨立的部分似舵,包括計算圖定義,和執(zhí)行兩部分葱峡。
因為tensorflow是采用數(shù)據(jù)流圖來計算砚哗,所以先創(chuàng)建一個數(shù)據(jù)流圖,在將數(shù)據(jù)(以張量tensor的形式存在)放在數(shù)據(jù)流圖中計算,節(jié)點(Nodes)在途中表示數(shù)學(xué)操作。訓(xùn)練模型的時候tensor會不斷從數(shù)據(jù)流圖的一個節(jié)點flow到另一個節(jié)點饶囚。
計算圖:即包含著節(jié)點和邊的網(wǎng)絡(luò)。每個節(jié)點可以有0個或者多個輸入仅淑,但是只有一個輸出。
計算機(jī)圖的執(zhí)行:
以一個例子說明:
用代碼實現(xiàn)如下:
由上圖可以看見,代碼分為兩個部分胸哥,計算圖和會話執(zhí)行的兩部分涯竟,1.2.為構(gòu)建計算圖的步驟,1獲取了數(shù)據(jù),并構(gòu)建計算節(jié)點庐船,執(zhí)行會話的時候就是將數(shù)據(jù)放進(jìn)計算圖银酬,使得數(shù)據(jù)在計算圖中運(yùn)行。
3. 會話控制
session 是 Tensorflow 為了控制,和輸出文件的執(zhí)行的語句. 運(yùn)行 session.run() 可以獲得你要得知的運(yùn)算結(jié)果.這有點像是python打開文本處理的兩種方式筐钟。
會話控制的兩種方法:
# method 1
sess = tf.Session()
result = sess.run(product)
print(result)
sess.close()
# method 2
with tf.Session() as sess:
result2 = sess.run(product)
print(result2)# [[12]]
4.梯度下降原理
梯度下降法是屬于優(yōu)化問題其中的一個方法捡硅。在這里可以簡單的理解為數(shù)學(xué)函數(shù)中的求導(dǎo)求微分。在求解損失函數(shù)的最小值時盗棵,可以通過梯度下降法來一步步的迭代求解,得到最小化的損失函數(shù)和模型參數(shù)值北发。反過來纹因,如果我們需要求解損失函數(shù)的最大值,這時就需要用梯度上升法來迭代了琳拨。在tensorful中主要應(yīng)用梯度下降方法瞭恰。
如下圖:假設(shè)從黑點開始,找到最低點是目標(biāo)狱庇。從黑點開始算斜率(這個斜率就是梯度惊畏,用數(shù)學(xué)的角度講就是微分),找到一個最大的即最陡的地方密任,然后再往前進(jìn)一步颜启,再計算其斜率,如此循環(huán)浪讳。才能找到這個最低點缰盏。其中步長不能太大也不能太小,太小的話淹遵,可能導(dǎo)致遲遲走不到最低點影響效率口猜,太大的話,可能會錯過最低點透揣。
5.用梯度下降優(yōu)化線性回歸問題
引入模塊
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
構(gòu)建數(shù)據(jù)
points_num = 100
vectors = []
用 Numpy 的正態(tài)隨機(jī)分布函數(shù)生成 100 個點
這些點的(x, y)坐標(biāo)值對應(yīng)線性方程 y = 0.1 * x + 0.2
權(quán)重(Weight)為 0.1济炎,偏差(Bias)為 0.2
for i in range(points_num):
x1 = np.random.normal(0.0, 0.66)
y1 = 0.1 * x1 + 0.3 + np.random.normal(0.0, 0.04)
vectors.append([x1, y1])
x_data = [v[0] for v in vectors] # 真實的點的 x 坐標(biāo)
y_data = [v[1] for v in vectors] # 真實的點的 y 坐標(biāo)
圖像 1 :展示 100 個隨機(jī)數(shù)據(jù)點
plt.plot(x_data, y_data, 'r*', label="Original data") # 紅色星形的點
plt.legend()
plt.show()
繪出的效果如下:
構(gòu)建線性回歸模型 Variable定義一個變量。random_uinifo用于產(chǎn)生一維的隨機(jī)張量
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) # 初始化 Weight
b = tf.Variable(tf.zeros([1])) # 初始化 Bias
y = W * x_data + b # 模型計算出來的
定義 loss function(損失函數(shù))或 cost function(代價函數(shù))
對 Tensor 的所有維度計算 ((y - y_data) ^ 2) 之和 / N
reduce_mean計算張量的平均值辐真,square平方须尚。
loss = tf.reduce_mean(tf.square(y - y_data))
用梯度下降的優(yōu)化器來最小化我們的 loss(損失)
一般設(shè)置小于1,值越大越有可能錯過一些逼近真實曲線的點侍咱,太小會影響訓(xùn)練效率
minimize 接受了一個函數(shù)作為參數(shù)恨闪,這個函數(shù)做了下面的兩件事情:
首先它對所有的x值通過我們在之前定義的pridict函數(shù)預(yù)測了y值。
然后它通過我們之前定義的損失函數(shù)返回了這些預(yù)測的均方誤差放坏。
minimize函數(shù)之后會自動調(diào)整這些變量(即系數(shù)w,b)來使得損失函數(shù)更小咙咽。
在運(yùn)行訓(xùn)練迭代器之后,w,以及d就會是通過模型100次迭代之后學(xué)習(xí)到的結(jié)果了淤年。
optimizer = tf.train.GradientDescentOptimizer(0.1)
train = optimizer.minimize(loss)
創(chuàng)建會話
with tf.Session() as sess:
# 初始化數(shù)據(jù)流圖中的所有變量 (這一步一定要有)
init = tf.global_variables_initializer()
sess.run(init)
# 訓(xùn)練 20 步
for step in xrange(100):
# 優(yōu)化每一步
sess.run(train)
# 打印出每一步的損失钧敞,權(quán)重和偏差
print("第 {} 步的 損失={}, 權(quán)重={}, 偏差={}".format(step, sess.run(loss), sess.run(W), sess.run(b)))
# 圖像 2 :繪制所有的點并且繪制出最佳擬合的直線
plt.plot(x_data, y_data, 'r*', label="Original data") # 紅色星形的點
plt.title("Linear Regression using Gradient Descent") # 標(biāo)題蜡豹,表示 "梯度下降解決線性回歸"
plt.plot(x_data, sess.run(W) * x_data + sess.run(b), label="Fitted line") # 擬合的線
print(sess.run(W))
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()
打印出如下效果,可以看到是十分比較實際的y=0.1x + 0.3的效果
<pre>第 0 步的 損失=0.2615503668785095, 權(quán)重=[-0.5386478], 偏差=[0.06145719]
第 1 步的 損失=0.20130445063114166, 權(quán)重=[-0.4748752], 偏差=[0.11052281]
第 2 步的 損失=0.15636701881885529, 權(quán)重=[-0.4175892], 偏差=[0.14968537]
第 3 步的 損失=0.12244605273008347, 權(quán)重=[-0.366123], 偏差=[0.18093464]
第 4 步的 損失=0.09656181931495667, 權(quán)重=[-0.31987983], 偏差=[0.20586148]
第 5 步的 損失=0.07661882042884827, 權(quán)重=[-0.2783252], 偏差=[0.22573774]
第 6 步的 損失=0.06112353503704071, 權(quán)重=[-0.24098018], 偏差=[0.24158014]
第 7 步的 損失=0.04899679124355316, 權(quán)重=[-0.20741548], 偏差=[0.2542014]
第 8 步的 損失=0.03944816440343857, 權(quán)重=[-0.17724614], 偏差=[0.26425108]
第 9 步的 損失=0.0318911150097847, 權(quán)重=[-0.15012686], 偏差=[0.27224827]
第 10 步的 損失=0.025884980335831642, 權(quán)重=[-0.12574784], 偏差=[0.2786078]
第 11 步的 損失=0.02109493501484394, 權(quán)重=[-0.10383102], 偏差=[0.283661]
第 12 步的 損失=0.017263982445001602, 權(quán)重=[-0.08412677], 偏差=[0.2876727]
第 13 步的 損失=0.014193098992109299, 權(quán)重=[-0.06641099], 偏差=[0.29085425]
第 14 步的 損失=0.011726957745850086, 權(quán)重=[-0.05048241], 偏差=[0.2933745]
第 15 步的 損失=0.009743548929691315, 權(quán)重=[-0.03616025], 偏差=[0.29536825]
第 16 步的 損失=0.008146497420966625, 權(quán)重=[-0.02328211], 偏差=[0.29694307]
第 17 步的 損失=0.006859328597784042, 權(quán)重=[-0.01170211], 偏差=[0.29818475]
第 18 步的 損失=0.00582113629207015, 權(quán)重=[-0.00128914], 偏差=[0.29916176]
第 19 步的 損失=0.00498326076194644, 權(quán)重=[0.00807462], 偏差=[0.2999287]
第 20 步的 損失=0.004306729417294264, 權(quán)重=[0.01649503], 偏差=[0.30052903]
第 21 步的 損失=0.0037602675147354603, 權(quán)重=[0.02406726], 偏差=[0.30099744]
第 22 步的 損失=0.00331873563118279, 權(quán)重=[0.03087685], 偏差=[0.30136147]
第 23 步的 損失=0.002961900783702731, 權(quán)重=[0.03700069], 偏差=[0.3016431]
第 24 步的 損失=0.002673461800441146, 權(quán)重=[0.0425079], 偏差=[0.30185977]
第 25 步的 損失=0.0024402739945799112, 權(quán)重=[0.04746062], 偏差=[0.30202532]
第 26 步的 損失=0.0022517316974699497, 權(quán)重=[0.05191472], 偏差=[0.3021508]
第 27 步的 損失=0.0020992732606828213, 權(quán)重=[0.05592044], 偏差=[0.30224487]
第 28 步的 損失=0.0019759831484407187, 權(quán)重=[0.05952293], 偏差=[0.3023145]
第 29 步的 損失=0.00187627540435642, 權(quán)重=[0.06276281], 偏差=[0.30236512]
第 30 步的 損失=0.0017956355586647987, 權(quán)重=[0.0656766], 偏差=[0.30240107]
第 31 步的 損失=0.0017304145731031895, 權(quán)重=[0.06829713], 偏差=[0.30242568]
第 32 步的 損失=0.0016776630654931068, 權(quán)重=[0.07065392], 偏差=[0.3024417]
第 33 步的 損失=0.0016349953366443515, 權(quán)重=[0.07277352], 偏差=[0.30245116]
第 34 步的 損失=0.0016004836652427912, 權(quán)重=[0.07467983], 偏差=[0.30245575]
第 35 步的 損失=0.0015725686680525541, 權(quán)重=[0.0763943], 偏差=[0.30245674]
第 36 步的 損失=0.0015499889850616455, 權(quán)重=[0.07793624], 偏差=[0.30245513]
第 37 步的 損失=0.0015317249344661832, 權(quán)重=[0.07932302], 偏差=[0.30245167]
第 38 步的 損失=0.0015169511316344142, 權(quán)重=[0.08057026], 偏差=[0.30244693]
第 39 步的 損失=0.0015050009824335575, 權(quán)重=[0.081692], 偏差=[0.3024414]
第 40 步的 損失=0.0014953347854316235, 權(quán)重=[0.08270086], 偏差=[0.30243537]
第 41 步的 損失=0.001487515983171761, 權(quán)重=[0.08360821], 偏差=[0.30242914]
第 42 步的 損失=0.0014811910223215818, 權(quán)重=[0.08442426], 偏差=[0.30242288]
第 43 步的 損失=0.0014760750345885754, 權(quán)重=[0.08515821], 偏差=[0.3024167]
第 44 步的 損失=0.001471936353482306, 權(quán)重=[0.08581831], 偏差=[0.30241075]
第 45 步的 損失=0.0014685888309031725, 權(quán)重=[0.086412], 偏差=[0.30240503]
第 46 步的 損失=0.0014658808941021562, 權(quán)重=[0.08694594], 偏差=[0.30239964]
第 47 步的 損失=0.0014636905398219824, 權(quán)重=[0.08742617], 偏差=[0.30239457]
第 48 步的 損失=0.0014619188150390983, 權(quán)重=[0.08785808], 偏差=[0.30238983]
第 49 步的 損失=0.0014604852767661214, 權(quán)重=[0.08824653], 偏差=[0.30238542]
第 50 步的 損失=0.0014593261294066906, 權(quán)重=[0.0885959], 偏差=[0.30238134]
第 51 步的 損失=0.0014583882875740528, 權(quán)重=[0.08891013], 偏差=[0.30237758]
第 52 步的 損失=0.0014576294925063848, 權(quán)重=[0.08919273], 偏差=[0.30237415]
第 53 步的 損失=0.0014570162165910006, 權(quán)重=[0.0894469], 偏差=[0.302371]
第 54 步的 損失=0.0014565197052434087, 權(quán)重=[0.0896755], 偏差=[0.3023681]
第 55 步的 損失=0.0014561181887984276, 權(quán)重=[0.0898811], 偏差=[0.30236548]
第 56 步的 損失=0.0014557933900505304, 權(quán)重=[0.09006602], 偏差=[0.3023631]
第 57 步的 損失=0.001455530640669167, 權(quán)重=[0.09023233], 偏差=[0.30236092]
第 58 步的 損失=0.0014553182991221547, 權(quán)重=[0.09038191], 偏差=[0.30235896]
第 59 步的 損失=0.0014551462372764945, 權(quán)重=[0.09051643], 偏差=[0.30235717]
第 60 步的 損失=0.0014550070045515895, 權(quán)重=[0.09063742], 偏差=[0.30235556]
第 61 步的 損失=0.0014548946637660265, 權(quán)重=[0.09074625], 偏差=[0.3023541]
第 62 步的 損失=0.0014548037433996797, 權(quán)重=[0.09084412], 偏差=[0.30235276]
第 63 步的 損失=0.0014547302853316069, 權(quán)重=[0.09093214], 偏差=[0.30235156]
第 64 步的 損失=0.0014546705642715096, 權(quán)重=[0.09101131], 偏差=[0.3023505]
第 65 步的 損失=0.001454622601158917, 權(quán)重=[0.09108251], 偏差=[0.3023495]
第 66 步的 損失=0.0014545833691954613, 權(quán)重=[0.09114655], 偏差=[0.3023486]
第 67 步的 損失=0.001454551937058568, 權(quán)重=[0.09120415], 偏差=[0.3023478]
第 68 步的 損失=0.0014545266749337316, 權(quán)重=[0.09125596], 偏差=[0.3023471]
第 69 步的 損失=0.0014545059530064464, 權(quán)重=[0.09130254], 偏差=[0.30234644]
第 70 步的 損失=0.001454489422030747, 權(quán)重=[0.09134445], 偏差=[0.30234584]
第 71 步的 損失=0.0014544756850227714, 權(quán)重=[0.09138213], 偏差=[0.3023453]
第 72 步的 損失=0.0014544647419825196, 權(quán)重=[0.09141602], 偏差=[0.30234483]
第 73 步的 損失=0.0014544560108333826, 權(quán)重=[0.09144651], 偏差=[0.3023444]
第 74 步的 損失=0.0014544487930834293, 權(quán)重=[0.09147393], 偏差=[0.30234402]
第 75 步的 損失=0.0014544432051479816, 權(quán)重=[0.09149859], 偏差=[0.3023437]
第 76 步的 損失=0.001454438315704465, 權(quán)重=[0.09152077], 偏差=[0.3023434]
第 77 步的 損失=0.0014544345904141665, 權(quán)重=[0.09154072], 偏差=[0.30234313]
第 78 步的 損失=0.0014544314472004771, 權(quán)重=[0.09155866], 偏差=[0.30234286]
第 79 步的 損失=0.0014544292353093624, 權(quán)重=[0.0915748], 偏差=[0.30234262]
第 80 步的 損失=0.0014544271398335695, 權(quán)重=[0.09158931], 偏差=[0.3023424]
第 81 步的 損失=0.0014544252771884203, 權(quán)重=[0.09160236], 偏差=[0.30234224]
第 82 步的 損失=0.001454424113035202, 權(quán)重=[0.0916141], 偏差=[0.3023421]
第 83 步的 損失=0.0014544231817126274, 權(quán)重=[0.09162466], 偏差=[0.30234194]
第 84 步的 損失=0.001454422133974731, 權(quán)重=[0.09163415], 偏差=[0.3023418]
第 85 步的 損失=0.0014544215518981218, 權(quán)重=[0.09164269], 偏差=[0.30234167]
第 86 步的 損失=0.0014544209698215127, 權(quán)重=[0.09165037], 偏差=[0.30234155]
第 87 步的 損失=0.0014544205041602254, 權(quán)重=[0.09165728], 偏差=[0.30234146]
第 88 步的 損失=0.0014544199220836163, 權(quán)重=[0.09166349], 偏差=[0.30234137]
第 89 步的 損失=0.0014544199220836163, 權(quán)重=[0.09166908], 偏差=[0.30234128]
第 90 步的 損失=0.0014544193400070071, 權(quán)重=[0.09167411], 偏差=[0.30234122]
第 91 步的 損失=0.0014544193400070071, 權(quán)重=[0.09167863], 偏差=[0.30234116]
第 92 步的 損失=0.0014544192235916853, 權(quán)重=[0.0916827], 偏差=[0.3023411]
第 93 步的 損失=0.0014544188743457198, 權(quán)重=[0.09168636], 偏差=[0.30234104]
第 94 步的 損失=0.0014544188743457198, 權(quán)重=[0.09168965], 偏差=[0.302341]
第 95 步的 損失=0.0014544188743457198, 權(quán)重=[0.0916926], 偏差=[0.30234098]
第 96 步的 損失=0.0014544188743457198, 權(quán)重=[0.09169526], 偏差=[0.30234095]
第 97 步的 損失=0.001454418757930398, 權(quán)重=[0.09169766], 偏差=[0.30234092]
第 98 步的 損失=0.001454418757930398, 權(quán)重=[0.09169981], 偏差=[0.3023409]
第 99 步的 損失=0.0014544186415150762, 權(quán)重=[0.09170175], 偏差=[0.30234087]
[0.09170175]
</pre>