TensorFlow中的單層神經網路
在前言中,我評論說深度學習的一個常見用途包括模式識別。考慮到這一點,就像初學者通過在螢幕上列印“Hello World”開始學習程式語言一樣,在深度學習中,我們首先要識別手寫數字。
在本章中,我將介紹如何在TensorFlow中逐步構建具有單個層的神經網路。這個神經網路將識別手寫數字,它基於Tensor-Flow初學者教程中的一個不同的例子[27]。
鑑於本書的介紹風格,我選擇引導讀者,同時通過示例的某些步驟簡化了一些概念和理論上的理由。
如果讀者在閱讀本章後有興趣瞭解更多關於這個例子的理論概念,我建議閱讀 神經網路和深度學習 [28],可以線上閱讀,提供這個例子,但深入研究理論概念。
MNIST資料集
MNIST資料集由一組包含手寫數字的黑白影象組成,包含60,000多個用於訓練模型的示例,以及10.000個用於測試它的示例。MNIST資料集可以在MNIST資料庫中找到 [29]。
這個資料集非常適合大多數開始在例項上進行模式識別的人,而不必花時間進行資料預處理或格式化,這是處理影象時的兩個非常重要的步驟,但時間很長。
黑白影象(雙層)已經標準化為20×20畫素影象,保留了縱橫比。對於這種情況,我們注意到影象包含灰度畫素,這 是歸一化演算法中使用的抗鋸齒 [30]的結果 (將所有影象的解析度降低到最低級別之一)。之後,通過計算質心並將其移動到幀的中心,影象以28×28畫素幀為中心。影象如下所示:
此外,這個例子所需的學習型別是 監督學習 ; 影象用它們代表的數字標記。這是最常見的機器學習形式。
在這種情況下,我們首先收集數字影象的大資料集,每個數字都用其值標記。在訓練期間,模型顯示影象並以分數向量的形式產生輸出,每個類別一個分數。我們希望所需類別在所有類別中得分最高,但這在培訓之前不太可能發生。
我們計算一個目標函式來衡量輸出分數和所需分數模式之間的誤差(正如我們在前面章節中所做的那樣)。然後,模型修改其內部可調引數,稱為權重,以減少此錯誤。在典型的深度學習系統中,可能存在數億個這樣的可調節重量,以及用於訓練機器的數億個標記示例。我們將考慮一個較小的例子,以幫助理解這種模型的工作原理。
要輕鬆下載資料,您可以使用從Google的網站[32]獲取的指令碼 input_data.py [31], 但上傳到本書的 github 以獲取您的共性。只需將程式碼input_data.py下載到 使用TensorFlow程式設計神經網路的同一工作目錄中。從您的應用程式中,您只需要以下列方式匯入和使用:
<span style="color:#747474"><span style="color:#000088">import </span><span style="color:#000000">input_data
mnist </span><span style="color:#666600">= </span><span style="color:#000000">input_data </span><span style="color:#666600">。</span><span style="color:#000000">read_data_sets </span><span style="color:#666600">(</span><span style="color:#008800">“MNIST_data /” </span><span style="color:#666600">,</span><span style="color:#000000">one_hot </span><span style="color:#666600">= </span><span style="color:#000088">True </span><span style="color:#666600">)</span></span>
執行這兩個指令後,你將有充分的訓練資料集 mnist.train 和測試資料集 mnist.test。正如我之前所說,每個元素由一個標記為“ xs ” 的影象和相應的標籤“ ys ”組成,以便更容易表達處理程式碼。請記住,所有資料集,培訓和測試都包含“ xs ”和“ ys ”; 此外,訓練影象在mnist.train.images中引用, 訓練標籤在mnist.train.labels中 引用。
如前所述,影象由28×28畫素形成,並且可以表示為數字matix。例如,1號影象之一可以表示為:
其中每個位置指示0和1之間的每個畫素的缺乏程度。該矩陣可以表示為28×28 = 784個數字的陣列。實際上,影象已經在784維度的向量空間中的一堆點中被變換。只是提到當我們將結構減少到2維時,我們可能會丟失部分資訊,對於某些計算機視覺演算法,這可能會影響他們的結果,但對於本教程中使用的最簡單的方法,這不會是一個問題。
總而言之,我們 在2D中有一個 張量 mnist.train.images,其中呼叫函式 get_shape() 表示其形狀:
TensorShape([Dimension(60000),Dimension(784)])
第一維度索引每個影象中的每個影象和第二個每個畫素。張量的每個元素是0到1之間的每個畫素的強度。
此外,我們有0到9之間數字形式的標籤,表示每個影象代表哪個數字。在這個例子中,我們將標籤表示為10個位置的向量,其中所表示數字的對應位置包含1而其餘為0.因此 mnist.train.labels es是 張量 形狀為 TensorShape([Dimension(60000)) ,Dimension10)])。
人造中子
雖然本書並未關注神經網路的理論概念,但簡要而直觀地介紹了神經元如何學習訓練資料將有助於讀者瞭解正在發生的事情。那些已經瞭解該理論並且只是尋求如何使用TensorFlow的讀者可以跳過本節。
讓我們看一個神經元如何學習的簡單但說明性的例子。假設一組標記為“方形”和“圓形”的點。給定一個新的“X”點,我們想知道哪個標籤對應於它:
通常的近似可能是繪製一條劃分兩組的直線並將其用作分類器:
在這種情況下,輸入資料由形狀為(x,y)的向量表示,表示此二維空間中的座標,並且我們的函式返回“0”或“1”(線上方或下方)以瞭解如何將其歸類為“方形”或“圓形”。在數學上,正如我們線上性迴歸章節中所學到的,“線”(分類器)可以表示為 y = W * x + b。
推廣時,神經元必須學習權重 W (與輸入資料X具有相同的維度)和偏移 b ( 在神經網路中稱為 偏差)以學習如何對這些值進行分類。利用它們,神經元將使用權重W計算X中輸入的加權和,並新增偏移量 b ; 最後神經元將應用“啟用”非線性函式來產生“0”或“1”的結果。
神經元的功能可以更正式地表達為:
在為我們的神經元定義了這個函式後,我們想知道神經元如何 從我們的例子中帶有“正方形”和“圓形”的標記資料中學習那些引數 W 和 b,以便稍後標記新的點“X”。
第一種方法可以類似於我們對線性迴歸所做的,即用已知的標記資料餵養神經元,並將獲得的結果與真實的結果進行比較。然後,在迭代時, 調整W 和 b中的權重 以使誤差最小化,如第2章中針對線性迴歸線所示。
一旦我們得到 W 和 b 引數,我們就可以計算加權和,現在我們需要函式將儲存在z中的結果 轉換為'0'或'1'。有幾個啟用函式可用,對於這個例子,我們可以使用一個名為sigmoid [33]的流行函式 ,返回0到1之間的實數值
:
看看公式,我們看到它將傾向於返回接近0或1的值。如果輸入 z 足夠大且為正,則“e”供電於負z為零,然後 y 為1.如果輸入 z 足夠大否定,“e”驅動到一個大的正數也變成一個大的正數,因此分母變大,最終的 y 變為0.如果我們繪製函式,它將如下所示:
從這裡我們已經介紹瞭如何定義神經元,但神經網路實際上是以不同方式連線在它們之間並使用不同啟用函式的神經元組合。鑑於本書的範圍,我不會進入神經網路宇宙的所有擴充套件,但我向你保證它真的令人興奮。
只是提到神經網路的一個特定情況(其中第5章基於),神經元以層的形式組織,其中下層(輸入層)接收輸入,頂層(輸出) layer)生成響應值。神經網路可以有幾個中間層,稱為隱藏層。一種表示這種情況的直觀方式是:
在這些網路中,層的神經元與前一層的神經元通訊以接收資訊,然後將其結果傳遞給下一層的神經元。
如前所述,除了Sigmoid之外還有更多的啟用函式,每個啟用函式 具有不同的屬性。例如,當我們想要在輸出層將資料分類為兩個以上的類時,我們可以使用 Softmax [34] 啟用函式,即sigmoid 函式的推廣 。 Softmax 允許獲得每個類的概率,因此它們的和為1,最可能的結果是具有更高概率的結果。
一個簡單的例子:Softmax
請記住,要解決的問題是,給定輸入影象,我們得到它屬於某個數字的概率。例如,我們的模型可以預測80%確定性的影象中的“9”,但是有5%的機會成為“8”(由於可疑的較低的跡線),並且還給出一定的低概率任何其他號碼。識別手寫數字存在一些不確定性,我們無法以100%的置信度識別數字。在這種情況下,概率分佈使我們更好地瞭解我們對預測的信心程度。
因此,我們有一個輸出向量,其中包含不同輸出標籤的概率分佈,這是多餘的。這是一個具有10個概率值的向量,每個概率值對應於0到9的每個數字,並且所有概率總和為1。
如前所述,我們通過使用具有softmax 啟用功能的輸出層來實現這一點 。具有softmax 函式的神經元 的輸出取決於其層的其他神經元的輸出,因為它們的所有輸出必須總和為1。
該 SOFTMAX 函式有兩個主要步驟:首先,“證據”為屬於特定標籤的影象被計算,以及後來的證據被轉換成概率為每個可能的標籤。
歸屬證據
測量某個影象屬於特定類別/標籤的證據,通常的近似是計算畫素強度的加權和。當具有高強度的畫素恰好不在給定類中時,該權重為負,如果該畫素在該類中頻繁,則該權重為正。
讓我們看一個圖形示例:假設一個數學“0”的學習模型(我們將看到以後如何學習)。此時,我們將模型定義為“某事物”,其中包含了解數字是否屬於特定類的資訊。在這種情況下,我們選擇瞭如下所示的模型,其中紅色(或b / n版本的亮灰色)代表負面示例(這是,減少對“0”中存在的那些畫素的支援),而藍色(b / n版的深灰色)代表了積極的例子。看它:
想象一下28×28畫素的白紙,並畫上“0”。通常我們的零點將被繪製在藍色區域中(請記住,我們在20×20繪圖區域周圍留下了一些空間,稍後將其居中)。
很明顯,在我們的繪圖穿過紅色區域的情況下,很可能我們沒有繪製零。因此,使用基於獎勵那些畫素的度量標準,踩到藍色區域並懲罰那些踩紅色區域似乎是合理的。
現在想到一個“3”:很明顯,我們的模型“0”的紅色區域將懲罰它為“0”的概率。但是如果參考模型是下面的那個,通常形成“3”的畫素將跟隨藍色區域; “0”的繪製也會進入紅色區域。
我希望看到這兩個例子的讀者理解解釋的近似如何允許我們估計哪個數字代表那些圖紙。
下圖顯示了從MNIST資料集中學習的十個不同標籤/類的示例(從Tensorflow [35]的示例中提取)。請記住,紅色(亮灰色)表示負重量,藍色(深灰色)表示正值。
在一個更正式的方式,我們可以說,一類證據 我 給出輸入 X ,表示為:
其中 i 表示類(在我們的情況下,在0和9之間), j 是一個索引,用於對輸入影象的索引求和。最後, Wi 表示上述權重。
請記住,一般來說,模型還包括一個表示偏差的額外引數,增加了一些基本不確定性。在我們的情況下,公式將如下結束:
對於每個 i (在0和9之間),我們具有 784個元素(28×28)的矩陣W i,其中每個元素 j 乘以 輸入影象的對應分量 j,具有784個分量,然後新增 b i。矩陣演算和索引的圖形檢視是這樣的:
歸屬概率
我們評論說,第二步是計算概率。具體來說,我們使用 softmax 函式將證據總和轉換為預測概率,表示為 y:
請記住,輸出向量必須是sum等於1的概率函式。為了標準化每個元件,softmax函式使用每個輸入的指數值,然後按如下方式對它們進行標準化:
使用指數時獲得的效果是權重的乘法效應。此外,當一個類的證據很小時,這個類支援減少了之前權重的一小部分。此外, softmax 對權重進行歸一化,使它們相加1,從而產生概率分佈。
這種函式的一個有趣的事實是,一個好的預測將有一個輸出值接近1,而所有其他輸出將接近零; 在一個 弱 預測中,一些標籤可能會顯示出類似的支援。