您好,登錄后才能下訂單哦!
這篇文章給大家介紹Tensorflow中CNN入門(mén)的手寫(xiě)數(shù)字識(shí)別是怎樣的,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
深度學(xué)習(xí)最令人興奮的領(lǐng)域之一就是計(jì)算機(jī)視覺(jué)。通過(guò)卷積神經(jīng)網(wǎng)絡(luò),我們已經(jīng)能夠創(chuàng)建自動(dòng)駕駛汽車(chē)系統(tǒng)、面部檢測(cè)系統(tǒng)和自動(dòng)醫(yī)學(xué)圖像分析等等。我將向你展示卷積神經(jīng)網(wǎng)絡(luò)的基本原理以及如何自己創(chuàng)建一個(gè)對(duì)手寫(xiě)數(shù)字進(jìn)行分類(lèi)的系統(tǒng)。
cdn.com/f6b247650f1d689504cfca4e25034dcb51025592.jpeg">
卷積神經(jīng)網(wǎng)絡(luò)的功能似乎是人類(lèi)大腦中生物功能的復(fù)制,早在1959年,David Hubel和Torsten Wiesel對(duì)貓和猴進(jìn)行了研究,這些研究揭示了動(dòng)物視覺(jué)皮層的功能。他們發(fā)現(xiàn)的是,許多神經(jīng)元具有小的局部接受性,即僅對(duì)整個(gè)視野的一小塊有限區(qū)域起反應(yīng)。他們發(fā)現(xiàn)某些神經(jīng)元會(huì)對(duì)某些特定模式做出反應(yīng),例如水平線、垂直線和其他圓形。他們還發(fā)現(xiàn)其他神經(jīng)元具有更大的感受野并且被更復(fù)雜的模式刺激,這些模式是由較低水平神經(jīng)元收集的信息組合。這些發(fā)現(xiàn)奠定了我們現(xiàn)在稱(chēng)之為卷積神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)。接下來(lái),我們逐一介紹卷積神經(jīng)網(wǎng)絡(luò)的組成。
1、卷積層
卷積神經(jīng)網(wǎng)絡(luò)中每層卷積層由若干卷積單元組成,每個(gè)卷積單元的參數(shù)都是通過(guò)反向傳播算法最佳化得到的。卷積運(yùn)算的目的是提取輸入的不同特征,第一層卷積層可能只能提取一些低級(jí)的特征如邊緣、線條和角等層級(jí),更多層的網(wǎng)路能從低級(jí)特征中迭代提取更復(fù)雜的特征。你可以將每個(gè)過(guò)濾器描繪成一個(gè)窗口,該窗口在圖像的尺寸上滑動(dòng)并檢測(cè)屬性。濾鏡在圖像上滑動(dòng)的像素?cái)?shù)量稱(chēng)為步幅。步幅為1意味著濾波器一次移動(dòng)一個(gè)像素,其中2的步幅將向前跳過(guò)2個(gè)像素。
在上面的例子中,我們可以看到一個(gè)垂直線檢測(cè)器。原始圖像為6x6,它使用3x3濾鏡進(jìn)行掃描,步長(zhǎng)為1,從而產(chǎn)生4x4尺寸輸出。而過(guò)濾器僅對(duì)其視野左右列中的部分感興趣。通過(guò)對(duì)圖像的輸入求和并乘以3×3濾波器的配置,我們得到3+1+2-1-7-5=-7。然后濾波器向右移動(dòng)一步,然后計(jì)算1+0+3-2-3-1=-2。-2然后進(jìn)入-7右側(cè)的位置。此過(guò)程將持續(xù)到4x4網(wǎng)格完成為止。之后,下一個(gè)特征圖將使用它自己的唯一過(guò)濾器/內(nèi)核矩陣計(jì)算自己的值。
2.池化層
池化層的目標(biāo)是通過(guò)聚合卷積層收集的值或所謂的子采樣來(lái)進(jìn)一步降低維度。除了為模型提供一些正則化的方案以避免過(guò)度擬合之外,這還將減少計(jì)算量。它們遵循與卷積層相同的滑動(dòng)窗口思想,但不是計(jì)算所有值,而是選擇其輸入的最大值或平均值。這分別稱(chēng)為最大池化和平均池化。
這兩個(gè)組件是卷積層的關(guān)鍵構(gòu)建塊。然后,你通常會(huì)重復(fù)此方法,進(jìn)一步減少特征圖的尺寸,但會(huì)增加其深度。每個(gè)特征圖將專(zhuān)門(mén)識(shí)別它自己獨(dú)特的形狀。在卷積結(jié)束時(shí),會(huì)放置一個(gè)完全連接的圖層,其具有激活功能,例如Relu或Selu,用于將尺寸重新整形為適合的尺寸送入分類(lèi)器。例如,如果你的最終轉(zhuǎn)換層為3x3x128矩陣,但你只預(yù)測(cè)10個(gè)不同的類(lèi),則需要將其重新整形為1x1152向量,并在輸入分類(lèi)器之前逐漸減小其大小。完全連接的層也將學(xué)習(xí)它們自己的特征,如在典型的深度神經(jīng)網(wǎng)絡(luò)中。
現(xiàn)在讓我們看看在MNIST手寫(xiě)數(shù)字?jǐn)?shù)據(jù)集上的Tensorflow中的實(shí)現(xiàn)。首先,我們將加載我們的庫(kù)。使用sklearn中的fetch_mldata,我們加載mnist數(shù)據(jù)集并將圖像和標(biāo)簽分配給x和y變量。然后我們將創(chuàng)建我們的訓(xùn)練/測(cè)試裝置。最后,我們將舉幾個(gè)例子來(lái)了解任務(wù)。
接下來(lái),我們將進(jìn)行一些數(shù)據(jù)增強(qiáng),這是提高模型性能的可靠方法。通過(guò)創(chuàng)建訓(xùn)練圖像的輕微變化,可以為模型創(chuàng)建正則化。我們將使用Scipy的ndimage模塊將圖像向右、向左、向上和向下移動(dòng)1個(gè)像素。這不僅提供了更多種類(lèi)的例子,而且還會(huì)大大增加我們訓(xùn)練集的大小。
我將向你展示的最后一種數(shù)據(jù)增強(qiáng)的方式:使用cv2庫(kù)創(chuàng)建圖像的水平翻轉(zhuǎn)。我們還需要為這些翻轉(zhuǎn)圖像創(chuàng)建新標(biāo)簽,這與復(fù)制原始標(biāo)簽一樣簡(jiǎn)單。
設(shè)置“flipCode = 0”將產(chǎn)生垂直翻轉(zhuǎn)
接下來(lái),我們將創(chuàng)建一個(gè)輔助函數(shù),用于將隨機(jī)微型批次提供給我們的神經(jīng)網(wǎng)絡(luò)輸入。由于卷積層的性質(zhì),它們?cè)谇跋蚝秃笙騻鞑ゲ襟E期間需要大量的存儲(chǔ)器。考慮具有4x4濾鏡的圖層,輸出128步幅為1的特征圖和具有尺寸299x299的RGB圖像輸入的SAME填充。參數(shù)的數(shù)量將相等(4x4x3+1)x128 = 6272.現(xiàn)在考慮這128個(gè)特征圖中的每一個(gè)都計(jì)算299x299個(gè)神經(jīng)元,并且這些神經(jīng)元中的每一個(gè)都計(jì)算4x4x3輸入的加權(quán)和。這意味著我們需要4x4x3x299x299x150=643,687,200次計(jì)算,這只是一個(gè)訓(xùn)練的例子。
現(xiàn)在我們開(kāi)始創(chuàng)建我們的網(wǎng)絡(luò)架構(gòu)。首先,我們?yōu)槲覀兊呐嘤?xùn)數(shù)據(jù)/特征創(chuàng)建占位符。我們需要將它們重新整形為(-1,28,28,1)矩陣,因?yàn)閠ensorflow conv2d層需要4維輸入。我們將第一個(gè)維度設(shè)置為“null”,以允許將任意批量大小提供給占位符。
接著我們?cè)O(shè)計(jì)我們的卷積層,我是從Le-NET5(由Yann LeCun開(kāi)創(chuàng))網(wǎng)絡(luò)架構(gòu)中獲取靈感,該架構(gòu)因其在手寫(xiě)數(shù)字分類(lèi)方面成功而聞名。我建議你研究Le-NET5以及其他經(jīng)過(guò)驗(yàn)證的模型,這樣就可以了解哪種卷積網(wǎng)絡(luò)適用于不同的任務(wù)。鏈接:http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf。
我們模型卷積層的第一層由12個(gè)特征圖組成,使用3x3過(guò)濾器,步幅為1。我們選擇了SAME填充,通過(guò)在輸入周?chē)砑右粋€(gè)零填充來(lái)保持圖像的尺寸。然后,我們?cè)O(shè)置最大池化層使用3x3過(guò)濾器,步幅為1,這將輸出13x13x12矩陣。所以我們從一個(gè)28x28x1的圖像開(kāi)始,然后我們將這個(gè)矩陣傳遞給第二個(gè)轉(zhuǎn)換層,第二個(gè)轉(zhuǎn)換層具有3x3過(guò)濾器的深度,stride=1和SAME填充。這將輸出一個(gè)6*6*16維矩陣。你可以看到我們正在縮小特征圖的維度空間,但要更深入。接下來(lái),我們使用Selu函數(shù)激活兩個(gè)密集層來(lái)減少每層輸入的數(shù)量大約一半,直到最終將它們輸入我們的logits。
接著我們創(chuàng)建我們的損失函數(shù),在這種情況下,它將是softmax交叉熵,它將輸出多類(lèi)概率。你可以將交叉熵視為各種數(shù)據(jù)點(diǎn)之間距離的度量。我們選擇AdamOptimizer(自適應(yīng)矩估計(jì)),當(dāng)梯度下降時(shí)自動(dòng)調(diào)整它的學(xué)習(xí)率。最后,我們創(chuàng)建了一種評(píng)估結(jié)果的方法。Tensorflow的in_top_k函數(shù)將計(jì)算我們的logits并選擇最高分。然后我們使用我們的準(zhǔn)確度變量輸出0-1%之間的百分比。
現(xiàn)在我們已經(jīng)為訓(xùn)練階段做好了準(zhǔn)備,讓我們看看我們的模型表現(xiàn)得如何。
在第19epoch,我們的正確率在0.9907。這已經(jīng)比任何機(jī)器學(xué)習(xí)算法的結(jié)果更好,因此卷積已經(jīng)取得了領(lǐng)先。現(xiàn)在讓我們嘗試使用我們的移位功能/翻轉(zhuǎn)功能,并為我們的網(wǎng)絡(luò)添加兩個(gè)新元素:dropout和批量標(biāo)準(zhǔn)化。
我們使用placeholder_with_default節(jié)點(diǎn)修改現(xiàn)有占位符,這些節(jié)點(diǎn)將保存批量標(biāo)準(zhǔn)化和dropout層生成的值。在訓(xùn)練期間,我們將這些值設(shè)置為T(mén)rue,在測(cè)試期間,我們將通過(guò)設(shè)置為False將其關(guān)閉。
批量標(biāo)準(zhǔn)化只是簡(jiǎn)單地對(duì)每批次的數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化。我們指定了0.9的動(dòng)量。而dropout和正則化指定動(dòng)量為1才能在訓(xùn)練期間完全隨機(jī)地關(guān)閉節(jié)點(diǎn)。這導(dǎo)致其余節(jié)點(diǎn)必須松弛,從而提高其有效性。想象一下,一家公司決定每周隨機(jī)選擇50名員工留在家里。其余的工作人員將不得不有效地處理額外的工作,提高他們?cè)谄渌I(lǐng)域的技能。
接著我們創(chuàng)建我們的損失函數(shù),訓(xùn)練步驟和評(píng)估步驟,然后對(duì)我們的執(zhí)行階段進(jìn)行一些修改。通過(guò)批量標(biāo)準(zhǔn)化執(zhí)行的計(jì)算在每次迭代期間保存為更新操作。為了訪問(wèn)這些,我們分配一個(gè)變量extra_update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)。在我們的訓(xùn)練操作期間,我們將其作為列表項(xiàng)與training_op一起提供給sess.run。最后,在執(zhí)行驗(yàn)證/測(cè)試預(yù)測(cè)時(shí),我們通過(guò)feed_dict為占位符分配False值。我們不希望在預(yù)測(cè)階段有任何隨機(jī)化。為了獲得輸出,我們使用我們的測(cè)試集運(yùn)行l(wèi)ogits操作。讓我們看看這個(gè)模型添加正則化/標(biāo)準(zhǔn)化并且正在使用增強(qiáng)數(shù)據(jù)的方法后表現(xiàn)得如何。
在29epoch,我們?cè)?0,000個(gè)數(shù)字的測(cè)試集上達(dá)到了99.5%的準(zhǔn)確率。正如你所看到的那樣,第二個(gè)epoch時(shí)模型精確度達(dá)到了99%,而之前的模型只有16%。雖然0.05%可能不是很多,但在處理大量數(shù)據(jù)時(shí)這是一個(gè)重大改進(jìn)。最后,我將向你展示如何在logits輸出上使用np.argmax產(chǎn)生的預(yù)測(cè)。
關(guān)于Tensorflow中CNN入門(mén)的手寫(xiě)數(shù)字識(shí)別是怎樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。