卷積神經網絡(CNN)介紹與實踐

2021-02-24 機器學習研究組訂閱

作為人類,我們不斷地通過眼睛來觀察和分析周圍的世界,我們不需要刻意的「努力」思考,就可以對所看到的一切做出預測,並對它們採取行動。當我們看到某些東西時,我們會根據我們過去學到的東西來標記每個對象。為了說明這些情況,請看下面這張圖片:

資料來源:https://medium.freecodecamp.org/an-intuitive-guide-to-convolutional-neural-networks-260c2de0a050

你可能會想到「這是一個快樂的小男孩站在椅子上」。或者也許你認為他看起來像是在尖叫,即將在他面前攻擊這塊蛋糕。

這就是我們整天下意識地做的事情。我們看到事物,然後標記,進行預測和識別行為。但是我們怎麼做到這些的呢?我們怎麼能解釋我們看到的一切?

大自然花費了5億多年的時間來創建一個系統來實現這一目標。眼睛和大腦之間的合作,稱為主要視覺通路,是我們理解周圍世界的原因。

視覺通路。- 來源:https://commons.wikimedia.org/wiki/File : Human_visual_pathway.svg

雖然視力從眼睛開始,但我們所看到的實際解釋發生在大腦的初級視覺皮層中。

當您看到一個物體時,您眼中的光感受器會通過視神經將信號發送到正在處理輸入的主視覺皮層。在初級視覺皮層,使眼睛看到的東西的感覺。

所有這一切對我們來說都很自然。我們幾乎沒有想到我們能夠識別我們生活中看到的所有物體和人物的特殊性。神經元和大腦連接的深層複雜層次結構在記憶和標記物體的過程中起著重要作用。

想想我們如何學習例如傘是什麼。或鴨子,燈,蠟燭或書。一開始,我們的父母或家人告訴我們直接環境中物體的名稱。我們通過給我們的例子了解到。慢慢地,但我們開始在我們的環境中越來越多地認識到某些事情。它們變得如此普遍,以至於下次我們看到它們時,我們會立即知道這個物體的名稱是什麼。他們成為我們世界的模型一部分。

與孩子學會識別物體的方式類似,我們需要在能夠概括輸入並對之前從未見過的圖像進行預測之前,展示數百萬張圖片的算法。

計算機以與我們不同的方式「看到」東西的。他們的世界只包括數字。每個圖像都可以表示為二維數字數組,稱為像素。

但是它們以不同的方式感知圖像,這一事實並不意味著我們無法訓練他們的識別模式,就像我們一樣如何識別圖像。我們只需要以不同的方式思考圖像是什麼。

計算機如何看到圖像。- 來源:http://cs231n.github.io/classification/


為了「教會」一種算法如何識別圖像中的對象,我們使用特定類型的人工神經網絡:卷積神經網絡(CNN)。他們的名字源於網絡中最重要的一個操作:卷積。

卷積神經網絡受到大腦的啟發。DH Hubel和TN Wiesel在20世紀50年代和60年代對哺乳動物大腦的研究提出了哺乳動物如何在視覺上感知世界的新模型。他們表明貓和猴的視覺皮層包括在其直接環境中專門響應神經元的神經元。

在他們的論文中,他們描述了大腦中兩種基本類型的視覺神經元細胞,每種細胞以不同的方式起作用:簡單細胞(S細胞)和複合細胞(C細胞)。

例如,當簡單單元格將基本形狀識別為固定區域和特定角度的線條時,它們就會激活。複雜細胞具有較大的感受野,其輸出對野外的特定位置不敏感。

複雜細胞繼續對某種刺激做出反應,即使它在視網膜上的絕對位置發生變化。在這種情況下,複雜指的是更靈活。

在視覺中,單個感覺神經元的感受區域是視網膜的特定區域,其中某些東西將影響該神經元的發射(即,將激活神經元)。每個感覺神經元細胞都有相似的感受野,它們的田地覆蓋著。

神經元的感受野。- 來源:http://neuroclusterbrain.com/neuron_model.html

此外,層級【hierarchy 】的概念在大腦中起著重要作用。信息按順序存儲在模式序列中。的新皮層,它是大腦的最外層,以分層方式存儲信息。它存儲在皮質柱中,或者在新皮層中均勻組織的神經元分組。

1980年,一位名為Fukushima的研究員提出了一種分層神經網絡模型。他稱之為新認知。該模型的靈感來自簡單和複雜細胞的概念。neocognitron能夠通過了解物體的形狀來識別模式。

後來,1998年,卷心神經網絡被Bengio,Le Cun,Bottou和Haffner引入。他們的第一個卷積神經網絡稱為LeNet-5,能夠對手寫數字中的數字進行分類。

LeNet-5網絡 示意圖1

LeNet-5網絡 示意圖2

卷積神經網絡(Convolutional Neural Network)簡稱CNN,CNN是所有深度學習課程、書籍必教的模型,CNN在影像識別方面的為例特別強大,許多影像識別的模型也都是以CNN的架構為基礎去做延伸。另外值得一提的是CNN模型也是少數參考人的大腦視覺組織來建立的深度學習模型,學會CNN之後,對於學習其他深度學習的模型也很有幫助,本文主要講述了CNN的原理以及使用CNN來達成99%正確度的手寫字體識別。


CNN的概念圖如下:

CNN概念圖1

CNN概念圖2

CNN概念圖3

從上面三張圖片我們可以看出,CNN架構簡單來說就是:圖片經過各兩次的Convolution, Pooling, Fully Connected就是CNN的架構了,因此只要搞懂Convolution, Pooling, Fully Connected三個部分的內容就可以完全掌握了CNN!

2.1. convolution layer 卷積層

卷積運算就是將原始圖片的與特定的Feature Detector(filter)做卷積運算(符號⊗),卷積運算就是將下圖兩個3x3的矩陣作相乘後再相加,以下圖為例0 *0 + 0*0 + 0*1+ 0*1 + 1 *0 + 0*0 + 0*0 + 0*1 + 0*1 =0

卷積運算 1

每次移動一步,我們可以一次做完整張表的計算,如下:

卷積運算 2

下面的動圖更好地解釋了計算過程:

左:過濾器在輸入上滑動。右:結果匯總並添加到要素圖中。

中間的Feature Detector(Filter)會隨機產生好幾種(ex:16種),Feature Detector的目的就是幫助我們萃取出圖片當中的一些特徵(ex:形狀),就像人的大腦在判斷這個圖片是什麼東西也是根據形狀來推測

16種不同的Feature Detector

利用Feature Detector萃取出物體的邊界

利用Feature Detector萃取出物體的邊界

使用Relu函數去掉負值,更能淬鍊出物體的形狀

Relu函數去掉負值

淬鍊出物體的形狀1

淬鍊出物體的形狀2

我們在輸入上進行了多次卷積,其中每個操作使用不同的過濾器。這導致不同的特徵映射。最後,我們將所有這些特徵圖放在一起,作為卷積層的最終輸出。

就像任何其他神經網絡一樣,我們使用激活函數使輸出非線性。在卷積神經網絡的情況下,卷積的輸出將通過激活函數。這可能是ReLU激活功能

其他函數

這裡還有一個概念就是步長,Stride是每次卷積濾波器移動的步長。步幅大小通常為1,意味著濾鏡逐個像素地滑動。通過增加步幅大小,您的濾波器在輸入上滑動的間隔更大,因此單元之間的重疊更少。

下面的動畫顯示步幅大小為1。

步幅為1

由於feature map的大小始終小於輸入,我們必須做一些事情來防止我們的要素圖縮小。這是我們使用填充的地方。

添加一層零值像素以使用零環繞輸入,這樣我們的要素圖就不會縮小。除了在執行卷積後保持空間大小不變,填充還可以提高性能並確保內核和步幅大小適合輸入。

可視化卷積層的一種好方法如下所示,最後我們以一張動圖解釋下卷積層到底做了什麼

卷積如何與K = 2濾波器一起工作,每個濾波器具有空間範圍F = 3,步幅S = 2和輸入填充P = 1. - 來源:http://cs231n.github.io/convolutional-networks/

在卷積層之後,通常在CNN層之間添加池化層。池化的功能是不斷降低維數,以減少網絡中的參數和計算次數。這縮短了訓練時間並控制過度擬合。

最常見的池類型是max pooling,它在每個窗口中佔用最大值。需要事先指定這些窗口大小。這會降低特徵圖的大小,同時保留重要信息。

Max Pooling主要的好處是當圖片整個平移幾個Pixel的話對判斷上完全不會造成影響,以及有很好的抗雜訊功能。

池化層 示意圖 1

池化層 示意圖 2

2.3.Fully Connected Layer 全連接層

基本上全連接層的部分就是將之前的結果平坦化之後接到最基本的神經網絡了



下面這部分主要是關於如何使用tensorflow實現CNN以及手寫字體識別的應用:

1# CNN 代碼
2def convolutional(x,keep_prob):
3def conv2d(x,W):
4return tf.nn.conv2d(x,W,[1,1,1,1],padding='SAME')
5def max_pool_2x2(x):
6return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
7
8def weight_variable(shape):
9initial=tf.truncated_normal(shape,stddev=0.1)
10return tf.Variable(initial)
11
12def bias_variable(shape):
13initial=tf.constant(0.1,shape=shape)
14return tf.Variable(initial)
15
16x_image=tf.reshape(x,[-1,28,28,1])
17W_conv1=weight_variable([5,5,1,32])
18b_conv1=bias_variable([32])
19h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)
20h_pool1=max_pool_2x2(h_conv1)
21
22W_conv2 = weight_variable([5, 5, 32, 64])
23b_conv2 = bias_variable([64])
24h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
25h_pool2 = max_pool_2x2(h_conv2)
26
27# full_connetion
28W_fc1=weight_variable([7*7*64,1024])
29b_fc1=bias_variable([1024])
30h_pool2_flat=tf.reshape(h_pool2,[-1,7*7*64])
31h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)
32
33# dropout 隨機扔掉一些值,防止過擬合
34h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)
35
36W_fc2=weight_variable([1024,10])
37b_fc2=bias_variable([10])
38y=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)
39
40return y,[W_conv1,b_conv1,W_conv2,b_conv2,W_fc1,b_fc1,W_fc2,b_fc2]

大家稍微對tensorflow的代碼有些基礎,理解上面這部分基本上沒有難度,並且基本也是按照我們前面概念圖中的邏輯順序實現的。

最終按照慕課網上的學習資料TensorFlow與Flask結合打造手寫體數字識別,實現了一遍CNN,比較曲折的地方是前端,以及如何將訓練的模型與flask整合,最後項目效果如下:

來源 https://github.com/yanqiangmiffy/TensorFlow-MNIST-WEBAPP


歡迎大家到GitHub fork和star,項目傳送門--->TensorFlow-MNIST-WEBAPP

最後說自己的兩點感觸吧:

1、CNN在各種場景已經應用很成熟,網上資料特別多,原先自己也是略知一二,但是從來沒有總結整理過,還是整理完之後心裡比較踏實一些。

2、切記理論加實踐,實現一遍更踏實。


1、[資料分析&機器學習] 第5.1講: 卷積神經網絡介紹(Convolutional Neural Network)

2、An Intuitive Explanation of Convolutional Neural Networks – the data science blog

3、Convolutional Neural Network (CNN) | Skymind

4、Convolutional Neural Networks (LeNet) — DeepLearning 0.1 documentation

5、CS231n Convolutional Neural Networks for Visual Recognition

6、卷積神經網絡(CNN)學習筆記1:基礎入門 | Jey Zhang

7、Deep Learning(深度學習)學習筆記整理系列之(七) - CSDN博客

原文連結:https://www.jianshu.com/p/70b6f5653ac6

想要了解更多資訊,請掃描下方二維碼,關注機器學習研究會

                                          

轉自:人工智慧LeadAI

相關焦點

  • 卷積神經網絡(CNN)新手指南
    然而最經典的,或者說最流行的神經網絡使用範例是將其用於圖像處理領域。提到圖像處理,本文主要介紹的是如何使用卷積神經網絡來進行圖像分類。系統中的特定成員可以完成特定任務這種理念(神經細胞在視覺皮層中尋找特定的特徵)也能很好地應用在機器學習上,這也是卷積神經網絡的基礎。架構對於捲曲神經網絡更詳細的介紹是將圖片通過一系列的卷積、非線性、池(採樣)、全連接層,然後得到一個輸出。正如我們前面所說的,輸出是一個類或者一個圖像類別的可能性概率。現在,困難的部分是了解每一層的任務。
  • 卷積神經網絡中的參數共享/權重複制
    但是了解這個簡單的概念有助於更廣泛地理解卷積神經網絡的內部。卷積神經網絡(cnn)能夠使那些通過網絡饋送的圖像在進行仿射變換時具有不變性。 這個特點提供了識別偏移圖案、識別傾斜或輕微扭曲的圖像的能力。仿射不變性的這些特徵是由於CNN架構的三個主要屬性而引入的。
  • 9大主題卷積神經網絡(CNN)的PyTorch實現
    上文聚焦於源碼和論文,對於各種卷積神經網絡模型的實現,本文將介紹它們的 PyTorch 實現,非常有用!這份資源已經開源在了 GitHub 上,連結如下:https://github.com/shanglianlm0525/PyTorch-Networks先來個總結介紹,該系列的卷積神經網絡實現包含了 9 大主題,目錄如下:1. 典型網絡2. 輕量級網絡3. 目標檢測網絡4.
  • 圖像識別技術——卷積神經網絡CNN詳解
    前言卷積神經網絡不同於神經網絡,在圖片處理這方面有更好的表現。本文主要對神經網絡和卷積神經網絡做了簡要的對比,著重介紹了卷積神經網絡的層次基礎,同時也簡要介紹了卷積神經網絡參數更新方式和其優缺點,並結合具體實例對卷積神經網絡的工作方式做了介紹。
  • 使用TensorFlow構建卷積神經網絡CNN
    卷積神經網絡(CNN)是計算機視覺應用背後的架構。本文將闡述CNN和計算機視覺的基礎,例如卷積運算,填充,跨步卷積和池化層。然後,我們將使用TensorFlow構建用於圖像識別的CNN。理解卷積該卷積運算是卷積神經網絡的積木。現在,在計算機視覺領域,圖像可以表示為RGB值的矩陣。這個概念實際上是在之前的文章中介紹。要完成卷積操作,我們需要一個圖像和一個過濾器。
  • YJango的卷積神經網絡——介紹
    PS:YJango是我的網名,意思是我寫的教程,並不是一種網絡結構。。關於卷積神經網絡的講解,網上有很多精彩文章,且恐怕難以找到比斯坦福的CS231n還要全面的教程。 所以這裡對卷積神經網絡的講解主要是以不同的思考側重展開,通過對卷積神經網絡的分析,進一步理解神經網絡變體中「因素共享」這一概念。注意:該文會跟其他的現有文章有很大的不同。
  • 在多目標識別方面,maskr-cnn已經取得了一些進展
    maskr-cnn是業界首款實用的全卷積神經網絡模型,為計算機視覺中的多目標識別與自動對焦,開創性的成為計算機視覺發展的新方向。無論是基於計算機視覺的自動對焦系統、模式識別系統,還是圖像識別,maskr-cnn都是有標誌性意義的。它強調平滑準確的計算輸入、檢測框和定位點,訓練過程與特徵提取過程採用多級感受野融合技術進行自動優化提高目標解析度及精度,以及做出精度更高的語義推理判斷。
  • CNN卷積神經網絡(超詳解析)
    1、神經網絡首先了解神經網絡,大家移步這倆篇博客,一篇為純理論,一篇為實戰加理論。機器學習之神經網絡學習及其模型入門講解:使用numpy實現簡單的神經網絡(BP算法)2、卷積神經網絡之層級結構cs231n課程裡給出了卷積神經網絡各個層級結構,如下圖上圖中CNN要做的事情是:給定一張圖片,是車還是馬未知,是什麼車也未知,現在需要模型判斷這張圖片裡具體是一個什麼東西,總之輸出一個結果:如果是車那是什麼車所以最左邊是數據輸入層
  • 三種卷積神經網絡模型:Light-CNN,雙分支CNN和預先訓練的CNN
    打開APP 三種卷積神經網絡模型:Light-CNN,雙分支CNN和預先訓練的CNN 發表於 2020-04-17 10:55:01
  • 基於卷積神經網絡的目標檢測算法簡介
    什麼是卷積神經網絡?卷積神經網絡是一個層次模型,主要包括輸入層,卷積層,池化層、全連接層以及輸出層。卷積神經網絡是專門針對圖像而設計,主要特點在於卷積層的特徵是由前一層的局部特徵通過卷積共享的權重得到。
  • 卷積神經網絡 物體檢測 Faster-RCNN
    >回顧一下fast rcnn的過程,先通過selective search在每張圖片選2k個region proposal,將原圖通過cnn得到feature map,然後通過SPP或RoI pooling將不同region proposal的feature map轉化為固定的長度給全連接層,通過分類和位置組合Loss學習;在fast rcnn裡除了region
  • 卷積神經網絡理解(一):濾波器的意義
    卷積神經網絡的發展二. 卷積神經網絡的重要性三. 卷積神經網絡與圖像識別四.濾波器一.卷積神經網絡的發展卷積神經網絡受到視覺細胞研究的啟發,1962年,Hubel和Wiesel發現初級視覺皮層中的神經元會響應視覺環境中特定的簡單特徵(比如有向的邊等)。
  • 理解神經網絡:從神經元到RNN、CNN、深度學習
    隨著時間的推移,證明了神經網絡在精度和速度方面,比其他的算法性能更好。並且形成了很多種類,像CNN(卷積神經網絡),RNN,自編碼,深度學習等等。神經網絡對於數據科學和或者機器學習從業者,就像線性回歸對於統計學家一樣。因此,對神經網絡是什麼有一個基本的理解是有必要的,比如,它是怎麼構成的,它能處理問題的範圍以及它的局限性是什麼。
  • 「範例卷積神經網絡」和信息最大化
    這一方法也能被理解為「卷積神經網絡範例」。本文內容摘要:本文對「範例卷積神經網絡」的訓練方法僅作了簡單簡單的概述,所以如果想要獲得更多、更真實的信息,請閱讀論文原文。本文簡要介紹了「變分信息最大化」,並將其運用到了「範例卷積神經網絡」的案例中。
  • 深度學習入門:淺析卷積神經網絡
    至今已有數種深度學習方法,如卷積神經網絡(CNN)、自編碼神經網絡(包括Auto encoder和Sparse Coding)和深度置信網絡(DBN),並在各個領域中取得了極好的效果。圖像分類是從固定的一組分類中分配輸入圖像一個標籤的任務,在本案例中,我們將以Fashion-MNIST圖像數據集為例,了解並使用不同的神經網絡模型來對其進行分類,並比較不同網絡的預測效果。本案例的學習分為三個部分,首先是目標問題的數據集介紹,了解數據背景是解決問題的重要前提;接著,我們會介紹基本的邏輯回歸模型,在此基礎上引入本案例的核心——卷積神經網絡。
  • 改進卷積神經網絡,你需要這14種設計模式
    然而,訓練神經網絡的技巧並不容易掌握。與之前的機器學習方法一樣,細節是最恐怖的地方,然而在卷積神經網絡中有更多的細節需要去管理:你所用的數據和硬體的限制是什麼?你應該以哪種網絡作為開始呢?AlexNet、VGG、GoogLeNet 還是 ResNet 呢?甚至 ResNet 裡面還有 ResNet 分支選項。你應當建立多少與卷積層相對應的密集層?
  • 大話卷積神經網絡CNN,小白也能看懂的深度學習算法教程,全程乾貨...
    如下圖所示:人工神經網絡可以映射任意複雜的非線性關係,具有很強的魯棒性、記憶能力、自學習等能力,在分類、預測、模式識別等方面有著廣泛的應用。四、卷積神經網絡4.1、CNN定義主角登場,其他人退讓!!!如下圖所示:重點來了,什麼是卷積神經網絡?
  • 梯度上升可視化卷積神經網絡
    為什麼我的CNN網絡模型訓練出來的東西總是過度擬合?已經改了很多次參數都不行,到底是樣本有問題還是網絡模型定義有問題?問題在哪來?CNN網絡模型中的每一層學習的是些什麼特徵?為什麼有的人說第一層卷積核提取的是邊緣信息特徵,有的人卻說第一層卷積核提取的是顏色特徵?到底是兩者都有還是什麼回事?CNN網絡可不可以減掉幾層然後保持相同的精度和損失率呢?
  • 卷積神經網絡在圖像領域中的發展及存在問題
    最近的幾年裡,深度學習在機器學習領域得到了飛速的發展,相關的理論成果和實踐成果也層出不窮,其主要的貢獻是在自然語言處理、圖像分類任務、聲音識別等領域上。自1974年Paul Werbos等人提出反向傳播算法(BP算法),解決了由淺層的神經網絡模型應用到深層的神經網絡模型中線性不可分的問題。
  • 揭秘卷積神經網絡熱力圖:類激活映射
    本文將介紹在卷積神經網絡(CNN)中,針對圖像的某些部位可視化從而做出判斷的不同技術。類激活映射(CAM)是一種生成熱力圖的技術,用於突出圖像的類的特定區域。熱力圖效用下面是一個典型的熱力圖:視覺化神經網絡正在查看的位置大有用處,因為它幫助我們理解神經網絡是否在查看圖像的適當部位,或者神經網絡是否在進行誤導。下列是一些神經網絡在做分類決判斷時可能進行誤導和錯誤查看位置的例子:· 卷積神經網絡將一張圖片分類為「火車」,而實際上它是在尋找「火車軌道」(這意味著它會錯誤地將一張火車軌道圖片單獨分類為「火車」)。