Tensorflow中的卷積神經網絡

機器學習 人工智能 深度學習 科技 不靠譜的貓 2018-12-02

最令人興奮的深度學習領域之一是計算機視覺。通過卷積神經網絡的最新進展,我們已經能夠創造出自動駕駛汽車,面部檢測系統和自動醫學圖像分析,這些都是專家們的專長。在本文中,我將向您展示卷積神經網絡的基礎知識,以及如何自己創建一個來對手寫數字進行分類。

Tensorflow中的卷積神經網絡

與許多深度學習領域不同,卷積神經網絡與人類大腦的生物功能非常接近。早在1959年,David Hubel和Torsten Wiesel對貓和猴進行了研究,這些研究揭示了視覺皮層的功能。他們發現,許多神經元有一個小的局部接受區,只對整個視野中有限的小區域作出反應。他們發現,某些神經元對水平較低的圖案,如水平線、垂直線和其他圓形圖案有反應。他們還認識到,其他神經元有更大的接受區,並受到更復雜的模式的刺激,這些模式是由較低層次的神經元收集的信息的組合。這些發現為我們現在所說的卷積神經網絡奠定了基礎。讓我們一個一個地分解構成單元。

1.卷積層

Tensorflow中的卷積神經網絡

每個卷積層由若干特徵圖構成,這些特徵圖通過filters 饋送信息,filters 檢測諸如水平線或垂直線之類的特徵。您可以將每個filter描繪成一個窗口,該窗口在圖像的尺寸上滑動並檢測屬性。filters 在圖像上移動的量稱為步幅。步幅為1意味著filter一次移動一個像素,因為2的步幅將跳過2個像素跳過。

Tensorflow中的卷積神經網絡

在上面的例子中,我們有一個垂直線檢測器。原始圖像為6x6,使用3x3濾鏡進行掃描,步長為1,從而產生4x4尺寸輸出。過濾器僅對其視野左右列中的部分感興趣。通過將圖像的輸入乘以3x3 filter的配置,我們得到3 + 1 + 2 -1 -7-5 = -7。然後filter向右移動一步,然後計算1 + 0 + 3 -2-3-1 = -2。-2然後進入-7右側的位置。此過程將持續到4x4網格完成為止。然後,下一個要素圖將使用它自己的唯一filter/內核矩陣計算自己的值。

Tensorflow中的卷積神經網絡

2.池化層

池化層的目標是通過池化卷積層收集的值或所謂的子採樣來進一步降低維度。這將減少計算負荷,併為您的機器學習模型提供一些正則化,以避免過度擬合。它們遵循與conv層相同的滑動窗口思想,而不是計算它們選擇其輸入的最大值或平均值的所有值。這分別稱為最大池化和平均池化。

Tensorflow中的卷積神經網絡

這兩個組件是卷積層的關鍵構建塊。然後,您通常會重複此方法,進一步減少特徵圖的尺寸,但會增加其深度。每個特徵圖將專門識別它自己獨特的shape。在卷積結束時,您將放置一個全連接層,其具有激活函數,例如Relu或Selu,用於將尺寸reshape為適合送入分類器的矢量。例如,如果您的最終轉換層輸出3x3x128矩陣,但您只預測10個不同的類,則需要將其reshape為1x1152向量,並在輸入分類器之前逐漸減小其大小。完全連接的層也會學習它們自己的函數,就像典型的深度神經網絡一樣。

Tensorflow中的卷積神經網絡

現在讓我們看看在MNIST手寫數字數據集上的Tensorflow中的實現。首先,我們將加載我們的Python庫。使用sklearn中的fetch_mldata,我們加載mnist數據集並將圖像和標籤分配給X和y變量。然後我們將創建我們的訓練/測試數據集。最後,我們將舉幾個例子來了解未來的任務。

Tensorflow中的卷積神經網絡

Tensorflow中的卷積神經網絡

正如您所看到的,有一些具有挑戰性的例子。右側都是1。

接下來,我們將進行一些數據擴充,這是提高模型性能的可靠方法。通過創建訓練圖像的輕微變化,您實際上可以為模型創建正則化。我們將使用scipy的ndimage模塊將圖像向右,向左,向上和向下移動1個像素。這不僅提供了更多種類的例子,而且還會大大增加我們訓練集的大小,這通常總是一件好事。

Tensorflow中的卷積神經網絡

Tensorflow中的卷積神經網絡

Tensorflow中的卷積神經網絡

我將向您展示的最後一種數據擴充形式是使用cv2庫創建圖像的水平翻轉。我們還需要為這些翻轉圖像創建新標籤,這與複製原始標籤一樣簡單。

Tensorflow中的卷積神經網絡

設置“flipCode = 0”將產生垂直翻轉。

Tensorflow中的卷積神經網絡

接下來,我們將創建一個輔助函數,將隨機的小批量輸入到我們的神經網絡輸入中。由於卷積層的性質,它們在向前和向後遍歷步驟中需要大量的內存。考慮一個帶有4x4過濾器的層,輸出128個具有1步長和相同填充的feature map, RGB圖像輸入的尺寸為299x299。參數的數量將相等(4x4x3 + 1)x 128 = 6272.現在考慮這128個特徵圖中的每一個都計算299x299個神經元,並且這些神經元中的每一個都計算4x4x3輸入的加權和。現在是4x4x3x299x299x150 = 643,687,200次計算。這只是一個訓練的例子。你可以想象這很快就會失控。解決這一問題的方法是,使用python生成器一次向網絡提供小批量的內容,這種生成器本質上是在需要項之前將其保存在內存之外。

Tensorflow中的卷積神經網絡

我們準備開始創建我們的神經網絡架構。首先,我們為我們的訓練數據/標籤創建佔位符。我們將需要將它們reshape為(-1,28,28,1)矩陣,因為tensorflow conv2d層需要4維輸入。我們將第一個維度設置為“無”,以允許將任意批量大小提供給佔位符。

Tensorflow中的卷積神經網絡

現在我們將設計我們的卷積層。我將從Le-NET5(由Yann LeCun開創)網絡架構中獲取靈感,該架構因其在手寫數字分類方面的成功而聞名。然而,有很多事情我做了不同的事情。我建議您研究Le-NET5以及其他經過驗證的模型,以瞭解哪種卷積網絡適用於不同的任務。

Tensorflow中的卷積神經網絡

第一層由12個特徵圖組成,使用3x3 filter,步幅為1.我們選擇了SAME填充,通過在輸入周圍添加一個零填充來保持圖像的尺寸。然後,我們應用最大池化層與另一個3x3 filter和步長為2,將輸出13x13x12矩陣。所以我們從一個28x28x1的圖像開始,並且生成的filter maps 的尺寸小於其尺寸的一半但深度更深。然後我們將這個矩陣傳遞給第二個conv 層,它具有深度為16,3x3 filter,stride = 1和padding SAME ,與之前相同的最大池化層。這輸出一個6 * 6 * 16維矩陣。您可以看到我們正在縮小特徵圖的維度空間,但要更深入。這是我們學習的地方,在第一層把較低層次的圖組合起來,在第二層形成更復雜的圖。接下來,我們通過將其reshape為由6x6x16 = 576值組成的1維行向量來準備全連接層的輸出。我們使用Selu激活的兩個dense 層來減少每層輸入的數量大約一半,直到最終將它們輸入我們的logits,這將輸出10個預測。

Tensorflow中的卷積神經網絡

我們創建了我們的損失函數,在這種情況下,它將是softmax交叉熵,它將輸出多類概率。您可以將交叉熵視為各種數據點之間距離的度量。我們選擇AdamOptimizer,當它向下移動梯度時自動調整它的學習率。最後,我們創建了一種評估結果的方法。in_top_k將計算我們的logits並選擇最高分。然後我們使用我們的準確度變量輸出0-1之間的值。

現在我們已經為訓練階段做好了準備。首先,我將訓練模型。讓我們看看我們的機器學習模型表現得如何。

Tensorflow中的卷積神經網絡

在第19 epoch,我們達到最高百分比正確在0.9907。這已經比任何機器學習算法的結果更好,因此卷積已經取得了領先。現在讓我們嘗試使用我們的移位特徵/翻轉特徵,併為我們的網絡添加兩個新元素。dropout和批歸一化。

Tensorflow中的卷積神經網絡

我們使用placeholder_with_default節點修改現有佔位符,這些節點將保存批歸一化和Dropout層生成的值。在訓練期間,我們將這些值設置為True,在測試期間,我們將通過設置為False將其關閉。

Tensorflow中的卷積神經網絡

批歸一化只是簡單地對每批次的數據進行中心化和歸一化。我們指定了0.9的momentum 。Drop out正則化指定概率(在我們的情況下為1 -0.5)以在訓練期間完全隨機地關閉節點。想象一下,一家公司決定每週隨機選擇50名員工留在家裡。其餘的工作人員將不得不有效地處理額外的工作,提高他們在其他領域的技能。不確定這會在現實生活中起作用,但在深度學習中它已被證明是有效的。

Tensorflow中的卷積神經網絡

我們像以前一樣創建我們的損失,訓練和評估步驟,然後對我們的執行階段進行一些修改。通過批歸一化化執行的計算在每次迭代期間保存為更新操作。為了訪問這些,我們分配一個變量extra_update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)。在我們的訓練操作期間,我們將其作為列表項與training_op一起提供給sess.run。最後,在執行驗證/測試預測時,我們通過feed_dict為佔位符分配False值。我們不會在預測階段進行任何隨機化。為了獲得輸出,我們使用我們的測試集運行logits操作。讓我們看看這個模型現在表現得如何,我們已經添加了正則化/歸一化並且正在使用增強特徵。

Tensorflow中的卷積神經網絡

在29 epoch,我們在10,000個數字的測試集上達到了99.5%的準確率。正如你所看到的那樣,只有第二個epoch的模型精確度達到了99%,而之前的模型只有16個精度。雖然0.05%聽起來可能不是很多,但在處理大量數據時這是一個重大改進。最後,我將向您展示如何在logits輸出上使用np.argmax提取預測。

Tensorflow中的卷積神經網絡

相關推薦

推薦中...