天天看點

【機器學習】卷積層,池化層,全連接配接層,BN層作用;CNN 網絡參數數量的計算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分類器)。

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

【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

【搬運】卷積神經網絡結構圖:

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

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使用:

model.add(Conv2D(16, (3, 3), strides=(1, 1), padding='valid'))
model.add(MaxPooling2D((2, 2)))
model.add(BatchNormalization())
model.add(Activation('relu'))
           

https://www.cnblogs.com/skyfsm/p/8453498.html

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()
           
【機器學習】卷積層,池化層,全連接配接層,BN層作用;CNN 網絡參數數量的計算CNN 網絡參數數量的計算:

#卷積層中的參數數量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用來解決Covariate Shift的問題

2 Dropout layer用來降低模型複雜度,增強模型的泛化能力,防止過拟合,順帶降低了運算量

繼續閱讀