2TensorFlow的框架
2.1TensorFlow輸入張量
TensorFlow的命名來源于本身的運(yùn)行原理。Tensor(張量)意味著N維數(shù)組,F(xiàn)low(流)意味著基于數(shù)據(jù)流圖的計(jì)算。用MNIST機(jī)器學(xué)習(xí)[23]這個(gè)例子來解釋一個(gè)用于預(yù)測圖片里面的數(shù)字的模型。
首先要先獲得一個(gè)MNIST數(shù)據(jù)集,如圖3所示,這個(gè)數(shù)據(jù)集能夠在TensorFlow官網(wǎng)上進(jìn)行下載。每一個(gè)MNIST數(shù)據(jù)單元由一張包含手寫數(shù)字的圖片和一個(gè)對應(yīng)的標(biāo)簽兩部分組成。把這些圖片設(shè)為“xs”,把這些標(biāo)簽設(shè)為“ys”。MNIST數(shù)據(jù)集擁有60 000行的訓(xùn)練數(shù)據(jù)集(mnist.train)和10 000行的測試數(shù)據(jù)集(mnist.test)。


每一張圖片包含28×28個(gè)像素點(diǎn)??梢杂靡粋€(gè)數(shù)字?jǐn)?shù)組來表示這張圖片:把這個(gè)數(shù)組展開成一個(gè)向量,長度是784。在MNIST訓(xùn)練數(shù)據(jù)集中,mnist.train.images(訓(xùn)練數(shù)集中的圖片)是一個(gè) [60 000, 784] 的張量,如圖4所示,第一個(gè)維度數(shù)字用來對應(yīng)每張圖片,第二個(gè)維度數(shù)字用來索引每張圖片中的像素點(diǎn)。在此張量里的每一個(gè)元素,都表示為某張圖片里的某個(gè)像素的介于0和1之間的強(qiáng)度值。
相對應(yīng)的標(biāo)簽是從0到9的數(shù)字,用來描述給定圖片里表示的數(shù)字。每個(gè)數(shù)字對應(yīng)著相應(yīng)位置1,如標(biāo)簽0表示為[1,0,0,0,0,0,0,0,0,0],因此mnist.train.labels是一個(gè) [60 000, 10] 的數(shù)字矩陣,如圖5所示。
如上述的這兩個(gè)數(shù)組都是二維數(shù)組,都是TensorFlow中的張量數(shù)據(jù)[4],而這些數(shù)據(jù)就以流的形式進(jìn)入數(shù)據(jù)運(yùn)算的各個(gè)節(jié)點(diǎn)。而以機(jī)器算法為核心所構(gòu)造的模型就是數(shù)據(jù)流動的場所。TensorFlow就是一個(gè)是文件庫,研究人員和計(jì)算機(jī)科學(xué)家能夠借助這個(gè)文件庫打造分析圖像和語音等數(shù)據(jù)的系統(tǒng),計(jì)算機(jī)在此類系統(tǒng)的幫助下,將能夠自行作出決定,從而變得更加智能。
2.2TensorFlow代碼框架
TensorFlow是一個(gè)非常靈活的框架,它能夠運(yùn)行在個(gè)人計(jì)算機(jī)或者服務(wù)器的單個(gè)或多個(gè)CPU和GPU上,甚至是移動設(shè)備上。
可以從上面舉例的MNIST機(jī)器學(xué)習(xí)來分析TensorFlow的框架。首先,要構(gòu)建一個(gè)計(jì)算的過程。MNIST所用到的算法核心就是softmax回歸算法,這個(gè)算法就是通過對已知訓(xùn)練數(shù)據(jù)同個(gè)標(biāo)簽的像素加權(quán)平均,來構(gòu)建出每個(gè)標(biāo)簽在不同像素點(diǎn)上的權(quán)值,若是這個(gè)像素點(diǎn)具有有利的證據(jù)說明這張圖片不屬于這類,那么相應(yīng)的權(quán)值為負(fù)數(shù),相反若是這個(gè)像素?fù)碛杏欣淖C據(jù)支持這張圖片屬于這個(gè)類,那么權(quán)值是正數(shù)。
因?yàn)檩斎胪鶗в幸恍o關(guān)的干擾量,于是加入一個(gè)額外的偏置量(bias)。因此對于給定的輸入圖片x它代表的是數(shù)字i的證據(jù),可以表示為:
evidencei=∑jWi,jxj+bi(1)
其中Wi,j表示權(quán)值的矩陣,xj為給定圖片的像素點(diǎn),bi代表數(shù)字i類的偏置量。
在這里不給出詳細(xì)的推導(dǎo)過程,但是可以得到一個(gè)計(jì)算出一個(gè)圖片對應(yīng)每個(gè)標(biāo)簽的概率大小的計(jì)算方式,可以通過如下的代碼來得到一個(gè)概率分布:
y=softmax(Wx+b)(2)
建立好一個(gè)算法模型之后,算法內(nèi)輸入的所有可操作的交互單元就像式(2)中的圖片輸入x,為了適應(yīng)所有的圖片輸入,將其設(shè)置為變量占位符placeholder。而像權(quán)重W和偏置值b這兩個(gè)通過學(xué)習(xí)不斷修改值的單元設(shè)置為變量Variable。
train_step=tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
TensorFlow在這一步就是在后臺給描述計(jì)算的那張圖里面增添一系列新的計(jì)算操作單元用來實(shí)現(xiàn)反向傳播算法和梯度下降算法。它返回一個(gè)單一的操作,當(dāng)運(yùn)行這個(gè)操作時(shí),可以用梯度下降算法來訓(xùn)練模型,微調(diào)變量,不斷減少成本,從而建立好一個(gè)基本模型。
建立好模型之后,創(chuàng)建一個(gè)會話(Session),循環(huán)1 000次,每次批處理100個(gè)數(shù)據(jù),開始數(shù)據(jù)訓(xùn)練,代碼如下:
sess= tf.InteractiveSession()
for i in range(1000):
batch_xs,batch_ys=mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
TensorFlow通過數(shù)據(jù)輸入(Feeds)將張量數(shù)據(jù)輸入至模型中,而張量Tensor就像數(shù)據(jù)流一樣流過每個(gè)計(jì)算節(jié)點(diǎn),微調(diào)變量,使得模型更加準(zhǔn)確。
通過這個(gè)例子,可以管中窺豹了解TensorFlow的框架結(jié)構(gòu),TensorFlow對于輸入的計(jì)算過程在后臺描述成計(jì)算圖,計(jì)算圖建立好之后,創(chuàng)建會話Session來提交計(jì)算圖,用Feed輸入訓(xùn)練的張量數(shù)據(jù),TensorFlow通過在后臺增加計(jì)算操作單元用于訓(xùn)練模型,微調(diào)數(shù)據(jù),從而完成一個(gè)機(jī)器的學(xué)習(xí)任務(wù)[5]。
電子發(fā)燒友App
















評論