【機器學習】卷積層,池化層,全連接層,BN層作用;CNN 網絡參數數量的計算


官方文檔:https://keras.io/layers/convolutional/#zeropadding2d
https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html VGG16架構

https://www.cnblogs.com/ymjyqsx/p/9451739.html

#【搬運】conv卷積層:
1.相當於一個特征提取器(特征增強,消除噪聲)
2.提供了位置信息
3.減少了參數個數

https://blog.csdn.net/m0_37622530/article/details/82230368
https://www.cnblogs.com/ymjyqsx/p/9451739.html

#【搬運】pooling池化層:
#1.提取特征(減少之前的特征維數) 
#2.減少訓練參數
#3.進而防止過擬合(泛化能力加強)。 激活函數:增加網絡的非線性表達能力。
#1 過濾越來越多的卷積層,提取越來越高級的特征
#2 Max pooling和Global Average Pooling用來只保留這些特征中最強的,保證特征的位置與旋轉不變性,減少模型參數數量,減少過擬合問題

————————————————————————————

https://blog.csdn.net/qq_39521554/article/details/81385159
【半搬運】對全連接層(fully connected layer)的通俗理解:
全連接層(fully connected layers,FC)(通過矩陣向量乘積)在整個卷積神經網絡中起到“分類器”的作用。如果說卷積層、池化層和激活函數層等操作是將原始數據映射到隱層特征空間的話,全連接層則對前面的特征(通過“全局平均值global average pooling”的方法減少全連接的參數)做加權和,將學到的“分布式特征表示”(高度提純的特征)映射到樣本標記空間。

https://blog.csdn.net/wangyuxi__/article/details/82714647
全連接層:連接所有的特征,將輸出值送給分類器(如softmax分類器)。

 

 

 

https://blog.csdn.net/m0_37407756/article/details/80904580
卷積取的是局部特征,全連接就是把以前的局部特征重新通過權值矩陣組裝成完整的圖。因為用到了所有的局部特征,所以叫全連接。】

【分布式特征表示:XR理解:數據間如何相互關聯的信息。參考:
https://blog.csdn.net/zkh880loLh3h21AJTH/article/details/80326188
【樣本空間:所有可能存在的、合理的、情況的集合。參考:
https://blog.csdn.net/csucsgoat/article/details/79598803))】

在實際使用中,全連接層可以轉化為卷積核為1x1的卷積。
https://www.cnblogs.com/ymjyqsx/p/9451739.html
卷積層本來就是全連接的一種簡化形式:不全連接+參數共享,把局部視野之外的弱影響直接抹為零影響,同時還保留了空間位置信息(卷積層不同位置的權值共享)。這樣大大減少了參數並且使得訓練變得可控。

#【1x1卷積層的作用:https://blog.csdn.net/junmuzi/article/details/78219336
https://blog.csdn.net/chaipp0607/article/details/60868689
#1、降維(dimension reductionality )。比如,一張500 x 500且厚度depth為100的圖片在20個filter上做1x1的卷積,那么結果的大小為500x500x20。降低通道數(厚度)而不改變圖片長寬。
#2、加入非線性。卷積層之后經過激勵層,1x1的卷積在前一層的學習表示上添加了非線性激勵( non-linear activation),提升網絡的表達能力。】

 

卷積層與全連接層之間的過渡層(將多維輸入一維化Flatten)。
model.add(Flatten())將最后一個池化層的長寬厚進行展平輸出向量,不影響批量大小,方便將該結果接入全連接層。


為了提升 CNN網絡性能,全連接層每個神經元的激勵函數一般采用ReLU函數。最后一層全連接層的輸出值被softmax邏輯回歸(softmax regression)分類,這層也被稱作softmax層。
https://www.cnblogs.com/lc1217/p/7324935.html
【搬運】卷積神經網絡結構圖:

 

 

 

https://blog.csdn.net/blateyang/article/details/79101339
【搬運】關於深度學習中的Batch normalization的理解:
BN的原理:
批規范化(Batch normalization)是深度學習中經常見到的一種訓練trick,指在采用梯度下降法訓練DNN時,對網絡層中每個mini-batch的數據進行歸一化,使其均值變為0,方差變為1,其主要作用是緩解DNN訓練中的梯度消失/爆炸現象,加快模型的訓練速度。

BN的好處和原因:

         1.允許較大的學習率,加快模型收斂速度
         2.避免深層網絡的梯度消失或爆炸問題

         3.減少對參數初始化方法的依賴

BN使用的注意點
    是沿着數據的batch size方向做規范化。對於二維張量形式的數據X(N,D),即沿着dim=0方向計算均值和方差;對於四維張量形式的圖像數據X(N,C,H,W),把它reshape成X(NHW,C),再沿着dim=0方向計算均值和方差,計算完之后再reshape回去,此時叫做Spatial BN。
    測試階段BN的均值和方差不再是基於batch計算的,而是使用固定的統計參數(根據訓練階段各mini-batch計算出的均值和方差得到,詳見原論文(上面鏈接中))

https://www.cnblogs.com/paulonetwo/p/10078961.html


BatchNormalization使用:

1 model.add(Conv2D(16, (3, 3), strides=(1, 1), padding='valid'))
2 model.add(MaxPooling2D((2, 2)))
3 model.add(BatchNormalization())
4 model.add(Activation('relu'))
5 
1 #https://www.cnblogs.com/skyfsm/p/8453498.html
2 #BN在深層神經網絡的作用非常明顯:若神經網絡訓練時遇到收斂速度較慢,或者“梯度爆炸”等無法訓練的情況發生時都可以嘗試用BN來解決。
同時,常規使用情況下同樣可以加入BN來加速模型訓練,甚至提升模型精度。

 

——————————————————————————

CNN 網絡參數數量的計算:
XR代碼與運行結果:(#后面是注釋)

from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D
from keras.layers import Dropout, Flatten, Dense
from keras.models import Sequential

model = Sequential()

model.add(Conv2D(filters=16,#輸出的維度Output Shape在這里插入代碼片的最后一個維度的值
                 kernel_size=2, strides=1, padding='valid', #卷積核濾波器的高和寬的值均為2 #移動步幅為1 #valid 丟棄,same補零
                 activation='relu',#如果未指定任何值,則不應用任何激活函數
                 input_shape=(224, 224, 3))) #之前加載RGB圖像過后縮放為 224×224 的圖像,有3個通道(轉化張量格式)    
                 #卷積層中的參數數量Param = (過濾器數量 * 過濾器高度 * 過濾器寬度 * 上一層深度即上一層過濾器數量)+ 過濾器數量
                 #      = (過濾器數量 * 每個過濾器的權重數量) + 過濾器數量
                 #      = (卷積層的權重總數) + 過濾器數量
                 #      = (卷積層的權重總數) + 每個過濾器有 1 個偏差項因此卷積層*共有過濾器數量個偏差
                 #      = (每個過濾器的偏差項 1+ 上一層過濾器的權重數量)* 這一層過濾器數量
                 #      = (16 * 2 * 2 * 3)+16 = 208
model.add(MaxPooling2D(pool_size=2))
                 #池化層的輸出: ((輸入進的卷積層高度-池化窗口高度+1)/步幅長度) * ((輸入進的卷積層寬度-池化窗口寬度+1)/步幅長度) ,輸出的最后一個維度(厚度)等於經過上一層卷積濾波器后輸入進池化層的數量
                 #如果padding='same',那時池化層的輸出:((輸入進的卷積層高度)/步幅長度) * ((輸入進的卷積層寬度)/步幅長度) 
model.add(Conv2D(filters=32,
                 kernel_size=2, strides=1, padding='valid',
                 activation='relu',
                ) )
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=64,
                 kernel_size=2, strides=1, padding='valid',
                 activation='relu',
                ) )
model.add(MaxPooling2D(pool_size=2))
model.add(GlobalAveragePooling2D(data_format='channels_last'))#縮小的因子(dim1,dim2)只有圖像的長和寬,因此該空間數據的全局最大池操作是二維
model.add(Dense(133, activation='softmax'))
#Total params: 19,189 = 208+2080+8256+8645
model.summary()

 

 

 


#卷積層中的參數數量Param = (過濾器數量 x 過濾器高度 x 過濾器寬度 x 上一層深度即上一層過濾器數量)+ 過濾器數量
# = (過濾器數量 x 每個過濾器的權重數量) + 過濾器數量
# = (卷積層的權重總數) + 過濾器數量
# = (卷積層的權重總數) + 每個過濾器有 1 個偏差項因此卷積層 x 共有過濾器數量個偏差
# = (每個過濾器的偏差項 1+ 上一層過濾器的權重數量) x(連接至) 這一層過濾器數量 【XR理解】

不同基本CNN結構原理:http://cs231n.github.io/convolutional-networks/#architectures

【搬運】
最常見的ConvNet架構遵循以下模式:

INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC

其中,*表示重復,POOL?表示可選的池層。而且,N >= 0(通常N <= 3)M >= 0,K >= 0(和通常K < 3)。例如,以下是您可能會看到的一些常見的ConvNet架構,遵循以下模式:

INPUT -> FC,實現線性分類器。在這里N = M = K = 0。
INPUT -> CONV -> RELU -> FC
INPUT -> [CONV -> RELU -> POOL]*2 -> FC -> RELU ->FC。
在這里,我們看到每個POOL層之間都有一個CONV層。
INPUT -> [CONV -> RELU -> CONV -> RELU -> POOL]*3 -> [FC -> RELU]*2 -> FC
在這里,我們看到在每個POOL層之前堆疊了兩個CONV層。對於更大更深的網絡而言,這通常是一個好主意,因為多個堆疊的CONV層可以在破壞性池化操作之前開發輸入卷的更復雜的特征。
優選將一疊小濾波器CONV連接到一個大的感受野CONV層。
改進點:
1 Batch normalization layer用來解決

————————————————
版權聲明:本文為CSDN博主「XR要做有思考的筆記」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_37985288/article/details/93318486


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM