日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习(03)-- CNN学习

發(fā)布時(shí)間:2023/12/13 pytorch 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习(03)-- CNN学习 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 目錄
    • 1.CNN學(xué)習(xí)
    • 2.Keras深度學(xué)習(xí)框架

目錄

1.CNN學(xué)習(xí)

卷積神經(jīng)網(wǎng)絡(luò)CNN總結(jié)

從神經(jīng)網(wǎng)絡(luò)到卷積神經(jīng)網(wǎng)絡(luò)(CNN)
我們知道神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)是這樣的:

那卷積神經(jīng)網(wǎng)絡(luò)跟它是什么關(guān)系呢?
其實(shí)卷積神經(jīng)網(wǎng)絡(luò)依舊是層級網(wǎng)絡(luò),只是層的功能和形式做了變化,可以說是傳統(tǒng)神經(jīng)網(wǎng)絡(luò)的一個(gè)改進(jìn)。比如下圖中就多了許多傳統(tǒng)神經(jīng)網(wǎng)絡(luò)沒有的層次。

?


卷積神經(jīng)網(wǎng)絡(luò)的層級結(jié)構(gòu)
? ? ? ? 數(shù)據(jù)輸入層/ Input layer
  ? 卷積計(jì)算層/ CONV layer
  ? ReLU激勵(lì)層 / ReLU layer
  ? 池化層 / Pooling layer
  ? 全連接層 / FC layer

?

1.數(shù)據(jù)輸入層
該層要做的處理主要是對原始圖像數(shù)據(jù)進(jìn)行預(yù)處理,其中包括:
  ? 去均值:把輸入數(shù)據(jù)各個(gè)維度都中心化為0,如下圖所示,其目的就是把樣本的中心拉回到坐標(biāo)系原點(diǎn)上。
  ? 歸一化:幅度歸一化到同樣的范圍,如下所示,即減少各維度數(shù)據(jù)取值范圍的差異而帶來的干擾,比如,我們有兩個(gè)維度的特征A和B,A范圍是0到10,而B范圍是0到10000,如果直接使用這兩個(gè)特征是有問題的,好的做法就是歸一化,即A和B的數(shù)據(jù)都變?yōu)?到1的范圍。
  ? PCA/白化:用PCA降維;白化是對數(shù)據(jù)各個(gè)特征軸上的幅度歸一化

?

去均值與歸一化效果圖:

?

去相關(guān)與白化效果圖:

?

?

2.卷積計(jì)算層
這一層就是卷積神經(jīng)網(wǎng)絡(luò)最重要的一個(gè)層次,也是“卷積神經(jīng)網(wǎng)絡(luò)”的名字來源。
在這個(gè)卷積層,有兩個(gè)關(guān)鍵操作:
  ? 局部關(guān)聯(lián)。每個(gè)神經(jīng)元看做一個(gè)濾波器(filter)
  ? 窗口(receptive field)滑動, filter對局部數(shù)據(jù)計(jì)算

?

先介紹卷積層遇到的幾個(gè)名詞:
  ? 深度/depth(解釋見下圖)
  ? 步長/stride (窗口一次滑動的長度)
  ? 填充值/zero-padding

?

填充值是什么呢?以下圖為例子,比如有這么一個(gè)5*5的圖片(一個(gè)格子一個(gè)像素),我們滑動窗口取2*2,步長取2,那么我們發(fā)現(xiàn)還剩下1個(gè)像素沒法滑完,那怎么辦呢?



那我們在原先的矩陣加了一層填充值,使得變成6*6的矩陣,那么窗口就可以剛好把所有像素遍歷完。這就是填充值的作用。



卷積的計(jì)算(注意,下面藍(lán)色矩陣周圍有一圈灰色的框,那些就是上面所說到的填充值)


這里的藍(lán)色矩陣就是輸入的圖像,粉色矩陣就是卷積層的神經(jīng)元,這里表示了有兩個(gè)神經(jīng)元(w0,w1)。綠色矩陣就是經(jīng)過卷積運(yùn)算后的輸出矩陣,這里的步長設(shè)置為2。

?

藍(lán)色的矩陣(輸入圖像)對粉色的矩陣(filter)進(jìn)行矩陣內(nèi)積計(jì)算并將三個(gè)內(nèi)積運(yùn)算的結(jié)果與偏置值b相加(比如上面圖的計(jì)算:2+(-2+1-2)+(1-2-2) + 1= 2 - 3 - 3 + 1 = -3),計(jì)算后的值就是綠框矩陣的一個(gè)元素。

?

下面的動態(tài)圖形象地展示了卷積層的計(jì)算過程:

?


參數(shù)共享機(jī)制
  ? 在卷積層中每個(gè)神經(jīng)元連接數(shù)據(jù)窗的權(quán)重是固定的,每個(gè)神經(jīng)元只關(guān)注一個(gè)特性。神經(jīng)元就是圖像處理中的濾波器,比如邊緣檢測專用的Sobel濾波器,即卷積層的每個(gè)濾波器都會有自己所關(guān)注一個(gè)圖像特征,比如垂直邊緣,水平邊緣,顏色,紋理等等,這些所有神經(jīng)元加起來就好比就是整張圖像的特征提取器集合。
  ? 需要估算的權(quán)重個(gè)數(shù)減少: AlexNet 1億 => 3.5w
  ? 一組固定的權(quán)重和不同窗口內(nèi)數(shù)據(jù)做內(nèi)積: 卷積

?


3.激勵(lì)層
把卷積層輸出結(jié)果做非線性映射。

CNN采用的激勵(lì)函數(shù)一般為ReLU(The Rectified Linear Unit/修正線性單元),它的特點(diǎn)是收斂快,求梯度簡單,但較脆弱,圖像如下。

?

激勵(lì)層的實(shí)踐經(jīng)驗(yàn):
  ①不要用sigmoid!不要用sigmoid!不要用sigmoid!
  ② 首先試RELU,因?yàn)榭?#xff0c;但要小心點(diǎn)
  ③ 如果2失效,請用Leaky ReLU或者M(jìn)axout
  ④ 某些情況下tanh倒是有不錯(cuò)的結(jié)果,但是很少


4.池化層
池化層夾在連續(xù)的卷積層中間, 用于壓縮數(shù)據(jù)和參數(shù)的量,減小過擬合。
簡而言之,如果輸入是圖像的話,那么池化層的最主要作用就是壓縮圖像。

?

這里再展開敘述池化層的具體作用。

1. 特征不變性,也就是我們在圖像處理中經(jīng)常提到的特征的尺度不變性,池化操作就是圖像的resize,平時(shí)一張狗的圖像被縮小了一倍我們還能認(rèn)出這是一張狗的照片,這說明這張圖像中仍保留著狗最重要的特征,我們一看就能判斷圖像中畫的是一只狗,圖像壓縮時(shí)去掉的信息只是一些無關(guān)緊要的信息,而留下的信息則是具有尺度不變性的特征,是最能表達(dá)圖像的特征。

2. 特征降維,我們知道一幅圖像含有的信息是很大的,特征也很多,但是有些信息對于我們做圖像任務(wù)時(shí)沒有太多用途或者有重復(fù),我們可以把這類冗余信息去除,把最重要的特征抽取出來,這也是池化操作的一大作用。

3. 在一定程度上防止過擬合,更方便優(yōu)化。


池化層用的方法有Max pooling 和 average pooling,而實(shí)際用的較多的是Max pooling。

這里就說一下Max pooling,其實(shí)思想非常簡單。

對于每個(gè)2*2的窗口選出最大的數(shù)作為輸出矩陣的相應(yīng)元素的值,比如輸入矩陣第一個(gè)2*2窗口中最大的數(shù)是6,那么輸出矩陣的第一個(gè)元素就是6,如此類推。


5.全連接層
兩層之間所有神經(jīng)元都有權(quán)重連接,通常全連接層在卷積神經(jīng)網(wǎng)絡(luò)尾部。也就是跟傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)神經(jīng)元的連接方式是一樣的:


一般CNN結(jié)構(gòu)依次為
  1. INPUT
  2. [[CONV -> RELU]*N -> POOL?]*M
  3. [FC -> RELU]*K
  4. FC


卷積神經(jīng)網(wǎng)絡(luò)之訓(xùn)練算法
  1. 同一般機(jī)器學(xué)習(xí)算法,先定義Loss function,衡量和實(shí)際結(jié)果之間差距。
  2. 找到最小化損失函數(shù)的W和b, CNN中用的算法是SGD(隨機(jī)梯度下降)。


卷積神經(jīng)網(wǎng)絡(luò)之優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
  ? 共享卷積核,對高維數(shù)據(jù)處理無壓力
  ? 無需手動選取特征,訓(xùn)練好權(quán)重,即得特征分類效果好
缺點(diǎn)
  ? 需要調(diào)參,需要大樣本量,訓(xùn)練最好要GPU
  ? 物理含義不明確(也就說,我們并不知道沒個(gè)卷積層到底提取到的是什么特征,而且神經(jīng)網(wǎng)絡(luò)本身就是一種難以解釋的“黑箱模型”)


卷積神經(jīng)網(wǎng)絡(luò)之典型CNN
  ? LeNet,這是最早用于數(shù)字識別的CNN
  ? AlexNet, 2012 ILSVRC比賽遠(yuǎn)超第2名的CNN,比
  ? LeNet更深,用多層小卷積層疊加替換單大卷積層。
  ? ZF Net, 2013 ILSVRC比賽冠軍
  ? GoogLeNet, 2014 ILSVRC比賽冠軍
  ? VGGNet, 2014 ILSVRC比賽中的模型,圖像識別略差于GoogLeNet,但是在很多圖像轉(zhuǎn)化學(xué)習(xí)問題(比如object detection)上效果奇好


卷積神經(jīng)網(wǎng)絡(luò)之 fine-tuning
何謂fine-tuning?
fine-tuning就是使用已用于其他目標(biāo)、預(yù)訓(xùn)練好模型的權(quán)重或者部分權(quán)重,作為初始值開始訓(xùn)練。

那為什么我們不用隨機(jī)選取選幾個(gè)數(shù)作為權(quán)重初始值?原因很簡單,第一,自己從頭訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)容易出現(xiàn)問題;第二,fine-tuning能很快收斂到一個(gè)較理想的狀態(tài),省時(shí)又省心。

那fine-tuning的具體做法是?
  ? 復(fù)用相同層的權(quán)重,新定義層取隨機(jī)權(quán)重初始值
  ? 調(diào)大新定義層的的學(xué)習(xí)率,調(diào)小復(fù)用層學(xué)習(xí)率


卷積神經(jīng)網(wǎng)絡(luò)的常用框架

Caffe
  ? 源于Berkeley的主流CV工具包,支持C++,python,matlab
  ? Model Zoo中有大量預(yù)訓(xùn)練好的模型供使用
Torch
  ? Facebook用的卷積神經(jīng)網(wǎng)絡(luò)工具包
  ? 通過時(shí)域卷積的本地接口,使用非常直觀
  ? 定義新網(wǎng)絡(luò)層簡單
TensorFlow
  ? Google的深度學(xué)習(xí)框架
  ? TensorBoard可視化很方便
  ? 數(shù)據(jù)和模型并行化好,速度快

?

總結(jié)
卷積網(wǎng)絡(luò)在本質(zhì)上是一種輸入到輸出的映射,它能夠?qū)W習(xí)大量的輸入與輸出之間的映射關(guān)系,而不需要任何輸入和輸出之間的精確的數(shù)學(xué)表達(dá)式,只要用已知的模式對卷積網(wǎng)絡(luò)加以訓(xùn)練,網(wǎng)絡(luò)就具有輸入輸出對之間的映射能力。

CNN一個(gè)非常重要的特點(diǎn)就是頭重腳輕(越往輸入權(quán)值越小,越往輸出權(quán)值越多),呈現(xiàn)出一個(gè)倒三角的形態(tài),這就很好地避免了BP神經(jīng)網(wǎng)絡(luò)中反向傳播的時(shí)候梯度損失得太快。

卷積神經(jīng)網(wǎng)絡(luò)CNN主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形。由于CNN的特征檢測層通過訓(xùn)練數(shù)據(jù)進(jìn)行學(xué)習(xí),所以在使用CNN時(shí),避免了顯式的特征抽取,而隱式地從訓(xùn)練數(shù)據(jù)中進(jìn)行學(xué)習(xí);再者由于同一特征映射面上的神經(jīng)元權(quán)值相同,所以網(wǎng)絡(luò)可以并行學(xué)習(xí),這也是卷積網(wǎng)絡(luò)相對于神經(jīng)元彼此相連網(wǎng)絡(luò)的一大優(yōu)勢。卷積神經(jīng)網(wǎng)絡(luò)以其局部權(quán)值共享的特殊結(jié)構(gòu)在語音識別和圖像處理方面有著獨(dú)特的優(yōu)越性,其布局更接近于實(shí)際的生物神經(jīng)網(wǎng)絡(luò),權(quán)值共享降低了網(wǎng)絡(luò)的復(fù)雜性,特別是多維輸入向量的圖像可以直接輸入網(wǎng)絡(luò)這一特點(diǎn)避免了特征提取和分類過程中數(shù)據(jù)重建的復(fù)雜度。

?


以下是我自己在學(xué)習(xí)CNN的時(shí)候遇到的一些困惑,以及查閱一些資料后得到的一些答案。

第一個(gè)問題:為什么不用BP神經(jīng)網(wǎng)絡(luò)去做呢?
1.全連接,權(quán)值太多,需要很多樣本去訓(xùn)練,計(jì)算困難
  ? 應(yīng)對之道:減少權(quán)值的嘗試,局部連接,權(quán)值共享

  卷積神經(jīng)網(wǎng)絡(luò)有兩種神器可以降低參數(shù)數(shù)目。
  第一種神器叫做局部感知野,一般認(rèn)為人對外界的認(rèn)知是從局部到全局的,而圖像的空間聯(lián)系也是局部的像素聯(lián)系較為緊密,而距離較遠(yuǎn)的像素相關(guān)性則較弱。因而,每個(gè)神經(jīng)元其實(shí)沒有必要對全局圖像進(jìn)行感知,只需要對局部進(jìn)行感知,然后在更高層將局部的信息綜合起來就得到了全局的信息。
  第二級神器,即權(quán)值共享。

?


2.邊緣過渡不平滑
  ? 應(yīng)對之道:采樣窗口彼此重疊

?


第二個(gè)問題:LeNet里的隱層的神經(jīng)元個(gè)數(shù)怎么確定呢?
它和原圖像,也就是輸入的大小(神經(jīng)元個(gè)數(shù))、濾波器的大小和濾波器在圖像中的滑動步長都有關(guān)!

LeNet-5共有7層,不包含輸入,每層都包含可訓(xùn)練參數(shù)(連接權(quán)重)。輸入圖像為32*32大小。

例如,我的圖像是1000x1000像素,而濾波器大小是10x10,假設(shè)濾波器沒有重疊,也就是步長為10,這樣隱層的神經(jīng)元個(gè)數(shù)就是(1000x1000 )/ (10x10)=100x100個(gè)神經(jīng)元了。

那重疊了怎么算?比如上面圖的C2中28*28是如何得來的?這里的步長就是1,窗口大小是5*5,所以窗口滑動肯定發(fā)生了重疊。下圖解釋了28的由來。

?

?

第三個(gè)問題:S2層是一個(gè)下采樣層是干嘛用的?為什么是下采樣?
也就是上面所說的池化層,只是叫法不同而已。這層利用圖像局部相關(guān)性的原理,對圖像進(jìn)行子抽樣,可以減少數(shù)據(jù)處理量同時(shí)保留有用信息,相當(dāng)于圖像壓縮。

2.Keras深度學(xué)習(xí)框架

Keras主要包括14個(gè)模塊,本文主要對Models、layers、Initializations、Activations、Objectives、Optimizers、Preprocessing、metrics共計(jì)8個(gè)模塊分別展開介紹,并通過一個(gè)簡單的Bp神經(jīng)網(wǎng)絡(luò)說明各個(gè)模塊的作用。?
1. Model?
包:keras.models?
這是Keras中最主要的一個(gè)模塊,用于對各個(gè)組件進(jìn)行組裝?
eg:

  • from keras.models import Sequential
  • model=Sequential() #初始化模型
  • model.add(...) #可使用add方法組裝組件
  • 2. layers?
    包:keras.layers?
    該模塊主要用于生成神經(jīng)網(wǎng)絡(luò)層,包含多種類型,如Core layers、Convolutional layers等?
    eg:

  • from keras.layers import Dense #Dense表示Bp層
  • model.add(Dense(input_dim=3,output_dim=5)) #加入隱含層
  • 3. Initializations?
    包:keras.initializations?
    該模塊主要負(fù)責(zé)對模型參數(shù)(權(quán)重)進(jìn)行初始化,初始化方法包括:uniform、lecun_uniform、normal、orthogonal、zero、glorot_normal、he_normal等?
    詳細(xì)說明:http://keras.io/initializations/?
    eg:

    model.add(Dense(input_dim=3,output_dim=5,init='uniform')) #加入帶初始化(uniform)的隱含層

    4. Activations?
    包:keras.activations、keras.layers.advanced_activations(新激活函數(shù))?
    該模塊主要負(fù)責(zé)為神經(jīng)層附加激活函數(shù),如linear、sigmoid、hard_sigmoid、tanh、softplus、relu、 softplus以及LeakyReLU等比較新的激活函數(shù)?
    詳細(xì)說明:http://keras.io/activations/?
    eg:

    model.add(Dense(input_dim=3,output_dim=5,activation='sigmoid')) 加入帶激活函數(shù)(sigmoid)的隱含層

    Equal to:

  • model.add(Dense(input_dim=3,output_dim=5))
  • model.add(Activation('sigmoid'))
  • 5. Objectives?
    包:keras.objectives?
    該模塊主要負(fù)責(zé)為神經(jīng)網(wǎng)絡(luò)附加損失函數(shù),即目標(biāo)函數(shù)。如mean_squared_error,mean_absolute_error ,squared_hinge,hinge,binary_crossentropy,categorical_crossentropy等,其中binary_crossentropy,categorical_crossentropy是指logloss?
    注:目標(biāo)函數(shù)的設(shè)定是在模型編譯階段?
    詳細(xì)說明:http://keras.io/objectives/?
    eg:

    model.compile(loss='binary_crossentropy', optimizer='sgd') #loss是指目標(biāo)函數(shù)

    6. Optimizers?
    包:keras.optimizers?
    該模塊主要負(fù)責(zé)設(shè)定神經(jīng)網(wǎng)絡(luò)的優(yōu)化方法,如sgd。?
    注:優(yōu)化函數(shù)的設(shè)定是在模型編譯階段?
    詳細(xì)說明:http://keras.io/optimizers/?
    eg:

    model.compile(loss='binary_crossentropy', optimizer='sgd') #optimizer是指優(yōu)化方法

    7. Preprocessing?
    包:keras.preprocessing.(image\sequence\text)?
    數(shù)據(jù)預(yù)處理模塊,不過本人目前尚未用過?
    8. metrics?
    包:keras.metrics?
    與sklearn中metrics包基本相同,主要包含一些如binary_accuracy、mae、mse等的評價(jià)方法?
    eg:

  • predict=model.predict_classes(test_x) #輸出預(yù)測結(jié)果
  • keras.metrics.binary_accuracy(test_y,predict) #計(jì)算預(yù)測精度
  • 9. Bp 神經(jīng)網(wǎng)絡(luò)的簡單實(shí)現(xiàn)

  • from keras.models import Sequential #導(dǎo)入模型
  • from keras.layers import Dense #導(dǎo)入bp層
  • train_x,train_y #訓(xùn)練集
  • test_x,text_y #測試集
  • model=Sequential() #初始化模型
  • model.add(Dense(input_dim=3,output_dim=3,activation='sigmoid',init='uniform'))) #添加一個(gè)隱含層,注:只是第一個(gè)隱含層需指定input_dim
  • model.add(Dense(1,activation='sigmoid')) #添加輸出層
  • model.compile(loss='binary_crossentropy', optimizer='sgd') # 編譯,指定目標(biāo)函數(shù)與優(yōu)化方法
  • model.fit(train_x,train_y ) # 模型訓(xùn)練
  • model.evaluate(test_x,text_y ) #模型測試
  • 總結(jié)

    以上是生活随笔為你收集整理的深度学习(03)-- CNN学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。