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