0
本文作者: 陳鳴鳩 | 2017-01-18 09:39 |
雷鋒網(wǎng)按:本文是介紹用TensorFlow構(gòu)建圖像識(shí)別系統(tǒng)的第三部分。 在前兩部分中,我們構(gòu)建了一個(gè)softmax分類(lèi)器來(lái)標(biāo)記來(lái)自CIFAR-10數(shù)據(jù)集的圖像,實(shí)現(xiàn)了約25-30%的精度。 因?yàn)橛?0個(gè)不同可能性的類(lèi)別,所以我們預(yù)期的隨機(jī)標(biāo)記圖像的精度為10%。25-30%的結(jié)果已經(jīng)比隨機(jī)標(biāo)記的結(jié)果好多了,但仍有很大的改進(jìn)空間。在這篇文章中,作者Wolfgang Beyer將介紹如何構(gòu)建一個(gè)執(zhí)行相同任務(wù)的神經(jīng)網(wǎng)絡(luò)??纯纯梢蕴岣哳A(yù)測(cè)精度到多少!雷鋒網(wǎng)對(duì)全文進(jìn)行編譯,未經(jīng)許可不得轉(zhuǎn)載。
關(guān)于前兩部分,可以參看《機(jī)器學(xué)習(xí)零基礎(chǔ)?手把手教你用TensorFlow搭建圖像識(shí)別系統(tǒng)》(一)和(二)。
神經(jīng)網(wǎng)絡(luò)是基于生物大腦的工作原理設(shè)計(jì)的,由許多人工神經(jīng)元組成,每個(gè)神經(jīng)元處理多個(gè)輸入信號(hào)并返回單個(gè)輸出信號(hào),然后輸出信號(hào)可以用作其他神經(jīng)元的輸入信號(hào)。我們先來(lái)看看一個(gè)單獨(dú)的神經(jīng)元,大概長(zhǎng)這樣:
一個(gè)人工神經(jīng)元:其輸出是其輸入加權(quán)和的ReLU函數(shù)值。
在單個(gè)神經(jīng)元中發(fā)生的情況與在softmax分類(lèi)器中發(fā)生的情況非常相似。一個(gè)神經(jīng)元有一個(gè)輸入值的向量和一個(gè)權(quán)重值的向量,權(quán)重值是神經(jīng)元的內(nèi)部參數(shù)。輸入向量和權(quán)重值向量包含相同數(shù)量的值,因此可以使用它們
WeightedSum=input1×w1+input2×w2+...
到目前為止,我們正在做與softmax分類(lèi)器完全相同的計(jì)算,現(xiàn)在開(kāi)始,我們要進(jìn)行一些不同的處理:只要加權(quán)和的結(jié)果是正值,神經(jīng)元的輸出是這個(gè)值;但是如果加權(quán)和是負(fù)值,就忽
由 f(x) = max(0, x)定義的整流線性單元
使用ReLU的原因是其具備非線性特點(diǎn),因而現(xiàn)在神經(jīng)元的輸出并不是嚴(yán)格的輸入線性組合(也就是加權(quán)和)。當(dāng)我們不再?gòu)膯蝹€(gè)神經(jīng)元而是從整個(gè)網(wǎng)絡(luò)來(lái)看時(shí),會(huì)發(fā)現(xiàn)非線性很有用處。
人工神經(jīng)網(wǎng)絡(luò)中的神經(jīng)元通常不是彼此隨機(jī)連接的,大多數(shù)時(shí)候是分層排列的:
人工神經(jīng)網(wǎng)絡(luò)具有隱藏層和輸出層2個(gè)層。
輸入并不被當(dāng)作一層,因?yàn)樗皇菍?shù)據(jù)(不轉(zhuǎn)換它)饋送到第一個(gè)合適的層。
輸入圖像的像素值是第1層網(wǎng)絡(luò)中的神經(jīng)元的輸入。第1層中的神經(jīng)元的輸出是第2層網(wǎng)絡(luò)的神經(jīng)元的輸入,后面的層之間以此類(lèi)推。如果沒(méi)有每層的ReLU,我們只是得到一個(gè)加權(quán)和的序列;并且堆積的加權(quán)和可以被合并成單個(gè)加權(quán)和,這樣一來(lái),多個(gè)層并沒(méi)有比單層網(wǎng)絡(luò)有任何改進(jìn)之處。這就是為什么要具有非線性的重要原因。ReLU非線性解決了上述問(wèn)題,它使每個(gè)附加層的確給網(wǎng)絡(luò)添加了一些改進(jìn)。
我們所關(guān)注的是圖像類(lèi)別的分?jǐn)?shù),它是網(wǎng)絡(luò)的最后一層的輸出。在這個(gè)網(wǎng)絡(luò)架構(gòu)中,每個(gè)神經(jīng)元連接到前一層的所有神經(jīng)元,因此這種網(wǎng)絡(luò)被稱(chēng)為完全連接的網(wǎng)絡(luò)。我們將會(huì)在本教程的第3部分中看到一些不同于此的其他情況。
對(duì)神經(jīng)網(wǎng)絡(luò)理論的簡(jiǎn)短介紹到此結(jié)束。 讓我們開(kāi)始建立一個(gè)真正的神經(jīng)網(wǎng)絡(luò)!
此示例的完整代碼在Github上提供。它需要TensorFlow和CIFAR-10數(shù)據(jù)集(雷鋒網(wǎng)的此前文章有提及)。
如果你已經(jīng)通過(guò)我以前的博客文章,你會(huì)看到神經(jīng)網(wǎng)絡(luò)分類(lèi)器的代碼非常類(lèi)似于softmax分類(lèi)器的代碼。 除了切換出定義模型的代碼部分之外,我還添加了一些小功能使TensorFlow可以做以下一些事情:
正則化:這是一種非常常見(jiàn)的技術(shù),用于防止模型過(guò)擬合。它的工作原理是在優(yōu)化過(guò)程中施加反作用力,其目的是保持模型簡(jiǎn)單
使用TensorBoard可視化模型:TensorBoard包含TensorFlow,允許您根據(jù)模型和模型生成的數(shù)據(jù)生成表格和圖形。這有助于分析您的模型,并且對(duì)調(diào)試特別有用。
檢查點(diǎn):此功能允許您保存模型的當(dāng)前狀態(tài)以供以后使用。訓(xùn)練一個(gè)模型可能需要相當(dāng)長(zhǎng)的時(shí)間,所以它是必要的,當(dāng)您想再次使用模型時(shí)不必從頭開(kāi)始。
這次代碼被分成兩個(gè)文件:定義模型two_layer_fc.py和運(yùn)行模型run_fc_model.py(提示:'fc'代表完全連接的意思)。
讓我們先看看模型本身,然后進(jìn)行一些運(yùn)行和訓(xùn)練處理。two_layer_fc.py包含以下函數(shù):
inference(),使我們從輸入數(shù)據(jù)到類(lèi)分?jǐn)?shù)。
loss(),從類(lèi)分?jǐn)?shù)中計(jì)算損失值。
training(),執(zhí)行單個(gè)訓(xùn)練步驟。
evaluation(),計(jì)算網(wǎng)絡(luò)的精度。
inference()描述了通過(guò)網(wǎng)絡(luò)的正向傳遞。那么,類(lèi)分?jǐn)?shù)是如何從輸入圖片開(kāi)始被計(jì)算的呢?
參數(shù)images是包含實(shí)際圖像數(shù)據(jù)的TensorFlow占位符。接下來(lái)的三個(gè)參數(shù)描述網(wǎng)絡(luò)的形狀或大小。 image_pixels是每個(gè)輸入圖像的像素?cái)?shù),classes是不同輸出標(biāo)簽的數(shù)量,hidden_units是網(wǎng)絡(luò)的第一個(gè)層或者隱藏層中的神經(jīng)元數(shù)量。
每個(gè)神經(jīng)元從上一層獲取所有值作為輸入,并生成單個(gè)輸出值。因此,隱藏層中的每個(gè)神經(jīng)元都具有image_pixels輸入,并且該層作為整體生成hidden_units輸出。然后將這些輸入到輸出層的類(lèi)神經(jīng)元中,生成類(lèi)輸出值,每個(gè)類(lèi)一個(gè)分?jǐn)?shù)。
reg_constant是正則化常數(shù)。TensorFlow允許我們非常容易地通過(guò)自動(dòng)處理大部分計(jì)算來(lái)向網(wǎng)絡(luò)添加正則化。 當(dāng)使用到損失函數(shù)時(shí),我會(huì)進(jìn)一步講述細(xì)節(jié)。
由于神經(jīng)網(wǎng)絡(luò)有2個(gè)相似的圖層,因此將為每個(gè)層定義一個(gè)單獨(dú)的范圍。 這允許我們?cè)诿總€(gè)作用域中重復(fù)使用變量名。變量biases以我們熟悉的tf.Variable()方式來(lái)定義。
此處會(huì)更多地涉及到weights變量的定義。tf.get_variable()允許我們添加正則化。weights是以hidden_units(輸入向量大小乘以輸出向量大?。榫S度的image_pixels矩陣。initialier參數(shù)描述了weights變量的初始值。目前為止我們已經(jīng)將weights變量初始化為0,但此處并不會(huì)起作用。關(guān)于單層中的神經(jīng)元,它們都接收完全相同的輸入值,如果它們都具有相同的內(nèi)部參數(shù),則它們將進(jìn)行相同的計(jì)算并且輸出相同的值。為了避免這種情況,需要隨機(jī)化它們的初始權(quán)重。我們使用了一個(gè)通??梢院芎眠\(yùn)行的初始化方案,將weights初始化為正態(tài)分布值。丟棄與平均值相差超過(guò)2個(gè)標(biāo)準(zhǔn)偏差的值,并且將標(biāo)準(zhǔn)偏差設(shè)置為輸入像素?cái)?shù)量的平方根的倒數(shù)。幸運(yùn)的是TensorFlow為我們處理了所有這些細(xì)節(jié),我們只需要指定調(diào)用truncated_normal_initializer便可完成上述工作。
weights變量的最終參數(shù)是regularizer?,F(xiàn)在要做的是告訴TensorFlow要為weights變量使用L2-正則化。我將在這里討論正則化。
第一層的輸出等于images矩陣乘以weights矩陣,再加上bisa變量。這與上一篇博文中的softmax分類(lèi)器完全相同。然后應(yīng)用tf.nn.relu(),取ReLU函數(shù)的值作為隱藏層的輸出。
第2層與第1層非常相似,其輸入值為hidden_units,輸出值為classes,因此weights矩陣的維度是是[hidden_units,classes]。 由于這是我們網(wǎng)絡(luò)的最后一層,所以不再需要ReLU。 通過(guò)將輸入(hidden)互乘以weights,再加上bias就可得到類(lèi)分?jǐn)?shù)(logits)。
tf.histogram_summary()允許我們記錄logits變量的值,以便以后用TensorBoard進(jìn)行分析。這一點(diǎn)稍后會(huì)介紹。
總而言之,整個(gè)inference()函數(shù)接收輸入圖像并返回類(lèi)分?jǐn)?shù)。這是一個(gè)訓(xùn)練有素的分類(lèi)器需要做的,但為了得到一個(gè)訓(xùn)練有素的分類(lèi)器,首先需要測(cè)量這些類(lèi)分?jǐn)?shù)表現(xiàn)有多好,這是損失函數(shù)要做的工作。
首先,我們計(jì)算logits(模型的輸出)和labels(來(lái)自訓(xùn)練數(shù)據(jù)集的正確標(biāo)簽)之間的交叉熵,這已經(jīng)是我們對(duì)softmax分類(lèi)器的全部損失函數(shù),但是這次我們想要使用正則化,所以必須給損失添加另一個(gè)項(xiàng)。
讓我們先放一邊吧,先看看通過(guò)使用正則化能實(shí)現(xiàn)什么。
當(dāng)捕獲數(shù)據(jù)中隨機(jī)噪聲的統(tǒng)計(jì)模型是被數(shù)據(jù)訓(xùn)練出來(lái)的而不是真實(shí)的數(shù)據(jù)基礎(chǔ)關(guān)系時(shí),就被稱(chēng)為過(guò)擬合。
紅色和藍(lán)色圓圈表示兩個(gè)不同的類(lèi)。綠線代表過(guò)擬合模型,而黑線代表具有良好擬合的模型。
在上面的圖像中有兩個(gè)不同的類(lèi),分別由藍(lán)色和紅色圓圈表示。綠線是過(guò)度擬合的分類(lèi)器。它完全遵循訓(xùn)練數(shù)據(jù),同時(shí)也嚴(yán)重依賴(lài)于訓(xùn)練數(shù)據(jù),并且可能在處理未知數(shù)據(jù)時(shí)比代表正則化模型的黑線表現(xiàn)更差。因此,我們的正則化目標(biāo)是得到一個(gè)簡(jiǎn)單的模型,不附帶任何不必要的復(fù)雜。我們選擇L2-正則化來(lái)實(shí)現(xiàn)這一點(diǎn),L2正則化將網(wǎng)絡(luò)中所有權(quán)重的平方和加到損失函數(shù)。如果模型使用大權(quán)重,則對(duì)應(yīng)重罰分,并且如果模型使用小權(quán)重,則小罰分。
這就是為什么我們?cè)诙x權(quán)重時(shí)使用了regularizer參數(shù),并為它分配了一個(gè)l2_regularizer。這告訴了TensorFlow要跟蹤l2_regularizer這個(gè)變量的L2正則化項(xiàng)(并通過(guò)參數(shù)reg_constant對(duì)它們進(jìn)行加權(quán))。所有正則化項(xiàng)被添加到一個(gè)損失函數(shù)可以訪問(wèn)的集合——tf.GraphKeys.REGULARIZATION_LOSSES。將所有正則化損失的總和與先前計(jì)算的交叉熵相加,以得到我們的模型的總損失。
global_step是跟蹤執(zhí)行訓(xùn)練迭代次數(shù)的標(biāo)量變量。當(dāng)在我們的訓(xùn)練循環(huán)中重復(fù)運(yùn)行模型時(shí),我們已經(jīng)知道這個(gè)值,它是循環(huán)的迭代變量。直接將這個(gè)值添加到TensorFlow圖表的原因是想要能夠拍攝模型的快照,這些快照應(yīng)包括有關(guān)已執(zhí)行了多少訓(xùn)練步驟的信息。
梯度下降優(yōu)化器的定義很簡(jiǎn)單。我們提供學(xué)習(xí)速率并告訴優(yōu)化器它應(yīng)該最小化哪個(gè)變量。 此外,優(yōu)化程序會(huì)在每次迭代時(shí)自動(dòng)遞增global_step參數(shù)。
模型精度的計(jì)算與softmax情況相同:將模型的預(yù)測(cè)與真實(shí)標(biāo)簽進(jìn)行比較,并計(jì)算正確預(yù)測(cè)的頻率。 我們還對(duì)隨著時(shí)間的推移精度如何演變感興趣,因此添加了一個(gè)跟蹤accuracy的匯總操作。 將在關(guān)于TensorBoard的部分中介紹這一點(diǎn)。
總結(jié)我們迄今為止做了什么,已經(jīng)定義了使用4個(gè)函數(shù)的2層人工神經(jīng)網(wǎng)絡(luò)的行為:inference()構(gòu)成通過(guò)網(wǎng)絡(luò)的正向傳遞并返回類(lèi)分?jǐn)?shù)。loss()比較預(yù)測(cè)和真實(shí)的類(lèi)分?jǐn)?shù)并生成損失值。 training()執(zhí)行訓(xùn)練步驟,并優(yōu)化模型的內(nèi)部參數(shù)。evaluation()測(cè)量模型的性能。
現(xiàn)在神經(jīng)網(wǎng)絡(luò)已經(jīng)定義完畢,讓我們看看run_fc_model.py是如何運(yùn)行、訓(xùn)練和評(píng)估模型的。
在強(qiáng)制導(dǎo)入之后,將模型參數(shù)定義為外部標(biāo)志。 TensorFlow有自己的命令行參數(shù)模塊,這是一個(gè)圍繞Python argparse的小封裝包。 在這里使用它是為了方便,但也可以直接使用argparse。
在代碼開(kāi)頭兩行中定義了命令行參數(shù)。每個(gè)標(biāo)志的參數(shù)是標(biāo)志的名稱(chēng)(其默認(rèn)值和一個(gè)簡(jiǎn)短的描述)。 使用-h標(biāo)志執(zhí)行文件將顯示這些描述。第二個(gè)代碼塊調(diào)用實(shí)際解析命令行參數(shù)的函數(shù),然后將所有參數(shù)的值打印到屏幕上。
用常數(shù)定義每個(gè)圖像的像素?cái)?shù)(32 x 32 x 3)和不同圖像類(lèi)別的數(shù)量。
使用一個(gè)時(shí)鐘來(lái)記錄運(yùn)行時(shí)間。
我們想記錄關(guān)于訓(xùn)練過(guò)程的一些信息,并使用TensorBoard顯示該信息。 TensorBoard要求每次運(yùn)行的日志都位于單獨(dú)的目錄中,因此我們將日期和時(shí)間信息添加到日志目錄的名稱(chēng)地址。
load_data()加載CIFAR-10數(shù)據(jù),并返回包含獨(dú)立訓(xùn)練和測(cè)試數(shù)據(jù)集的字典。
定義TensorFlow占位符。 當(dāng)執(zhí)行實(shí)際計(jì)算時(shí),這些將被填充訓(xùn)練和測(cè)試數(shù)據(jù)。
images_placeholder將每張圖片批處理成一定尺寸乘以像素的大小。 批處理大小設(shè)定為“None”允許運(yùn)行圖片時(shí)可隨時(shí)設(shè)定大?。ㄓ糜谟?xùn)練網(wǎng)絡(luò)的批處理大小可以通過(guò)命令行參數(shù)設(shè)置,但是對(duì)于測(cè)試,我們將整個(gè)測(cè)試集作為一個(gè)批處理) 。
labels_placeholder是一個(gè)包含每張圖片的正確類(lèi)標(biāo)簽的整數(shù)值向量。
這里引用了我們之前在two_layer_fc.py中描述的函數(shù)。
inference()使我們從輸入數(shù)據(jù)到類(lèi)分?jǐn)?shù)。
loss()從類(lèi)分?jǐn)?shù)中計(jì)算損失值。
training()執(zhí)行單個(gè)訓(xùn)練步驟。
evaluation()計(jì)算網(wǎng)絡(luò)的精度。
為T(mén)ensorBoard定義一個(gè)summary操作函數(shù) (更多介紹可參見(jiàn)前文).
生成一個(gè)保存對(duì)象以保存模型在檢查點(diǎn)的狀態(tài)(更多介紹可參見(jiàn)前文)。
開(kāi)始TensorFlow會(huì)話并立即初始化所有變量。 然后我們創(chuàng)建一個(gè)匯總編輯器,使其定期將日志信息保存到磁盤(pán)。
這些行負(fù)責(zé)生成批輸入數(shù)據(jù)。讓我們假設(shè)我們有100個(gè)訓(xùn)練圖像,批次大小為10.在softmax示例中,我們只為每次迭代選擇了10個(gè)隨機(jī)圖像。這意味著,在10次迭代之后,每個(gè)圖像將被平均選取一次。但事實(shí)上,一些圖像將被選擇多次,而一些圖像不會(huì)被添加到任何一個(gè)批次。但只要重復(fù)的次數(shù)夠頻發(fā),所有圖片被隨機(jī)分到不同批次的情況會(huì)有所改善。
這一次我們要改進(jìn)抽樣過(guò)程。要做的是首先對(duì)訓(xùn)練數(shù)據(jù)集的100個(gè)圖像隨機(jī)混洗?;煜粗蟮臄?shù)據(jù)的前10個(gè)圖像作為我們的第一個(gè)批次,接下來(lái)的10個(gè)圖像是我們的第二批,后面的批次以此類(lèi)推。 10批后,在數(shù)據(jù)集的末尾,再重復(fù)混洗過(guò)程,和開(kāi)始步驟一致,依次取10張圖像作為一批次。這保證沒(méi)有任何圖像比任何其它圖像被更頻繁地拾取,同時(shí)仍然確保圖像被返回的順序是隨機(jī)的。
為了實(shí)現(xiàn)這一點(diǎn),data_helpers()中的gen_batch()函數(shù)返回一個(gè)Python generator,它在每次評(píng)估時(shí)返回下一個(gè)批次。generator原理的細(xì)節(jié)超出了本文的范圍(這里有一個(gè)很好的解釋?zhuān)?。使用Python的內(nèi)置zip()函數(shù)來(lái)生成一個(gè)來(lái)自[(image1,label1),(image2,label2),...]的元組列表,然后將其傳遞給生成函數(shù)。
next(batch)返回下一批數(shù)據(jù)。 因?yàn)樗匀皇荹(imageA,labelA),(imageB,labelB),...]的形式,需要先解壓它以從標(biāo)簽中分離圖像,然后填充feed_dict,字典包含用單批培訓(xùn)數(shù)據(jù)填充的TensorFlow占位符。
每100次迭代之后模型的當(dāng)前精度會(huì)被評(píng)估并打印到屏幕上。此外,正在運(yùn)行summary操作,其結(jié)果被添加到負(fù)責(zé)將摘要寫(xiě)入磁盤(pán)的summary_writer(看此章節(jié))。
此行運(yùn)行train_step操作(之前定義為調(diào)用two_layer_fc.training(),它包含用于優(yōu)化變量的實(shí)際指令)。
當(dāng)訓(xùn)練模型需要較長(zhǎng)的時(shí)間,有一個(gè)簡(jiǎn)單的方法來(lái)保存你的進(jìn)度的快照。 這允許您以后回來(lái)并恢復(fù)模型在完全相同的狀態(tài)。 所有你需要做的是創(chuàng)建一個(gè)tf.train.Saver對(duì)象(我們之前做的),然后每次你想拍攝快照時(shí)調(diào)用它的save()方法。恢復(fù)模型也很簡(jiǎn)單,只需調(diào)用savever的restore()。 代碼示例請(qǐng)看gitHub存儲(chǔ)庫(kù)中的restore_model.py文件。
在訓(xùn)練完成后,最終模型在測(cè)試集上進(jìn)行評(píng)估(記住,測(cè)試集包含模型到目前為止還沒(méi)有看到的數(shù)據(jù),使我們能夠判斷模型是否能推廣到新的數(shù)據(jù))。
讓我們使用默認(rèn)參數(shù)通過(guò)“python run_fc_model.py”運(yùn)行模型。 我的輸出如下所示:
可以看到訓(xùn)練的準(zhǔn)確性開(kāi)始于我們所期望到隨機(jī)猜測(cè)水平(10級(jí) - > 10%的機(jī)會(huì)選擇到正確的)。 在第一次約1000次迭代中,精度增加到約50%,并且在接下來(lái)的1000次迭代中圍繞該值波動(dòng)。 46%的測(cè)試精度不低于訓(xùn)練精度。 這表明我們的模型沒(méi)有顯著過(guò)度擬合。 softmax分級(jí)器的性能約為30%,因此46%的改進(jìn)約為50%。不錯(cuò)!
TensorBoard允許您從不同方面可視化TensorFlow圖形,并且對(duì)于調(diào)試和改進(jìn)網(wǎng)絡(luò)非常有用。 讓我們看看TensorBoard相關(guān)的代碼。
在 two_layer_fc.py 我可以看到以下代碼:
這三行中的每一行都創(chuàng)建一個(gè)匯總操作。通過(guò)定義一個(gè)匯總操作告訴TensorFlow收集某些張量(在本例中l(wèi)ogits,loss和accuracy)的摘要信息。匯總操作的其他參數(shù)就只是一些想要添加到總結(jié)的標(biāo)簽。
有不同種類(lèi)的匯總操作。使用scalar_summary記錄有關(guān)標(biāo)量(非矢量)值以及histogram_summary收集有關(guān)的多個(gè)值分布信息(有關(guān)各種匯總運(yùn)算更多信息可以在TensorFlow文檔中找到)。
在 run_fc_model.py 是關(guān)于TensorBoard 可視化的一些代碼:
TensorFlow中的一個(gè)操作本身不運(yùn)行,您需要直接調(diào)用它或調(diào)用依賴(lài)于它的另一個(gè)操作。由于我們不想在每次要收集摘要信息時(shí)單獨(dú)調(diào)用每個(gè)摘要操作,因此使用tf.merge_all_summaries創(chuàng)建一個(gè)運(yùn)行所有摘要的單個(gè)操作。
在TensorFlow會(huì)話的初始化期間,創(chuàng)建一個(gè)摘要寫(xiě)入器,摘要編入器負(fù)責(zé)將摘要數(shù)據(jù)實(shí)際寫(xiě)入磁盤(pán)。在摘要寫(xiě)入器的構(gòu)造函數(shù)中,logdir是日志的寫(xiě)入地址??蛇x的圖形參數(shù)告訴TensorBoard渲染顯示整個(gè)TensorFlow圖形。每100次迭代,我們執(zhí)行合并的匯總操作,并將結(jié)果饋送到匯總寫(xiě)入器,將它們寫(xiě)入磁盤(pán)。要查看結(jié)果,我們通過(guò)“tensorboard --logdir = tf_logs”運(yùn)行TensorBoard,并在Web瀏覽器中打開(kāi)localhost:6006。在“事件”標(biāo)簽中,我們可以看到網(wǎng)絡(luò)的損失是如何減少的,以及其精度是如何隨時(shí)間增加而增加的。
tensorboard圖顯示模型在訓(xùn)練中的損失和精度。
“Graphs”選項(xiàng)卡顯示一個(gè)已經(jīng)定義的可視化的tensorflow圖,您可以交互式地重新排列直到你滿意。我認(rèn)為下面的圖片顯示了我們的網(wǎng)絡(luò)結(jié)構(gòu)非常好。
Tensorboard1以交互式可視化的方式顯示Tensorboard圖像
有關(guān)在“分布”和“直方圖”標(biāo)簽的信息可以進(jìn)一步了解tf.histogram_summary操作,這里不做進(jìn)一步的細(xì)節(jié)分析,更多信息可在官方tensorflow文件相關(guān)部分。
也許你正在想訓(xùn)練softmax分類(lèi)器的計(jì)算時(shí)間比神經(jīng)網(wǎng)絡(luò)少了很多。事實(shí)確實(shí)如此,但即使把訓(xùn)練softmax分類(lèi)器的時(shí)間增加到和神經(jīng)網(wǎng)絡(luò)來(lái)訓(xùn)練所用的時(shí)間一樣長(zhǎng),前者也不會(huì)達(dá)到和神經(jīng)網(wǎng)絡(luò)相同的性能,前者訓(xùn)練時(shí)間再長(zhǎng),額外的收益和一定程度的性能改進(jìn)幾乎是微乎其微的。我們也已經(jīng)在神經(jīng)網(wǎng)絡(luò)中也驗(yàn)證也這點(diǎn),額外的訓(xùn)練時(shí)間不會(huì)顯著提高準(zhǔn)確性,但還有別的事情我們可以做。
已選的默認(rèn)參數(shù)值表現(xiàn)是相當(dāng)不錯(cuò)的,但還有一些改進(jìn)的余地。通過(guò)改變參數(shù),如隱藏層中的神經(jīng)元的數(shù)目或?qū)W習(xí)率,應(yīng)該能夠提高模型的準(zhǔn)確性,模型的進(jìn)一步優(yōu)化使測(cè)試精度很可能大于50%。如果這個(gè)模型可以調(diào)整到65%或更多,我也會(huì)相當(dāng)驚喜。但還有另一種類(lèi)型的網(wǎng)絡(luò)結(jié)構(gòu)能夠比較輕易實(shí)現(xiàn)這一點(diǎn):卷積神經(jīng)網(wǎng)絡(luò),這是一類(lèi)不完全連通的神經(jīng)網(wǎng)絡(luò),相反,它們嘗試在其輸入中理解局部特征,這對(duì)于分析圖像非常有用。它使得在解讀圖像獲取空間信息的時(shí)候有非常直觀的意義。在本系列的下一部分中,我們將看到卷積神經(jīng)網(wǎng)絡(luò)的工作原理,以及如何構(gòu)建一個(gè)自己的神經(jīng)網(wǎng)絡(luò).。
雷鋒網(wǎng)將關(guān)注下一部分關(guān)于卷積神經(jīng)網(wǎng)絡(luò)的介紹,敬請(qǐng)期待。
via wolfib,雷鋒網(wǎng)編譯
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。