国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

TensorFlow架構(gòu)與實(shí)現(xiàn)機(jī)制的研究

2019-09-28 01:25張浩然
關(guān)鍵詞:數(shù)據(jù)流權(quán)重運(yùn)算

費(fèi) 寧,張浩然,2

(1.南京郵電大學(xué) 計(jì)算機(jī)學(xué)院、軟件學(xué)院,江蘇 南京 210003;2.大連交通大學(xué) 軟件學(xué)院,遼寧 大連 116028)

0 引 言

隨著大數(shù)據(jù)技術(shù)的發(fā)展,簡(jiǎn)單的機(jī)器邏輯已經(jīng)滿足不了人們對(duì)于各種電子設(shè)備智能化的要求,因此人工智能應(yīng)運(yùn)而生。目前相關(guān)的研究主要集中在針對(duì)特定場(chǎng)景的算法優(yōu)化和通用機(jī)器學(xué)習(xí)框架的開(kāi)發(fā)。在后者當(dāng)中尤其以Google的深度學(xué)習(xí)框架TensorFlow最為著名,TensorFlow目前已經(jīng)支持眾多編程語(yǔ)言、操作系統(tǒng)環(huán)境和硬件架構(gòu)(CPU和GPU)[1]。TensorFlow是利用人工智能神經(jīng)網(wǎng)絡(luò)來(lái)分析和處理復(fù)雜數(shù)據(jù)結(jié)構(gòu)的系統(tǒng)[2],是一種支持深度學(xué)習(xí)的開(kāi)源軟件庫(kù),可以實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)(CNN)、循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)和深度神經(jīng)網(wǎng)絡(luò)(DNN)等經(jīng)典算法,并在語(yǔ)音識(shí)別、自然語(yǔ)言理解、計(jì)算機(jī)視覺(jué)等方面得到了廣泛應(yīng)用[3]。

1 TensorFlow框架與結(jié)構(gòu)分析

TensorFlow(TF)顧名思義,是由tensor加flow組成。這里的tensor是指參加運(yùn)算所需要的數(shù)據(jù),其類型可以是整形、浮點(diǎn)和字符串;在TF中的存在形式可以是變量(tf.Variable)、常量(tf.constant)、占位符(tf.placeholder)以及稀疏矩陣(tf.SparseTensor);其維度可以為標(biāo)量(Scalar)、一階數(shù)組(Vector)、二階矩陣(Matrix)以及其他高階數(shù)據(jù)。flow是指數(shù)據(jù)的流向,實(shí)際所代表的是對(duì)數(shù)據(jù)的操作(數(shù)據(jù)類型轉(zhuǎn)換、矩陣運(yùn)算、梯度運(yùn)算等)和流程的控制(循環(huán)、條件判斷、命名空間等)。為了便于理解,Google使用一種數(shù)據(jù)流圖的形式來(lái)表示,其中tensor用邊表示,用來(lái)描述數(shù)據(jù)的流向(入數(shù)據(jù)和出數(shù)據(jù));對(duì)數(shù)據(jù)所施加的操作用節(jié)點(diǎn)表示,沒(méi)有沖突的操作可以并行運(yùn)行,這也是GPU在很多場(chǎng)景中能夠提高TF運(yùn)算的原因。

Google采用了數(shù)據(jù)流圖來(lái)形象地描述TensorFlow的運(yùn)算過(guò)程。在數(shù)據(jù)流圖中,整個(gè)計(jì)算過(guò)程用“節(jié)點(diǎn)”(nodes)和“邊”(edges)的有向圖來(lái)描述?!肮?jié)點(diǎn)”一般用來(lái)表示施加的數(shù)學(xué)操作,或者表示數(shù)據(jù)輸入的起點(diǎn)和輸出的終點(diǎn)?!斑叀北硎尽肮?jié)點(diǎn)”之間的輸入/輸出關(guān)系。這些數(shù)據(jù)“邊”可以傳遞“大小可動(dòng)態(tài)調(diào)整”的多維數(shù)據(jù)數(shù)組,即“張量”(tensor)[4]。

圖1 TensorFlow數(shù)據(jù)流圖示意

圖1為一個(gè)簡(jiǎn)單的線性回歸訓(xùn)練的數(shù)據(jù)流圖。其中X為輸入變量(往往為一階數(shù)組,即Vector)在和初始預(yù)測(cè)的權(quán)重(weight)進(jìn)行矩陣乘之后,加上偏移量(bias)即可得到估計(jì)的輸出,這個(gè)結(jié)果和輸入Y進(jìn)行比較(圖中的sub運(yùn)算,也就是差運(yùn)算)可以得到當(dāng)次運(yùn)算的損耗(loss)。實(shí)際上整個(gè)回歸運(yùn)算就是不斷遞歸求出最小損耗的權(quán)重(weight)和偏移(bias)的過(guò)程[5-6]。這個(gè)過(guò)程一般采用梯度下降Gradients Descent[7-9]來(lái)驗(yàn)證是否收斂,從而提煉出最終的訓(xùn)練結(jié)果。

TensorFlow程序的構(gòu)造如下所述:

下面的代碼顯示了TensorFlow程序的典型結(jié)構(gòu)。該程序用線性回歸來(lái)擬合一組權(quán)重為1、偏移量為0.3的數(shù)據(jù)。TensorFlow在編程時(shí)分成了三個(gè)部分:輸入變量的初始化和預(yù)處理;訓(xùn)練方法的定義和參數(shù)的初始化;會(huì)話層的執(zhí)行。

第一步,定義輸入層的輸入值x_data,是一百個(gè)隨機(jī)生成的數(shù)據(jù),輸出層為y_data。在較復(fù)雜的神經(jīng)網(wǎng)絡(luò)中,可以先制定好定義框架,將具體的數(shù)據(jù)生成方式滯后定義。這樣可以在整個(gè)神經(jīng)網(wǎng)絡(luò)框架的不同地方使用不同的數(shù)據(jù)生成方式調(diào)用這個(gè)變量,從而達(dá)到精簡(jiǎn)代碼長(zhǎng)度的效果。

第二步,定義TensorFlow結(jié)構(gòu)體,如果涉及到神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的搭建,一般需要定義權(quán)重(weight)和偏移(bias)兩個(gè)常用的矩陣[10-11]。在此例中,定義了weight的一維張量,是介于-1.0到1.0的隨機(jī)數(shù);同時(shí)初始化bias為0。此例目的是期望將weight和bias分別訓(xùn)練至y_data表達(dá)式中預(yù)設(shè)置的0.1和0.3。

再定義機(jī)器學(xué)習(xí)中最重要的損耗值(loss),也就是在經(jīng)過(guò)某一組數(shù)據(jù)的訓(xùn)練后,TensorFlow建造的神經(jīng)網(wǎng)絡(luò)訓(xùn)練值與真實(shí)值的差值[12-13]。有了損耗值之后,計(jì)算機(jī)就可以通過(guò)比較訓(xùn)練值和真實(shí)值,并利用稍后定義的優(yōu)化函數(shù)(optimizer)進(jìn)行訓(xùn)練(train),一般通過(guò)梯度下降算法來(lái)實(shí)現(xiàn)。同時(shí),optimizer優(yōu)化函數(shù)還將對(duì)計(jì)算機(jī)學(xué)習(xí)的速率進(jìn)行設(shè)定,學(xué)習(xí)速率是一個(gè)小于1的常數(shù)。

import tensorflow as tf //第一部分:定義輸入變量

import numpy as np

x_data=np.random.rand(100).astype(np.float32) //x_data作為輸入值

y_data=x_data*0.1+0.3 //y_data作為輸出,預(yù)設(shè)權(quán)重為0.1,偏移為0.3

weights=tf.Variable(tf.random_uniform([1],-1.0,1.0))//定義初始權(quán)重 //第二部分:定義訓(xùn)練方法

biases=tf.Variable(tf.zeros([1])) //定義初始偏移

y=weights*x_data+biases //定義擬合算法,此處為線性回歸

loss=tf.reduce_mean(tf.square(y-y_data)) //計(jì)算損耗

optimizer=tf.train.GradientDescentOptimizer(0.5) //定義優(yōu)化函數(shù),設(shè)置學(xué)習(xí)速率

train=optimizer.minimize(loss) //使用優(yōu)化器訓(xùn)練以減少誤差

init=tf.initialize_all_variables() //初始化所有變量

sess=tf.Session() //第三部分:會(huì)話執(zhí)行

sess.run(init)//初始化變量

for step in range(201)://擬合平面

sess.run(train)

if step%20==0;

print(step,sess.run(weights),sess.run(biases))

第三步,會(huì)話層(session)的定義和執(zhí)行。此例直接調(diào)用TensorFlow本身默認(rèn)的會(huì)話層,同時(shí)還需要完成訓(xùn)練循環(huán)體的設(shè)定,訓(xùn)練循環(huán)體在train函數(shù)中定義,直接使用sess.run(train)來(lái)激活。在初始化會(huì)話中的變量之后,就可以開(kāi)始訓(xùn)練,結(jié)果如圖2所示。圖2(a)是算法在學(xué)習(xí)效率為0.1時(shí)的情況,可以看到兩個(gè)預(yù)測(cè)值逐漸逼近0.1和0.3,這說(shuō)明算法能夠有效學(xué)習(xí),并且通過(guò)二者比值可以看出最終的學(xué)習(xí)準(zhǔn)確率為99%;圖2(b)顯示設(shè)置學(xué)習(xí)效率為0.9時(shí),由于下降梯度過(guò)快錯(cuò)過(guò)了最低點(diǎn)而導(dǎo)致算法無(wú)法收斂,所以學(xué)習(xí)無(wú)法繼續(xù)。

(a)學(xué)習(xí)效率為0.1 (b)學(xué)習(xí)效率為0.9圖2 學(xué)習(xí)效率分別為0.1和0.9時(shí)的輸出值

2 TensorFlow實(shí)現(xiàn)機(jī)制的研究

2.1 建立一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)

在神經(jīng)網(wǎng)絡(luò)框架成型之后,下面可以建立一個(gè)具體的神經(jīng)網(wǎng)絡(luò)了。此處通過(guò)一個(gè)典型的三層神經(jīng)網(wǎng)絡(luò)來(lái)研究TensorFlow神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)機(jī)制,其包含一個(gè)輸入層,一個(gè)隱藏層及一個(gè)輸出層,其組成模塊如圖3所示。

圖3 三層神經(jīng)網(wǎng)絡(luò)模塊示意

以下的TensorFlow源代碼來(lái)自GitHub(https://morvanzhou.github.io/),其具備良好的程序結(jié)構(gòu)和清晰的注釋,是一個(gè)典型的三層人工神經(jīng)網(wǎng)絡(luò)。該神經(jīng)網(wǎng)絡(luò)的關(guān)鍵代碼如下。其作用是通過(guò)訓(xùn)練使計(jì)算機(jī)能夠?qū)⒍S平面上的散點(diǎn)擬合成一條折線。在定義的隱藏層結(jié)構(gòu)中,定義了權(quán)重、偏移,每一次訓(xùn)練的算法為輸入乘以權(quán)重加偏移、并且規(guī)定了相應(yīng)的激勵(lì)函數(shù),這樣就得到一個(gè)隱藏層模板。隱藏層訓(xùn)練的結(jié)果使用ReLU函數(shù)進(jìn)行篩選修正,結(jié)果送至輸出層進(jìn)行處理。此處選擇了目前廣泛應(yīng)用的ReLU函數(shù),其原理是丟棄所有負(fù)值域且保持正值域的線性選擇,運(yùn)算速度較快。

x_data=np.linspace(-1,1,300)[:,np.newaxis] //數(shù)據(jù)輸入輸出的定義

noise=np.random.normal(0,0.05,x_data.shape)

y_data=np.square(x_data)-0.5+noise

xs=tf.placeholder(tf.float32,[None,1]) //定義節(jié)點(diǎn)準(zhǔn)備接收數(shù)據(jù)

ys=tf.placeholder(tf.float32,[None,1])

l1=add_layer(xs,1,10,activation_function = tf.nn.relu) //定義神經(jīng)層

prediction=add_layer(l1,10,1,activation_function=None)

loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction), reduction_indices-[1])) //定義損耗

train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss) //選擇優(yōu)化器使loss最小

隱藏層定義十個(gè)神經(jīng)元,這些神經(jīng)元的輸入即是隱藏層的輸出,每個(gè)神經(jīng)元的訓(xùn)練算法與隱藏層相同,即乘以權(quán)重加偏移,所不同的是這一層不再有激勵(lì)函數(shù),其輸出即為最終訓(xùn)練的結(jié)果。

至此神經(jīng)網(wǎng)絡(luò)構(gòu)建完畢。初始化所有定義的數(shù)據(jù)和神經(jīng)層之后,將圖放在默認(rèn)的Session中運(yùn)行。每一次訓(xùn)練之后,訓(xùn)練結(jié)果將通過(guò)feed函數(shù)反饋給神經(jīng)網(wǎng)絡(luò)以調(diào)整神經(jīng)節(jié)點(diǎn)結(jié)構(gòu)。學(xué)習(xí)過(guò)程可以使用matplotlib模塊圖像化為圖4。圖中散點(diǎn)是計(jì)算機(jī)隨機(jī)生成的,其橫軸數(shù)據(jù)即為圖3中的一維向量X;黑色折線是計(jì)算機(jī)對(duì)這些散點(diǎn)的擬合。可以看到多數(shù)的點(diǎn)集中在黑色折線附近,表明該神經(jīng)網(wǎng)絡(luò)訓(xùn)練取得了比較好的訓(xùn)練結(jié)果。

圖4 使用matplotlib可視化的訓(xùn)練結(jié)果

2.2 可視化工具TensorBoard的定義和使用

Google開(kāi)發(fā)出TensorFlow中內(nèi)置的神經(jīng)網(wǎng)絡(luò)可視化工具TensorBoard[14]。TensorBoard除了能夠得到如圖1所示的數(shù)據(jù)流圖之外,還可以對(duì)訓(xùn)練過(guò)程中的各個(gè)分量進(jìn)行觀測(cè),從而更好地理解訓(xùn)練過(guò)程及調(diào)整訓(xùn)練參數(shù)。

如果想要通過(guò)TensorBoard觀察訓(xùn)練過(guò)程中的各個(gè)分量,就需要將相關(guān)變量加入tf.summary模塊。目前支持的類型有一維數(shù)據(jù)(scalar)、直方圖(histogram)、文本以及包含圖形和聲音的tensor綜合信息等。在整個(gè)訓(xùn)練過(guò)程中,損耗的遞減過(guò)程表明了整個(gè)訓(xùn)練持續(xù)收斂,也就是說(shuō)所選擇的激勵(lì)函數(shù)能夠在每一步有效地篩選訓(xùn)練結(jié)果。

在實(shí)際的訓(xùn)練過(guò)程中,可以觀察每一步各個(gè)分量的分布情況。圖5顯示了第996次訓(xùn)練過(guò)程中隱藏層(圖ReLu層)和輸出層(圖中Prediction層)的權(quán)重和偏移的分布情況。

這里需要注意的是,由于在每次訓(xùn)練過(guò)程中權(quán)重和偏移為一組向量,這里用直方圖來(lái)表示其分布情況,并非代表每組向量的值。在實(shí)際調(diào)試過(guò)程中,也可以將任何類型的變量轉(zhuǎn)化為字符串通過(guò)文本類型來(lái)顯示。

圖5 非一維數(shù)據(jù)(Scalar)的直方圖可視化

3 結(jié)束語(yǔ)

通過(guò)對(duì)Google TensorFlow框架的研究,展示了使用TensorFlow完整實(shí)現(xiàn)人工神經(jīng)網(wǎng)絡(luò)的全過(guò)程。結(jié)合TensorFlow的數(shù)據(jù)流圖以及TensorBoard所提供的可視化工具,進(jìn)一步探索TensorFlow的實(shí)現(xiàn)機(jī)制及調(diào)試方法。

猜你喜歡
數(shù)據(jù)流權(quán)重運(yùn)算
優(yōu)先級(jí)驅(qū)動(dòng)的泛化航電網(wǎng)絡(luò)實(shí)時(shí)性能分析
權(quán)重望寡:如何化解低地位領(lǐng)導(dǎo)的補(bǔ)償性辱虐管理行為?*
重視運(yùn)算與推理,解決數(shù)列求和題
汽車維修數(shù)據(jù)流基礎(chǔ)(上)
權(quán)重常思“浮名輕”
汽車維修數(shù)據(jù)流基礎(chǔ)(下)
長(zhǎng)算式的簡(jiǎn)便運(yùn)算
數(shù)據(jù)流安全查詢技術(shù)綜述
為黨督政勤履職 代民行權(quán)重?fù)?dān)當(dāng)
權(quán)重漲個(gè)股跌 持有白馬藍(lán)籌
云和县| 密山市| 清镇市| 漳州市| 宿松县| 永靖县| 武冈市| 侯马市| 沙湾县| 蕲春县| 陕西省| 嫩江县| 云安县| 铁岭县| 汉寿县| 武隆县| 三亚市| 宁武县| 太仆寺旗| 保康县| 江陵县| 宜春市| 兰考县| 许昌县| 桦甸市| 乐都县| 永登县| 泌阳县| 灵丘县| 白朗县| 从化市| 壶关县| 潼南县| 天台县| 叙永县| 博客| 霞浦县| 广安市| 辛集市| 海宁市| 诸暨市|