手把手帶你走進卷積神經網絡!

2021-02-13 CSDN

這是一篇關於CNN(卷積神經網絡)的簡單指南,本文將介紹CNN如何工作,以及如何在Python中從頭開始構建一個CNN。

作者 | victorzhou

譯者 | 虎說,責編 | 郭芮

出品 | CSDN(ID:CSDNnews)

以下為譯文:

在過去的幾年中,有很多關於卷積神經網絡(CNN)的討論,尤其是因為它們已經徹底改變了計算機視覺領域。在這篇文章中,我們將基於神經網絡的基本背景知識,探索CNN是什麼,理解它們是如何工作的,並使用Python中的numpy從頭開始構建一個真正的卷積神經網絡。

本文假設讀者有一定的神經網絡的基本知識。如果你想要了解一些關於神經網絡的知識,你可以讀一下我的關於對神經網絡的介紹(https://victorzhou.com/blog/intro-to-neural-networks/)。

現在,讓我們開始今天的話題。

動機

CNN的經典用例是執行圖像分類,例如查看寵物的圖像並確定它是貓還是狗。這是一項看似非常簡單的任務,你可能會有這樣的疑惑:為什麼不使用普通的神經網絡呢?不得不說這是一個好問題。

原因1:圖像很大

目前用於計算機視覺問題的圖像通常為224x224甚至更大。想像一下,構建一個神經網絡來處理224x224彩色圖像:包括圖像中的3個顏色通道(RGB),即224x224x3=150528個輸入權重!這種網絡中的典型隱藏層可能有1024個節點,因此我們必須僅為第一層訓練150528x1024=15億個權重。想像一下擁有15億個權重的神經網絡,是不是太大了?這幾乎是不可能完成訓練的。

最重要的是其實我們並不需要那麼多的權重,相反我們僅知道像素點其鄰居的點才是最有用的。因為圖像中的物體是由小的局部特徵組成的,如圓形虹膜或一張紙的方角。對於第一個隱藏層中的每個節點來說,查看每個像素似乎是很浪費的!

原因2:位置可變

如果你訓練了一個網絡來檢測狗,那麼無論圖像出現在哪張照片中,你都希望它能夠檢測到狗。想像一下,訓練一個在某個狗圖像上運行良好的網絡,然後為它提供相同圖像的略微移位版本,此時的網絡會有完全不同的反應!

那麼CNN是如何幫助我們解決這些問題的呢?不要著急我們很快就會看到CNN如何幫助我們緩解這些問題!

數據集

在這篇文章中,我們將解決計算機視覺的「Hello,World!」:MNIST手寫數字分類問題。很簡單:給定圖像,將其分類為數字。

來自MNIST數據集的樣本圖像

MNIST數據集中的每個圖像都是28x28,其中包含了一個居中的灰度數字。說實話,一個正常的神經網絡實際上可以很好地解決這個問題。你可以將每個圖像視為28x28=784維矢量,將其輸入到784-dim圖層,堆疊一些隱藏圖層,最後輸出10個節點的輸出圖層,每個數字1個。

這樣做可以完成任務,因為MNIST數據集包含的都是些居中的小圖像,因此我們不會遇到上述的大小或移位問題。但是,請記住,大多數現實世界的圖像分類問題並不容易。

那麼就讓我們進入CNN吧!

卷積

什麼是卷積神經網絡?

它們基本上是使用卷積層的神經網絡,即Conv層,它們基於卷積的數學運算。Conv圖層由一組過濾器組成,你可以將其視為2d數字矩陣。這是一個示例3x3過濾器:

一個3x3過濾器

我們可以通過將濾波器與輸入圖像進行卷積來產生輸出圖像。這包括:

注釋:實際上我們(以及許多CNN實現)在技術上使用互相關(Cross-correlation)而不是卷積,但它們幾乎完全相同。

這4步描述有點抽象,所以讓我們舉個例子吧,考慮這個微小的4x4灰度圖像和這個3x3過濾器:

4x4圖像(左)和3x3濾鏡(右)

圖像中的數字表示像素強度,其中0是黑色,255是白色。我們將對輸入圖像和過濾器進行卷積以生成2x2輸出圖像:

2x2輸出圖像

首先,讓我們將過濾器疊加在圖片的左上角:

第1步:將過濾器(右)疊加在圖像上方(左)

接下來,我們在重疊圖像值和過濾器值之間執行逐元素乘法。以下是結果,從左上角開始向右,然後向下:

第2步:執行逐元素乘法。

接下來,我們總結所有結果。這很容易:62-33=29。

最後,我們將結果放在輸出圖像的目標像素中。由於我們的過濾器覆蓋在輸入圖像的左上角,因此我們的目標像素是輸出圖像的左上角像素:

我們做同樣的步驟來生成輸出圖像的其餘部分:

3.1這有用嗎?

用過濾器卷積圖像有什麼作用?我們可以先使用我們一直使用的示例3x3濾波器,這通常被稱為垂直索貝爾濾波器:

垂直索貝爾濾波器

以下是垂直Sobel濾波器的示例:

垂直Sobel濾波器卷積的圖像

同樣,還有一個水平Sobel濾波器:

水平Sobel濾波器

水平Sobel濾波器卷積的圖像

到底發生了什麼?Sobel濾波器是邊緣檢測器。垂直Sobel濾波器檢測的是垂直邊緣,水平Sobel濾波器的是檢測水平邊緣。現在可以輕鬆解釋輸出圖像:輸出圖像中的亮像素(具有高值的像素)表示原始圖像中存在強邊緣。

你能看出為什麼邊緣檢測圖像可能比原始圖像更有用嗎?回想一下我們的MNIST手寫數字分類問題。在MNIST上訓練的CNN可以尋找數字1,例如,通過使用邊緣檢測濾波器並檢查圖像中心附近的兩個突出的垂直邊緣。通常,卷積有助於我們查找特定的本地化圖像特徵。

3.2填充(Padding)

還記得先用3x3過濾器對4x4的輸入圖像進行卷積,以產生2x2輸出圖像嗎?通常,我們希望輸出圖像的大小與輸入圖像的大小相同。為此,我們在圖像周圍添加零,以便我們可以在更多位置疊加過濾器。3x3濾鏡需要1個像素的填充:

4x4輸入與3x3濾波器卷積,使用填充以產生4x4輸出

這稱為「相同」填充,因為輸入和輸出具有相同的尺寸。不使用任何填充,這是我們一直在做的,有時也被稱為「有效」填充。

3.3 Conv圖層

既然我們知道圖像卷積是如何工作的以及為什麼用它,那讓我們看看它是如何在CNN中實際使用的。如前所述,CNN包括使用一組過濾器將輸入圖像轉換為輸出圖像的conv layer。conv層的主要參數是它具有的過濾器數量。

對於我們的MNIST CNN,我們將使用一個帶有8個過濾器的小conv layer作為我們網絡中的初始層。這意味著它會將28x28輸入圖像轉換為26x26x8輸出向量:

提醒:輸出為26x26x8而不是28x28x8,因為我們使用有效填充,這會將輸入的寬度和高度減少2。

conv layer中的4個過濾器中的每一個都會產生26x26輸出,因此堆疊在一起它們構成26x26x8的向量。

3.4執行卷積

是時候將我們學到的東西放到代碼中了!我們將實現一個conv layer的前饋部分,該部分負責處理帶有輸入圖像的過濾器,以產生輸出向量。為簡單起見,我們假設過濾器是3x3(其實5x5和7x7過濾器也很常見)。

讓我們開始實現一個conv layer類:

import numpy as np

class Conv3x3:
  

  def __init__(self, num_filters):
    self.num_filters = num_filters

    
    
    self.filters = np.random.randn(num_filters, 3, 3) / 9

該類只有一個參數:過濾器的數量。在構造函數中,我們存儲過濾器的數量並使用NumPy的randn()方法初始化隨機過濾器數組。

注意:在初始化期間初始值很重要,如果初始值太大或太小,則訓練網絡將無效。要了解更多信息,請閱讀Xavier Initialization(https://www.quora.com/What-is-an-intuitive-explanation-of-the-Xavier-Initialization-for-Deep-Neural-Networks)。

接下來,實際卷積:

class Conv3x3:
  

  def iterate_regions(self, image):
    '''
    Generates all possible 3x3 image regions using valid padding.
    - image is a 2d numpy array
    '''
    h, w = image.shape

    for i in range(h - 2):
      for j in range(w - 2):
        im_region = image[i:(i + 3), j:(j + 3)]
        yield im_region, i, j

  def forward(self, input):
    '''
    Performs a forward pass of the conv layer using the given input.
    Returns a 3d numpy array with dimensions (h, w, num_filters).
    - input is a 2d numpy array
    '''
    h, w = input.shape
    output = np.zeros((h - 2, w - 2, self.num_filters))

    for im_region, i, j in self.iterate_regions(input):
      output[i, j] = np.sum(im_region * self.filters, axis=(1, 2))

    return output

iterate_regions()是一個輔助生成器方法,為我們生成所有有效的3x3圖像區域,這對於稍後實現此類的後向部分非常有用。

上面是實際執行卷積的代碼行。讓我們分解一下:

im_region:一個包含相關圖像區域的3x3陣列。

self.filters:一個3d數組。

im_region*self.filtersself.filters:我們使用numpy的廣播(broadcasting)功能以元素方式乘以兩個數組,結果是具有相同尺寸的3d數組。

axis=(1,2)num_filters:我們使用np.sum()上一步的結果,產生一個長度為1d的數組,其中每個元素包含相應過濾器的卷積結果。

我們將結果分配給output[i,j],其中包含輸出中像素的卷積結果(i,j)。

對輸出中的每個像素執行上面的序列,直到我們獲得我們想要的結果!讓我們的代碼進行測試運行:

import mnist
from conv import Conv3x3



train_images = mnist.train_images()
train_labels = mnist.train_labels()

conv = Conv3x3(8)
output = conv.forward(train_images[0])
print(output.shape) 

注意:為簡單起見,在我們的Conv3x3實現中,我們假設輸入是一個2d numpy數組,因為這是我們的MNIST圖像的存儲方式。這對我們有用,我們將它用作網絡中的第一層,但大多數CNN都有更多的Conv層。如果我們要構建一個需要Conv3x3多次使用的更大的網絡,我們必須使輸入成為3d numpy數組。

池化(Pooling)

圖像中的相鄰像素傾向於具有相似的值,因此conv layer通常也會為輸出中的相鄰像素產生類似的值。但是conv layer中輸出的大部分信息都是冗餘的,例如,如果我們使用邊緣檢測過濾器並在某個位置找到強邊緣,那麼我們也可能會在距離原始像素1個像素偏移的位置找到相對較強的邊緣。但是,我們可能並沒有找到任何新的東西。

池化層解決了這個問題。他們所做的就是減少通過猜測在輸入中產生的匯總值。該池通常是通過簡單的操作完成max,min或average等這些操作。以下是池化大小為2的Max Pooling圖層的示例:

4x4圖像上的最大池(池大小為2)以產生2x2輸出

為了執行最大池化,我們以2x2塊(因為池大小=2)遍歷輸入圖像,並將最大值放入相應像素的輸出圖像中。

對於我們的MNIST CNN,我們將在初始conv layer之後放置一個池大小為2的Max Pooling層,這樣池化層就會將26x26x8輸入轉換為13x13x8輸出:

4.1執行池化

我們將使用MaxPool2與上一節中的conv類相同的方法實現一個類:

import numpy as np

class MaxPool2:
  

  def iterate_regions(self, image):
    '''
    Generates non-overlapping 2x2 image regions to pool over.
    - image is a 2d numpy array
    '''
    h, w, _ = image.shape
    new_h = h // 2
    new_w = w // 2

    for i in range(new_h):
      for j in range(new_w):
        im_region = image[(i * 2):(i * 2 + 2), (j * 2):(j * 2 + 2)]
        yield im_region, i, j

  def forward(self, input):
    '''
    Performs a forward pass of the maxpool layer using the given input.
    Returns a 3d numpy array with dimensions (h / 2, w / 2, num_filters).
    - input is a 3d numpy array with dimensions (h, w, num_filters)
    '''
    h, w, num_filters = input.shape
    output = np.zeros((h // 2, w // 2, num_filters))

    for im_region, i, j in self.iterate_regions(input):
      output[i, j] = np.amax(im_region, axis=(0, 1))

    return output

此類與我們之前實現的Conv3x3類工作方式類似。特別注意的是為了找到給定圖像區域的最大值,我們使用np.amax()。我們設置是axis=(0,1),因為我們只希望在前兩個維度(高度和寬度)上進行最大化,而不是第三個維度,num_filters。

我們來試試吧!

import mnist
from conv import Conv3x3
from maxpool import MaxPool2



train_images = mnist.train_images()
train_labels = mnist.train_labels()

conv = Conv3x3(8)
pool = MaxPool2()

output = conv.forward(train_images[0])
output = pool.forward(output)
print(output.shape) 

MNIST CNN馬上要完成了!

Softmax

為了完成我們的CNN,我們需要讓它能夠實際進行預測。我們將通過使用標準最終層來實現多類分類問題:Softmax層,一個使用softmax激活函數的標準全連接(密集)層。

提示:完全連接層將每個節點連接到前一層的每個輸出。我們在之前的神經網絡的介紹中使用了完全連接的圖層。

Softmax將任意實際值轉換為概率。如果你對其背後的數學有興趣,自己可以簡單了解下,因為它很簡單。

5.1用法

我們將使用一個帶有10個節點的softmax層,每個節點都代表一個數字,softmax層是我們CNN的最後一層。圖層中的每個節點都將連接到輸入,在使用softmax變換之後,概率最高的節點表示的數字將成為CNN的輸出!

5.2交叉熵損失函數

你可能會有這樣的疑問,為什麼還要將輸出轉換為概率呢?最高輸出值是否總是具有最高概率?如果你有這樣的疑問,那說明你的感覺很對。我們實際上不需要使用softmax來預測數字,因為我們可以選擇網絡輸出最高的數字!

softmax真正做的是幫助我們量化我們對預測的確定程度,這在訓練和評估我們的CNN時非常有用。更具體地說,它可以幫我們確定每個預測的正確程度。

5.3實施Softmax

讓我們實現一個Softmax圖層類:

import numpy as np

class Softmax:
  

  def __init__(self, input_len, nodes):
    
    self.weights = np.random.randn(input_len, nodes) / input_len
    self.biases = np.zeros(nodes)

  def forward(self, input):
    '''
    Performs a forward pass of the softmax layer using the given input.
    Returns a 1d numpy array containing the respective probability values.
    - input can be any array with any dimensions.
    '''
    input = input.flatten()

    input_len, nodes = self.weights.shape

    totals = np.dot(input, self.weights) + self.biases
    exp = np.exp(totals)
    return exp / np.sum(exp, axis=0)

我們現在已經完成了CNN的整個編碼工作!把它放在一起:

import mnist
import numpy as np
from conv import Conv3x3
from maxpool import MaxPool2
from softmax import Softmax



test_images = mnist.test_images()[:1000]
test_labels = mnist.test_labels()[:1000]

conv = Conv3x3(8)                  
pool = MaxPool2()                  
softmax = Softmax(13 * 13 * 8, 10) 

def forward(image, label):
  '''
  Completes a forward pass of the CNN and calculates the accuracy and
  cross-entropy loss.
  - image is a 2d numpy array
  - label is a digit
  '''
  
  
  out = conv.forward((image / 255) - 0.5)
  out = pool.forward(out)
  out = softmax.forward(out)

  
  loss = -np.log(out[label])
  acc = 1 if np.argmax(out) == label else 0

  return out, loss, acc

print('MNIST CNN initialized!')

loss = 0
num_correct = 0
for i, (im, label) in enumerate(zip(test_images, test_labels)):
  
  _, l, acc = forward(im, label)
  loss += l
  num_correct += acc

  
  if i % 100 == 99:
    print(
      '[Step %d] Past 100 steps: Average Loss %.3f | Accuracy: %d%%' %
      (i + 1, loss / 100, num_correct)
    )
    loss = 0
    num_correct = 0

執行cnn.py,我們可以得到:

MNIST CNN initialized!
[Step 100] Past 100 steps: Average Loss 2.302 | Accuracy: 11%
[Step 200] Past 100 steps: Average Loss 2.302 | Accuracy: 8%
[Step 300] Past 100 steps: Average Loss 2.302 | Accuracy: 3%
[Step 400] Past 100 steps: Average Loss 2.302 | Accuracy: 12%

想親自嘗試或修改這些代碼?在瀏覽器中運行此CNN,你也可以在Github上找到它。

結論

關於CNN的介紹就到此結束了!在這篇文章中,我們:

介紹了為什麼CNN可能對某些問題更有用,例如圖像分類;

介紹了MNIST手寫數字數據集;

了解了Conv圖層,它將過濾器與圖像進行卷積,以產生更有用的輸出;

了解了Pooling圖層,它可以幫助修剪除最有用特徵之外的內容;

實現了Softmax層,因此我們可以使用交叉熵損失函數。

原文:https://victorzhou.com/blog/intro-to-cnns-part-1/

本文為 CSDN 翻譯,轉載請註明來源出處。

【End】

CSDN 5G免費沙龍來啦!

6月29日,微軟(中國)首席技術官韋青、北京郵電大學信息與通信工程學院多媒體技術教研中心主任/博士生導師孫松林、愛立信中國研發部多天線高級專家朱懷松、愛立信中國研發部主任系統工程師劉陽等行業內頂尖的領軍者、資深的技術專家們共聚一堂,共同探討5G在物聯網中的巨大潛能。

 熱 文 推 薦 

☞華為準備替代安卓?小米停止MIUI全球Beta計劃;首臺類腦超級計算機2022有望誕生 | 極客頭條

☞@程式設計師,不容錯過的 Vim 實用技巧請查收!

☞微軟發布 VS Code Java 安裝程序,一鍵安裝所有 Java 開發環境

☞那些去德國的程式設計師後來怎麼樣了?

☞獨家對話V神! 質疑之下的以太坊路在何方?

☞蘋果宣布加入CNCF;華為要求美國運營商支付專利費;微軟刪除最大的公開人臉識別數據集

☞阿里巴巴楊群:高並發場景下Python的性能挑戰

☞新技術「紅」不過十年,半監督學習為什麼是個例外?

☞老碼農冒死揭開編程黑幕:這些Bug讓我認輸,誰踩誰服!

點擊閱讀原文,輸入關鍵詞,即可搜索您想要的 CSDN 文章。

相關焦點

  • 第六講 走進卷積神經網絡
    從本講開始,我們正式進入卷積神經網絡(Conventional Neural Networks, CNN)的學習了
  • 讓你的電腦擁有「視力」,用卷積神經網絡就可以!
    卷積神經網絡極大地提升了圖像識別模型的精度,在生活中也有很多的應用。在這篇文章中,我將描述它的工作原理、一些實際應用,以及如何用Python和Keras是實現一個卷積神經網絡。卷積神經網絡包含一些層:卷積層和池化層。你可以這樣想像在卷積層裡發生了什麼:想像你有一幅圖片和一個放大鏡。將你的放大鏡放在圖片左上角的正上方,你將尋找一個特別的特徵並記下你有沒有找到。慢慢地移動你的放大鏡並重複這個操作。
  • 深度學習入門教程:手把手帶你用Numpy實現卷積神經網絡(一)
    後面我們將通過一系列文章介紹如何用Numpy從零實現一個可以訓練的CNN簡易網絡,同時對深度學習(CNN)的相關基礎知識進行一些複習,也希望能夠給正在入門的同學一些簡單的歸納。在這一系列的文章中,我們主要需要做以下一些工作:Numpy實現如下圖中所示的基本的CNN網絡組件:conv, pooling, relu, fullyconnect, softmax用實現的基本組件搭建可以訓練的網絡,完成mnist的訓練與測試,畫出一個下圖的訓練曲線從貫序連接的層模型到計算圖模型的引入,完成自動求值,求導等功能常見的初始化方法,激活函數,優化方法
  • CDA 試聽課|什麼是卷積神經網絡運算?
    ▲ 點擊藍字關注我們CDA 金牌講師覃老師,帶你5分鐘了解什麼是卷積神經網絡運算?
  • 卷積神經網絡學習路線(五)| 卷積神經網絡參數設置,提高泛化能力?
    type:優化算法的選擇,一共有六種可選:SGD、AdaDelta、AdaGrad、Adam、Nesterov和RMSProp。默認為SGD。原理建議看看史丹福大學的CS231N視頻課程。優秀的loss一般是對模型的泛化性能有所改善的,但在用loss的時候往往並不是直接替換loss那麼簡單,需要仔細思考loss背後的數學原理,要用對地方才可有提升。例如,如何將Focal Loss用到YOLOv3中提升map,大家可以看看這個帖子。https://www.zhihu.com/question/293369755。找到模型調參時的可靠評價指標。
  • 卷積神經網絡(CNN)綜述
    卷積神經網絡概念2. 卷積神經網絡的特點   2.1 局部區域連接   2.2 權值共享   2.3 降採樣3. 卷積神經網絡的結構   3.1 卷積層   3.2 池化層4. 卷積神經網絡的研究進展1.
  • 「範例卷積神經網絡」和信息最大化
    這一方法也能被理解為「卷積神經網絡範例」。本文內容摘要:本文對「範例卷積神經網絡」的訓練方法僅作了簡單簡單的概述,所以如果想要獲得更多、更真實的信息,請閱讀論文原文。本文簡要介紹了「變分信息最大化」,並將其運用到了「範例卷積神經網絡」的案例中。
  • 卷積神經網絡(CNN)新手指南
    以類似的方式計算機能夠進行圖像分類任務,通過尋找低層次的特徵如邊緣和曲線,然後運用一系列的卷積層建立一個更抽象的概念。這是卷積神經網絡應用的一個總體概述,接下來我們來探討下細節。生物聯繫首先要稍微普及下一點背景知識,當你第一次聽到卷積神經網絡這個詞時,你也許會想這是是不與神經科學或者生物學有關?恭喜你,猜對了一部分。
  • 卷積神經網絡概念與原理
    一、卷積神經網絡的基本概念       受Hubel和Wiesel對貓視覺皮層電生理研究啟發,有人提出卷積神經網絡(CNN),Yann Lecun
  • 卷積神經網絡小白入門手冊
    您可以重複使用ImageNet卷積神經網絡模型,也許是ResNet(2015年獲勝者提出的方法),並使用您的列車車隊圖像重新訓練網絡。你會做得很好。現在你可以開始學習如何構建它們了。卷積神經網絡教程那麼,讓我們開始吧。你會發現入門其實非常簡單,但是掌握它卻又是另一個層面的事情了。讓我們暫時把掌握它放在一邊。
  • 深入淺出解讀卷積神經網絡
    圖2 卷積神經網絡結構圖卷積神經網絡和全連接的神經網絡結構上的差異還是比較大的,全連接的網絡,相鄰兩層的節點都有邊相連,而卷積神經網絡,相鄰節點只有部分節點相連。那麼為什麼卷積神經網絡可以達到減小參數的目的呢?卷積神經網絡最為關鍵的有卷積層,池化層,全連接層。卷積層中每個節點的輸入只是上一層神經網絡的一小塊,通常由卷積核來實現,卷積核是一個過濾器,可以想像成一個掃描窗口,扣到每張圖片上,然後根據設置好的大小步長等等掃描圖片,計算規則是被扣的圖像像素矩陣跟卷積核的權重對應位置相乘然後求和,每掃描一次得到一個輸出。
  • 給你一個卷積神經網絡工作原理最直觀的解釋
    卷積神經網絡(Convolutional Neural Network, CNN)是人工神經網絡的一種,是當下語音分析和圖像識別領域的研究熱點。這篇文章用最簡明的語言和最直觀的圖像,帶你入門CNN。準備好了嗎?Let’s go——我們先從最基礎的內容說起。對二維數位訊號(圖像)的操作,可以寫成矩陣形式。
  • CNN卷積神經網絡— LeNet(二)
    一般神經網絡VS卷積神經網絡:相同點:卷積神經網絡也使用一種反向傳播算法(BP)來進行訓練不同點:網絡結構不同。卷積神經網絡的網絡連接具有局部連接、參數共享的特點。局部連接:是相對於普通神經網絡的全連接而言的,是指這一層的某個節點只與上一層的部分節點相連。參數共享:是指一層中多個節點的連接共享相同的一組參數。
  • 卷積神經網絡
    卷積神經網絡0.說在前面1.卷積神經網絡1.1 卷積層1.2 匯聚層1.3 全連接層2.卷積層實現2.1 前向傳播2.2 反向傳播3.匯聚層3.1 前向傳播3.2 反向傳播4.組合層5.三層卷積神經網絡5.1 架構5.2 類構造方法5.3 計算損失5.3.1 前向傳播5.3.2 反向傳播6.Spatial batch normalization6.1 要求解讀6.2 前向傳播6.3
  • YJango的卷積神經網絡——介紹
    PS:YJango是我的網名,意思是我寫的教程,並不是一種網絡結構。。關於卷積神經網絡的講解,網上有很多精彩文章,且恐怕難以找到比斯坦福的CS231n還要全面的教程。 所以這裡對卷積神經網絡的講解主要是以不同的思考側重展開,通過對卷積神經網絡的分析,進一步理解神經網絡變體中「因素共享」這一概念。注意:該文會跟其他的現有文章有很大的不同。
  • 如何設計卷積神經網絡CNN?
    回答4:流程:找baseline先找一個前人的基礎網絡結構,作為你設計的基礎。可以是resnet,densenet,Alexnet這種非常經典的,且訓練過程已經被大家復現過的。但是,你需要抉擇保留哪些網絡層,以及重新訓練哪些層。這取決於你的數據是什麼樣的。你的數據與預訓練的網絡(通常在ImageNet上預訓練)的數據越相似,你應該重新訓練的層數越少,反之亦然。例如,你想分類圖片中是否包含葡萄,所以你有一堆有葡萄的和一堆沒有的圖像。這些圖像與ImageNet中的圖像非常相似,因此你只需重新訓練最後幾層,也許就是全連接層。
  • 卷積神經網絡 AlexNet
    1.介紹LeNet 是最早推動深度學習領域發展的卷積神經網絡之一。這項由 Yann LeCun 完成的開創性工作自 1988 年以來多次成功迭代之後被命名為 LeNet5。AlexNet 可以說是具有歷史意義的一個網絡結構,在此之前,深度學習已經沉寂了很長時間,自 2012 年 AlexNet 誕生之後,後面的 ImageNet 冠軍都是用卷積神經網絡(CNN)來做的,並且層次越來越深,使得CNN成為在圖像識別分類的核心算法模型,帶來了深度學習的大爆發。本文將詳細講解 AlexNet 模型及其使用 Keras 實現過程。開始之前,先介紹一下卷積神經網絡。
  • 神奇GIF動畫讓你秒懂各種深度學習卷積神經網絡操作原理
    打開APP 神奇GIF動畫讓你秒懂各種深度學習卷積神經網絡操作原理 深度學習思考者 發表於 2017-11-15 18:58:34
  • 深度學習入門:淺析卷積神經網絡
    至今已有數種深度學習方法,如卷積神經網絡(CNN)、自編碼神經網絡(包括Auto encoder和Sparse Coding)和深度置信網絡(DBN),並在各個領域中取得了極好的效果。卷積層和全連接層中的參數會通過梯度下降被訓練,這樣卷積神經網絡計算出的分類評分就能和訓練集中的每個圖像的標籤逐漸相符了。1. 卷積層與卷積計算卷積層是構建卷積神經網絡的核心層,它佔據了網絡中大部分的計算。在處理圖像這樣的高維度輸入時,讓每個神經元都與前一層中的所有神經元進行全連接是不現實的。
  • 改進卷積神經網絡,你需要這14種設計模式
    選自Topbots作者:Mariya Yao機器之心編譯參與:馬亞雄、吳攀深度學習領域近來已經發展出大量的新架構,而如何選擇使用這些新架構提升卷積神經網絡的性能就顯得越發重要了。機器之心之前報導過提交 ICLR 2017 的論文:解析深度卷積神經網絡的14種設計模式也正是關注於此。而本文在描述14種設計模式之餘更加注重於闡述構建和訓練卷積網絡的小技巧。