到目前爲止,咱們已經大體地介紹了一些新網絡算法
可是,若是你對數據已有一些瞭解,好比它是一張圖片,或者一系列事物,你能夠作得更好網絡
想法很是簡單,若是你的數據是某種結構,則你的網絡沒有必要從零開始學習結構,它會表現得更好框架
例如,假設你想嘗試分類這些字母,你知道顏色並非讓A成爲A的重要因素ide
你認爲怎麼樣會使得你的分類器更容易學習?學習
一個使用彩色照片的模型仍是隻使用灰度的模型spa
直觀地說,若是一個字母表現爲你從未見過的顏色,當你嘗試分類字母時,忽略顏色的特性將使得模型變得更加容易設計
這是另外一個例子,你有一張照片,你想要你的網絡表示出照片中有一隻貓3d
貓在圖片的哪裏並不重要,它仍然是一張有貓的照片blog
若是要你的網絡必須分別學習出貓是在左下角,仍是在右上角,這有很是多的工做須要作圖片
若是這樣告訴你,準確地講,不論是在圖片的左邊仍是右邊,物體和圖像都同樣,這就是所謂的平移不變性
不一樣的位置,相同的貓咪
還有另一個例子,假設你有一長段話談論貓咪,貓咪的意義是否隨它在第一句話,還好第二句話而發生變化呢?
大部分狀況不變,所以,若是你嘗試一個關於文本的網絡
網絡學習到的什麼是貓咪可被重複使用。而不是每次見到貓咪這個詞就要從新學習它
實現這種網絡的方法叫作weight sharing權重共享
當你知道兩種輸入能夠得到一樣的信息,則你應該共享權重且利用這些輸入共同訓練權重。這是一種很是重要的思想
Statistical Invariants統計不變性司空見慣,事物的平均值並不隨時間或空間發生變化
對於圖片,權重共享的思想使咱們研究卷積神經網絡convolutional networks
通常狀況下,對於文本和序列,應當使用詞嵌入和循環神經網絡
讓咱們來討論一下卷積神經網絡或者稱convnets。convnets是一種空間上共享參數的神經網絡
假設你有一張照片,它能夠被表示爲一個薄餅,它有寬度和高度,且因爲自然存在紅綠藍三色,
所以它還擁有深度,在這種狀況下,你的輸入深度爲3
如今假設拿出圖片的一小塊,運行一個具備K個輸出的小神經網絡
像這樣把輸出表示爲垂直的一小列
在不改變權重的狀況下,把那個小神經網絡滑遍整個圖片,就像咱們拿着刷子刷牆同樣水平垂直的滑動
在輸出端,咱們畫出了另外一副圖像,它跟以前的寬度和高度不一樣,更重要的是它跟以前的深度不一樣。
而不是僅僅只有紅綠藍,如今你獲得了K個顏色通道,這種操做叫作卷積
若是你的塊大小是整張圖片,那它就跟普通的神經網絡沒有任何區別
正因爲咱們使用了小塊 ,咱們有不少小塊在空間中共享較少的權重
一個卷積網絡是組成深度網絡的基礎,咱們將使用數層卷積而不是數層的矩陣相乘
總的想法是讓它造成金字塔狀,金字塔底是一個很是大而淺的圖片,僅包括紅綠藍
經過卷積操做逐漸擠壓空間的維度,同時不斷增長深度,使深度信息基本上可表示出複雜的語義
你能夠在金字塔的頂端實現一個分類器,全部空間信息都被壓縮成一個標識
只有把圖片映射到不一樣類的信息保留,這就是整體的思想
若是你想實現它,必須正確實現不少細節,還須要使用一點點的神經網絡語言(lingo)
你已經接觸到了塊(Patch)和深度(depth)的概念,塊有時也叫作核(kernel)
你堆棧的每一個薄餅都被叫作特徵圖(feature map)
Each pancake in your stack is called a feature map.
這裏你把三個特徵映射到K個特徵圖
另外一個你須要知道的術語是步副(stride),它是當你移動濾波器時平移的像素的數量
(it's the number of pixels that you're shifting each time you move your filter.)
步副爲1時獲得的尺寸基本上和輸入相同,
步副爲2意味着變爲一半的尺寸,
我說基本上,由於它取決於你在邊界上怎麼作,
要麼你從不超過邊界,它常被簡稱爲有效填充(valid padding),
要麼你超過邊界且使用0填充,這樣你會獲得同輸入相同大小的輸出,這常被簡稱爲相同填充(same padding)
假設你有一個28*28的圖片, 你在上面運行一個3×3的卷積操做,卷積操做輸入深度爲3輸出深度爲8,
你的輸出特徵圖的維度是多少?當你使用相同填充且步副爲1時,使用有效填充且步副爲1時
或使用有效填充且步副爲2時
若是你使用所謂的相同填充且步副爲1,則輸出高度和寬度同輸入相同,咱們在輸入圖像中填充零是的尺寸相同
若是你使用所謂的有效填充且步幅爲1,則不會存在填充,若是你不使用填充且要相同小的神經網絡匹配,
則須要在圖片的一邊,分別在神經網絡中移除一列和一行,所以你在輸出特徵圖中僅剩下26個特徵
此外,若是你使用的步幅爲2則僅獲得一半輸出,所以寬度和高度均爲13
全部狀況下,輸出深度都不會變
就是這樣,你能夠像這樣構建一個卷積神經網絡,你沒必要本身實現,就能夠把卷積疊加起來,
而後嘗試使用降維的方法,一層一層的增長網絡的深度,
一旦你獲得一個既深又窄的表示,把全部的信息鏈接到幾層全鏈接層,你就能夠訓練你的分類器了
你也許好奇訓練中發生了什麼,特別是當像這樣使用共享權重時,鏈式公式發生了什麼
其實啥也沒發生,公式就是能正常工做
你只是將圖片中全部位置的微分疊加了起來,
如今你看到一個簡單的卷積神經網絡,咱們能夠作不少的事情來提高它
咱們將討論其中的三種:pooling、one by one convolutions、inception
池化、1×1卷積、和更高級一點的東西,叫作inception結構
第一個改進是用更好的方法下降,卷積神經網絡中的特徵圖的空間範圍,
直到如今,咱們已經使用調整的步幅來平均濾波器,(we've used striding to shift the filters by a few pixel each time)
從而下降特徵圖的尺寸,這是對圖像下降採樣率的一種很是有效的方法,它移除了不少信息,
若是咱們不採用在兩個卷積之間使用步幅調整,而依然執行一個很是小的步幅,比方說1
可是咱們經過某種方法把相臨近的卷積結合在一塊兒,這種操做就叫作池化,有幾種方法能夠實現它
最經常使用的是最大池化,在特徵圖的每個點,查到它周圍很小範圍的點,計算附近全部點的最大值,
使用最大池化有不少優勢,
首先它沒有增長參數數量 ,所以沒必要擔憂會致使容易過擬合
其次,它經常簡單的產生了更精確的模型,
然而因爲在很是低的步幅下進行卷積,模型必然須要更多的計算量,
且你有更多的超參數須要調整,例如池化區域尺寸,池化步幅,它們沒必要徹底同樣,
一種典型的卷積神經網絡結構爲幾層的卷積和池化的交替,而後在最末端鏈接幾層全鏈接層,
第一個使用這種結構的著名模型是LENET-5,它是1998年由Yann Lecun在字母識別中設計的,
高級的卷積神經網絡,如著名的ALEXNET在2012年贏得了ImageNet物體識別挑戰賽,就使用了一種很是相似的結構
另外一種值得注意的形式是平均池化,相比於採用最大值,它使用了在窗口附近一片區域的平均值
它有點像提供了下面這個特徵圖的 一個低分辨率的視圖,不久後咱們將利用這種優勢
首先,先介紹一個想法, 便是1×1卷積。它並不關注一塊圖像,而是僅僅一個像素
讓咱們回顧一下傳統的卷積,它基本上是運行在一小塊圖片上的小分類器,但僅僅是個線性分類器
一旦你在中間加一個1×1卷積,你就用運行在一塊圖像的神經網絡分類器代替了線性分類器
在卷積操做中散佈一些1×1卷積,是一種使模型變得更深的低耗高效的方法
它會存在更多的參數但並無徹底改變神經網絡結構 ,它很是簡單,由於若是你看它的數學公式,它根本不是卷積
它們只是矩陣的相乘且僅有較少的參數。我提到了全部的方法,平均池化和1×1卷積
由於我想講一下在創造神經網絡時很是成功的應用策略
相比於金字塔式的結構,它們使得卷積網絡更加的簡潔高效
它看起來更加的複雜,這個想法是卷積神經網絡的每一層,你都要作出一個選擇,進行一個池化操做,仍是一個卷積操做
而後你須要決定是進行一個1×1、3×3仍是5×5的卷積,其實這些對構建一個高效的神經網絡都有幫助
那爲何還要選擇?讓咱們全用吧
這就是一個inception模塊的樣子,相比與僅僅使用單個卷積,你的網絡有一個1×1的池化
而後還有一個1×1的卷積還有一個1×1和3×3的卷積
最後面是一個1×1和5×5卷積
在末端,你只要鏈接全部的輸出,看起來它很複雜,可是有意思的是你能夠在模型參數很是少的狀況下選擇這些參數
所以這種模型會比以前簡單的模型好太多,
這是神經網絡最有趣的事情之一 ,由於你有一個整體的框架,在框架下你能夠自由的組裝不少的塊結構
你能夠迅速的實現你的想法, 針對你的問題能夠提出很是有趣的模型結構
下面讓咱們看一下神經網絡如何處理文本,
仔細觀察卷積背後的算法以及你選擇的填充方法,步數和其它的參數是如何影響它的,請參照這個圖解指南: