這篇文章的標題比較奇怪,網上可能很少類似專門介紹神經網路的輸入輸出相關文章。在我實際工作和學習過程中,發現很有必要對神經網路的輸入和輸出做一個比較全面地介紹。跟之前部落格一樣,本篇文章不會出現相關程式碼或者公式之類的,還是希望用更直觀的圖文來說明問題,讀者不太可能透過閱讀文章來獲取程式碼或者解決方案從而直接應用到實際專案中。由於我主要做CV相關,對卷積神經網路瞭解比較多,本篇文章的神經網路指的是卷積神經網路CNN。
對於監督學習來講(本篇文章只針對監督學習),解決的主要問題就是X->Y的對映問題,也就是說對於輸入X,我們的模型需要預測它的輸出Y。我們暫且稱這裡的X為輸入,這裡的Y為輸出,X和Y都可以是高維矩陣(並不是傳統概念中的連續數值)。
不管是傳統的機器學習還是基於神經網路的深度學習,都符合上面這一規律,這就是為什麼線性代數在機器學習中非常重要的原因。輸入輸出的格式確定後,不同結構的神經網路輸入輸出個數(分支)可以不盡相同,歸納起來一共包含四種。
單輸入單輸出
這種輸入輸出組合比較常見,一般介紹神經網路有關的文章基本都舉這種結構作為例子。該結構的網路只包含一個輸入分支和一個輸出分支,比如我們比較熟悉的識別貓狗、預測房價的例子都屬於該類。我們將一張RGB圖片作為輸入傳給卷積神經網路,神經網路輸出是貓和狗的機率。我們將某個房子的屬性(面積、位置、朝向、廁所個數等)作為輸入傳給一個全連線神經網路,神經網路輸出該房子的價格。我們可以看到這種單輸入單輸出的神經網路解決的問題比較單一,一個輸出分支即可表示預測結果,同時神經網路預測所需要的依據(輸入)也比較單一,一個輸入分支即可接收全部輸入。
如上圖所示,上半部分是經典的貓狗識別問題(分類問題),包含一個輸入分支,接收一張RGB三通道圖片,包含一個輸出分支,輸出貓狗機率。下半部分是經典的房價預測問題(迴歸問題),包含一個輸入分支,接收房子的屬性特徵,包含一個輸出分支,輸出房子的預測房價。
如果再深入一點,假設貓狗設別神經網路的輸入圖片尺寸為224*224,輸出採用Softmax啟用函式,包含兩個節點,每個節點分別表示貓狗機率,加起來和為1(我們也可以使用Sigmoid啟用函式來處理二分類問題,那麼只有一個節點)。假設房價預測神經網路的輸入包含面積(數值)、朝向(東南西北離散值)、樓層(數值)、位置(限定在武漢市6個區,離散值)以及房間數量(限定在1至4之間,離散值),輸出採用Liner啟用函式,包含一個節點,該節點表示房子的房價。那麼我們再來看一下每個輸入輸出分支的資料格式:
如上圖所示,我們可以看到,雖然輸入輸出可能包含多個數值,但是這些數值仍然可以組合成一個高維矩陣(向量屬於矩陣的一種),被一個輸入或輸出分支處理,再次證明,線性代數在機器學習中的重要性。尤其在深度學習中,所有的資料都是以矩陣為單位進行傳遞的,深度學習框架TensorFlow的命名就比較形象:張量流動(張量即矩陣),描述資料在神經網路中的傳遞過程。
單輸入多輸出
很多時候,我們解決的是一個複雜的問題。比如上面舉的貓狗識別的例子中,僅僅識別圖中是什麼動物,假如現在我們不僅要識別圖中是貓還是狗,我們還需要識別貓和狗的毛色,原來的那種網路結構可能不太合適了,因為它只有一個輸出分支,該分支只能輸出它是貓還是狗。這種情況該如何設計神經網路呢?答案很簡單,就是再給神經網路加一個輸出分支,該分支用來預測貓狗的毛色:
如上圖,我們新增了一個輸出分支,該分支預測動物的毛色。現在對於任意一個輸入圖片,我們不僅能夠識別圖中是貓還是狗,我們還能識別它的毛色,神經網路功能強大了許多。我們再深入一點,假設動物毛色限定在黑、白、灰三種之間,那麼該網路的輸入輸出分支的資料格式為:
如上圖,現在有兩個輸出分支,第一個分支為二分類,輸出一個2維向量,它代表預測的動物種類,第二個分支為三分類,輸出一個3維向量,它代表動物的毛色。神經網路的輸出分支變了,那麼訓練它需要的資料格式也會改變,之前只需要指定資料的動物分類,現在還需要指定動物的毛色,所以對於任意訓練資料trainX,我們需要為它指定標籤TrainY1和TrainY2,分別表示TrainX對應的動物分類和毛色分類。
我們可以看到新增的一個輸出分支仍然是在做分類任務,我們是否可以將分類和迴歸合併到一起呢?當然是可以的。我們再增加一個輸出分支,來預測動物的年齡:
如上圖,我們再次新增了一個輸出分支,該分支做迴歸任務,預測動物的年齡,它的輸出是一個1維向量,代表動物的年齡。同樣網路輸出分支變了,訓練它的資料格式也需要跟著改變,對於每個訓練資料TrainX,我們需要指定對應的TrainY1、TrainY2以及TrainY3,分別代表動物的分類、毛色以及對應的實際年齡。
注意這裡僅僅是為了說明一個神經網路可以包含多個輸出分支,所以並沒有考慮應用場景的合理性,畢竟透過一張圖片來判斷圖片上貓的年齡確實有點難,貓臉不像人臉,特徵不夠,恐怕很難告訴你它有幾歲了。
多輸入單輸出
前面討論的都是單輸入模式,一個輸入分支就可以接收神經網路所需的全部資料。在有些場合一個分支可能處理不了多個不同資料格式的輸入,比如神經網路同時包含圖片、數值、離散值等作為輸入。這裡還是舉貓為例:透過提供的貓的圖片以及貓的年齡以及性別,來預測這隻貓的售價。那麼這時候神經網路就需要有兩個輸入分支了,分別接收貓圖片和貓齡以及性別:
如上圖所示,神經網路包含兩個輸入分支,第一個分支接收RGB圖片作為輸入,第二個分支接收貓齡和性別(數值和離散值)作為輸入,最後神經網路輸出該只貓的售價。注意這裡:由於CNN一般用來處理圖片等複雜資料格式,因此圖中的兩個輸入分支分別使用了不同的處理方式,但是最後透過merge等操作將兩個Branch的中間特徵值合併起來再進一步進行處理,最後得出預測值。這裡最後的輸出結果受前面兩個分支的共同影響。
我們這次假設輸入貓影像的大小為416*416,仍然是RGB彩圖,那麼這次的每個分支資料格式為:
如上圖,兩個輸入分支分別有自己的資料格式要求。第一個分支接收一個416*416*3的矩陣,第二個分支接收一個3維向量,最後輸出貓的預測售價。神經網路輸入分支改變之後,對應訓練的資料格式也需要調整,根據前面的內容可知,這次訓練的輸入包含TrainX1和TrainX2,分別代表貓圖片和貓齡及性別,輸出為TrainY,即該只貓的實際售價。雖然神經網路中包含兩個Branch,但是經過訓練後,誤差反向傳播,兩個Branch中的權重均可以得到調整最佳化。
多輸入多輸出
這個就不多說了,將前面介紹的組合起來就是多輸入多輸出。唯一需要注意的就是,輸入輸出分支結構改變後,對應訓練的資料格式也需要做出改變,比如TrainX1、TrainX2 對應 TrainY1和TrainY2。
常見深度學習框架比如tensorflow、caffe、keras等等都可以很方便的實現以上四種神經網路深入輸出結構。 家裡蹲2個月,下週終於復工了。如果你對本篇文章有什麼問題,歡迎留言。