[Python人工智能] 二.TensorFlow基礎(chǔ)及一元直線預(yù)測(cè)案例 丨【百變AI秀】
基礎(chǔ)性文章,希望對(duì)您有所幫助,如果文章中存在錯(cuò)誤或不足之處,還請(qǐng)海涵~同時(shí)自己也是人工智能的菜鳥,希望大家能與我在這一筆一劃的博客中成長(zhǎng)起來(lái)。
文章目錄:
一.神經(jīng)網(wǎng)絡(luò)前言
二.TensorFlow結(jié)構(gòu)及工作原理
三.TensorFlow實(shí)現(xiàn)一元直線預(yù)測(cè)
四.總結(jié)
前文賞析:
[Python人工智能] 一.TensorFlow2.0環(huán)境搭建及神經(jīng)網(wǎng)絡(luò)入門
[Python人工智能] 二.TensorFlow基礎(chǔ)及一元直線預(yù)測(cè)案例 丨【百變AI秀】
代碼-(歡迎大家關(guān)注):
https://github.com/eastmountyxz/AI-for-TensorFlow
https://github.com/eastmountyxz/AI-for-Keras
一.神經(jīng)網(wǎng)絡(luò)前言
如下圖所示,通過該神經(jīng)網(wǎng)絡(luò)識(shí)別動(dòng)物貓或狗,共包括輸入層(Input Layer)、隱藏層3層(Hidden Layer)和輸出層(Output Layer)。其中每一個(gè)神經(jīng)元都有一個(gè)激勵(lì)函數(shù),被激勵(lì)的神經(jīng)元傳遞的信息最有價(jià)值,它也決定最后的輸出結(jié)果,經(jīng)過海量數(shù)據(jù)的訓(xùn)練,最終神經(jīng)網(wǎng)絡(luò)將可以用于識(shí)別貓或狗。
激勵(lì)函數(shù)相當(dāng)于一個(gè)過濾器或激勵(lì)器,它把特有的信息或特征激活,常見的激活函數(shù)包括softplus、sigmoid、relu、softmax、elu、tanh等。對(duì)于隱藏層,我們可以使用relu、tanh、softplus等非線性關(guān)系;對(duì)于分類問題,我們可以使用sigmoid(值越小越接近于0,值越大越接近于1)、softmax函數(shù),對(duì)每個(gè)類求概率,最后以最大的概率作為結(jié)果;對(duì)于回歸問題,可以使用線性函數(shù)(linear function)來(lái)實(shí)驗(yàn)。
神經(jīng)網(wǎng)絡(luò)中的神經(jīng)元中都有激勵(lì)函數(shù)(activation function),常見的激勵(lì)函數(shù)參考維基百科:
https://en.wikipedia.org/wiki/Activation_function
現(xiàn)假設(shè)輸入x代表一串?dāng)?shù)字,輸出y代表一個(gè)二次函數(shù),藍(lán)色的點(diǎn)表示數(shù)據(jù)集,紅線表示神經(jīng)網(wǎng)絡(luò)所學(xué)習(xí)到的一條曲線,并代表我們的數(shù)據(jù)。最初這條曲線可能是彎彎曲曲的,隨著不斷地訓(xùn)練和學(xué)習(xí),這條曲線會(huì)逐漸擬合到我的數(shù)據(jù)上來(lái),該紅線越符合數(shù)據(jù)的趨勢(shì),就表示神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)到的東西越多,亦越能去預(yù)測(cè)其趨勢(shì)。
二.TensorFlow結(jié)構(gòu)及工作原理
Tensorflow是一個(gè)使用數(shù)據(jù)流圖(data flow graphs)技術(shù)來(lái)進(jìn)行數(shù)值計(jì)算的開源軟件庫(kù)。數(shù)據(jù)流圖是是一個(gè)有向圖,使用節(jié)點(diǎn)(一般用圓形或方形描述,表示一個(gè)數(shù)學(xué)操作或數(shù)據(jù)輸入的起點(diǎn)和數(shù)據(jù)輸出的終點(diǎn))和線(表示數(shù)字、矩陣或Tensor張量)來(lái)描述數(shù)學(xué)計(jì)算。數(shù)據(jù)流圖可以方便的將各個(gè)節(jié)點(diǎn)分配到不同的計(jì)算設(shè)備上完成異步并行計(jì)算,非常適合大規(guī)模的機(jī)器學(xué)習(xí)應(yīng)用[7]。如下圖所示,通過Gradients不斷學(xué)習(xí)改進(jìn)我們的權(quán)重W和偏置b,從而提升準(zhǔn)確度。
TensorFlow支持各種異構(gòu)的平臺(tái),支持多CPU/GPU、服務(wù)器、移動(dòng)設(shè)備,具有良好的跨平臺(tái)的特性;TensorFlow架構(gòu)靈活,能夠支持各種網(wǎng)絡(luò)模型,具有良好的通用性。此外,TensorFlow內(nèi)核采用C/C++開發(fā),并提供了C++、Python、Java、Go語(yǔ)言的Client API。其架構(gòu)靈活,能夠支持各種網(wǎng)絡(luò)模型,具有良好的通用性和可擴(kuò)展性。tensorflow.js支持在web端使用webGL運(yùn)行GPU訓(xùn)練深度學(xué)習(xí)模型,支持在IOS、Android系統(tǒng)中加載運(yùn)行機(jī)器學(xué)習(xí)模型。其基本結(jié)構(gòu)如下圖所示:
TensorFlow怎么處理數(shù)據(jù)呢?接下來(lái)分享莫煩老師解析TensorFlow的工作原理。
下圖是一個(gè)包含輸入層(input layer)、隱藏層(hidden layer)和輸出層(output layer)的典型神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。
點(diǎn)開輸入層input,發(fā)現(xiàn)它包含 x-input 和 y-input;然后隱藏層包含了權(quán)重(weights)和偏置(biases),以及一個(gè)激勵(lì)函數(shù)relu,后面會(huì)深入分享。
TensorFlow的第一步是做什么呢?它就是需要建立這樣一個(gè)結(jié)構(gòu),然后把數(shù)據(jù)放到這個(gè)結(jié)構(gòu)中,讓TensorFlow自己運(yùn)行,通過不斷地訓(xùn)練和學(xué)習(xí),修改參數(shù)來(lái)輸出準(zhǔn)確的預(yù)測(cè)結(jié)果。TensorFlow中文翻譯是“向量在這個(gè)結(jié)構(gòu)中飛”,這也是TensorFlow的基本含義。
最后補(bǔ)充一個(gè)在線的神經(jīng)網(wǎng)絡(luò)模擬器,大家可以試著去運(yùn)行,看看神經(jīng)網(wǎng)絡(luò)的工作原理及參數(shù)調(diào)整。地址為:
http://playground.tensorflow.org/
三.TensorFlow實(shí)現(xiàn)一元直線預(yù)測(cè)
接著補(bǔ)充一個(gè)TensorFlow預(yù)測(cè)線性直線(y = 0.1 * x + 0.3)的案例。
1.首先定義隨機(jī)生成的100個(gè)數(shù)字和線性直線
TensorFlow中比較常見的格式是float32,這里也進(jìn)行相關(guān)的設(shè)置。同時(shí),預(yù)測(cè)的權(quán)重weight為0.1,偏置biases為0.3
x_data = np.random.rand(100).astype(np.float32)
print(x_data)
y_data = x_data * 0.1 + 0.3
print(y_data)
輸出結(jié)果為:
[0.42128456 0.3590797 0.31952253 0.54071575 0.4098252 0.87536865 0.58871204 0.37161928 0.30826327 0.94290715 0.40412208 0.47935355 ... 0.00465394 0.0929272 0.18561055 0.8577836 0.6737635 0.04606532 0.8738483 0.9900948 0.13116711 0.299359 ] [0.34212846 0.335908 0.33195227 0.3540716 0.34098253 0.38753688 0.35887122 0.33716193 0.33082634 0.39429075 0.34041223 0.34793538 ... 0.3004654 0.30929273 0.31856108 0.38577837 0.36737636 0.30460656 0.38738483 0.3990095 0.31311673 0.3299359 ]
2.創(chuàng)建TensorFlow結(jié)構(gòu),定義權(quán)重Weights和偏置biases
權(quán)重為tf.Variable參數(shù)變量,隨機(jī)生成的一維結(jié)構(gòu)數(shù)列,其范圍是-1.0到1.0;偏置biases初始值為0。TensorFlow學(xué)習(xí)的目的是從初始值不斷提升到目標(biāo)0.1(Weights)0和0.3(biases)。
Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
print(Weights)
biases = tf.Variable(tf.zeros([1]))
print(biases)
輸出結(jié)果為:
3.定義預(yù)測(cè)值y和損失函數(shù)
損失函數(shù)為預(yù)測(cè)的y和實(shí)際值y_data的最小方差。
y = Weights * x_data + biases
loss = tf.reduce_mean(tf.square(y-y_data))
4. 構(gòu)建神經(jīng)網(wǎng)絡(luò)優(yōu)化器(梯度下降優(yōu)化函數(shù))
這里的優(yōu)化器為GradientDescentOptimizer,通過優(yōu)化器減少誤差,每一步訓(xùn)練減少誤差并提升參數(shù)準(zhǔn)確度。學(xué)習(xí)效率設(shè)置為0.5,一般是一個(gè)小于1的數(shù)字。
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.5)
train = optimizer.minimize(loss)
注意,TensorFlow2.0和TensorFlow1.0的一些方法都有改動(dòng)。舉個(gè)例子,在預(yù)測(cè)加利福尼亞的房?jī)r(jià)案例中,tf.train.GradientDescentOptimizer這個(gè)類已經(jīng)不能使用,是train這個(gè)模塊被2.0整體移除,對(duì)比如下。
TensorFlow1.0:optimizer = tf.train.GradientDescentOptimizer(0.5)
TensorFlow2.0:optimizer = tf.optimizers.SGD(learning_rate=0.5)
TF2.0官方:https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/optimizers
In TensorFlow 2.0, Keras became the default high-level API, and optimizer functions migrated from tf.keras.optimizers into separate API called tf.optimizers. They inherit from Keras class Optimizer. Relevant functions from tf.train aren’t included into TF 2.0. So to access GradientDescentOptimizer, call tf.optimizers.SGD
5.初始化變量
init = tf.global_variables_initializer()
6.定義Session并訓(xùn)練,每隔20次輸出結(jié)果
# 定義Session sess = tf.Session() # 運(yùn)行時(shí)Session就像一個(gè)指針 指向要處理的位置并激活 sess.run(init)t # 訓(xùn)練201次 for n in range(201): # 訓(xùn)練并且每隔20次輸出結(jié)果 sess.run(train) if n % 20 == 0: # 最佳擬合結(jié)果 W: [0.100], b: [0.300] print(n, sess.run(Weights), sess.run(biases))
輸出結(jié)果如下圖所示,每隔20次訓(xùn)練,就輸出一次它的參數(shù)——weight權(quán)重和biases偏置。我們想要做的是預(yù)測(cè)線性直線,最初的時(shí)候,計(jì)算值和與測(cè)試值會(huì)有很大的差別,神經(jīng)網(wǎng)絡(luò)需要做的就是不斷縮小預(yù)測(cè)值y和實(shí)際值y_data的差別。最后經(jīng)過200次訓(xùn)練后,已經(jīng)非常接近這些散點(diǎn)了。
0 [-0.17100081] [0.60644317] 20 [0.00904198] [0.34798568] 40 [0.07555631] [0.31289548] 60 [0.09343112] [0.3034655] 80 [0.09823472] [0.3009313] 100 [0.09952562] [0.3002503] 120 [0.09987252] [0.30006728] 140 [0.09996576] [0.30001807] 160 [0.09999081] [0.30000487] 180 [0.09999753] [0.30000132] 200 [0.09999932] [0.30000037]
7.可視化顯示
pre = x_data * sess.run(Weights) + sess.run(biases)
plt.scatter(x_data, y_data)
plt.plot(x_data, pre, ‘r-’)
plt.show()
完整代碼如下所示(精簡(jiǎn)版):
# -*- coding: utf-8 -*- """ Created on 2019-11-30 下午6點(diǎn) 寫于武漢大學(xué) @author: Eastmount CSDN YXZ """ import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import time x_data = np.random.rand(100).astype(np.float32) y_data = x_data * 0.1 + 0.3 #權(quán)重0.1 偏置0.3 #------------------開始創(chuàng)建tensorflow結(jié)構(gòu)------------------ # 權(quán)重和偏置 Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) biases = tf.Variable(tf.zeros([1])) # 預(yù)測(cè)值y y = Weights * x_data + biases # 損失函數(shù) loss = tf.reduce_mean(tf.square(y-y_data)) # 建立神經(jīng)網(wǎng)絡(luò)優(yōu)化器 optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.5) #學(xué)習(xí)效率 train = optimizer.minimize(loss) # 初始化變量 init = tf.global_variables_initializer() #------------------結(jié)束創(chuàng)建tensorflow結(jié)構(gòu)------------------ # 定義Session sess = tf.Session() # 運(yùn)行時(shí)Session就像一個(gè)指針 指向要處理的位置并激活 sess.run(init) # 訓(xùn)練并且每隔20次輸出結(jié)果 for n in range(201): sess.run(train) if n % 20 == 0: print(n, sess.run(Weights), sess.run(biases)) pre = x_data * sess.run(Weights) + sess.run(biases) # 可視化分析 plt.scatter(x_data, y_data) plt.plot(x_data, pre, 'r-') plt.show()
輸出結(jié)果如下圖所示,權(quán)重從最初的隨機(jī)數(shù)0.3913201,逐漸優(yōu)化成目標(biāo)0.1;偏置從最初的隨機(jī)數(shù)0.19479582,逐步優(yōu)化到0.3,通過不斷地學(xué)習(xí)和訓(xùn)練。
8.可視化對(duì)比多張效果圖的完整代碼
# -*- coding: utf-8 -*- """ Created on Sun Dec 1 20:00:14 2019 @author: xiuzhang """ # -*- coding: utf-8 -*- """ Created on 2019-11-30 下午6點(diǎn) 寫于武漢大學(xué) @author: Eastmount CSDN YXZ """ import tensorflow as tf import numpy as np import matplotlib.pyplot as plt x_data = np.random.rand(100).astype(np.float32) y_data = x_data * 0.1 + 0.3 #權(quán)重0.1 偏置0.3 #------------------開始創(chuàng)建tensorflow結(jié)構(gòu)------------------ # 權(quán)重和偏置 Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) biases = tf.Variable(tf.zeros([1])) # 預(yù)測(cè)值y y = Weights * x_data + biases # 損失函數(shù) loss = tf.reduce_mean(tf.square(y-y_data)) # 建立神經(jīng)網(wǎng)絡(luò)優(yōu)化器 optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.5) #學(xué)習(xí)效率 train = optimizer.minimize(loss) # 初始化變量 init = tf.global_variables_initializer() #------------------結(jié)束創(chuàng)建tensorflow結(jié)構(gòu)------------------ # 可視化 plt.plot(x_data, y_data,'ro', marker='^', c='blue',label='original_data') plt.legend() plt.show() # 定義Session sess = tf.Session() # 運(yùn)行時(shí)Session就像一個(gè)指針 指向要處理的位置并激活 sess.run(init) # 訓(xùn)練并且每隔20次輸出結(jié)果 k = 0 for n in range(200): sess.run(train) if n % 20 == 0: print(n, sess.run(Weights), sess.run(biases)) pre = x_data * sess.run(Weights) + sess.run(biases) # 可視化分析 k = k + 1 plt.subplot(5, 2, k) plt.plot(x_data, y_data, 'ro') plt.plot(x_data, pre, label=k) plt.legend() plt.show()
輸出結(jié)果如下圖所示:
四.總結(jié)
寫到這里,這篇基礎(chǔ)性的TensorFlow文章就講述完畢。它通過不斷地訓(xùn)練和學(xué)習(xí),將預(yù)測(cè)結(jié)果與實(shí)際曲線y=0.1*x+0.3向匹配,這是非?;A(chǔ)的一篇深度學(xué)習(xí)文章,同時(shí)文章中存在錯(cuò)誤或不足之處,還請(qǐng)海涵~同時(shí),作為人工智能的菜鳥,我希望自己能不斷進(jìn)步并深入,后續(xù)將它應(yīng)用于圖像識(shí)別、網(wǎng)絡(luò)安全、對(duì)抗樣本等領(lǐng)域,一起加油!女神晚上收到了又一封家書,道不盡的思戀,讀博不易,寫文也不易,且行且珍惜。
感恩能與大家在華為云遇見!
希望能與大家一起在華為云社區(qū)共同成長(zhǎng)。
【百變AI秀】有獎(jiǎng)?wù)魑幕馃徇M(jìn)行中:https://bbs.huaweicloud.com/blogs/296704
(By:娜璋之家 Eastmount 2021-09-04 夜于武漢)
參考文獻(xiàn):
AI Python TensorFlow
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。