卷積神經(jīng)網(wǎng)絡(luò)
卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network, CNN)在提出之初被成功應(yīng)用于手寫字符圖像識別,2012年的AlexNet網(wǎng)絡(luò)在圖像分類任務(wù)中取得成功,此后,卷積神經(jīng)網(wǎng)絡(luò)發(fā)展迅速,現(xiàn)在已經(jīng)被廣泛應(yīng)用于圖形、圖像、語音識別等領(lǐng)域。
圖片的像素數(shù)往往非常大,如果用多層全連接網(wǎng)絡(luò)來處理,則參數(shù)數(shù)量將大到難以有效訓(xùn)練的地步。受貓腦研究的啟發(fā),卷積神經(jīng)網(wǎng)絡(luò)在多層全連接網(wǎng)絡(luò)的基礎(chǔ)上進(jìn)行了改進(jìn),它在不減少層數(shù)的前提下有效提升了訓(xùn)練速度。卷積神經(jīng)網(wǎng)絡(luò)在多個研究領(lǐng)域都取得了成功,特別是在與圖形有關(guān)的分類任務(wù)中。
卷積層和池化層是卷積神經(jīng)網(wǎng)絡(luò)的核心組成,它們和全連接層可以組合成很深層次的網(wǎng)絡(luò)。卷積神經(jīng)網(wǎng)絡(luò)還可以按需要添加用來抑制過擬合的Dropout層、拉平多維數(shù)據(jù)的Flatten層、加快收斂和抑制梯度消散的BatchNormalization層等等。
卷積層
二維卷積層Conv2d的輸入是:input_shape=(28,28,1)。這與前文討論的所有機(jī)器學(xué)習(xí)模型的輸入都不同,前文模型的輸入是一維向量,該一維向量要么是經(jīng)特征工程提取出來的特征,要么是被拉成一維的圖像數(shù)據(jù)。而這里卷積層的輸入是圖片數(shù)據(jù)組成的多維數(shù)據(jù)。
MNIST圖片中,只有一種顏色,通常稱灰色亮度。MNIST圖片的維度是(28,28,1),前面兩維存儲28×28個像素點(diǎn)的坐標(biāo)位置,后面1維表示像素點(diǎn)的灰色亮度值,因此它是28×28的單通道數(shù)據(jù)。
從數(shù)學(xué)上來講,卷積是一種積分變換。在深度學(xué)習(xí)中,它用來做數(shù)據(jù)的卷積運(yùn)算,在圖像處理領(lǐng)域取得了非常好的效果。
單通道數(shù)據(jù)上的卷積運(yùn)算包括待處理張量I、卷積核K和輸出張量S三個組成部分,它們的大小分別為4×4、3×3和2×2。
記待處理的張量為I,卷積核為K,每一次卷積運(yùn)算可表述為:
式中,I?K表示卷積運(yùn)算,M和N分別表示卷積核的長度和寬度。i,j是待處理張量I的坐標(biāo)位置,也是卷積核左上角對齊的位置
記待處理張量I的長度和寬度為P和Q,則輸出張量S的長度P^′和Q^′寬度分別為:
?
雖然要掃描整個輸入層,但一個通道只有一個卷積核,因此,對于整個輸入層來說,前向傳遞計算時的參數(shù)是一樣的,這稱為參數(shù)共享(parameter sharing)。參數(shù)共享大大減少了需要學(xué)習(xí)的參數(shù)的數(shù)量。
?
?在卷積運(yùn)算中,一般會設(shè)置多個卷積核。示例中設(shè)置了32個卷積核(TensorFlow中稱為過濾器filters),因此該卷積層的輸出為24×24×32,也就是說將28×28×1的數(shù)據(jù)變成了24×24×32的,在畫神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖時,一般用下圖中的長方體來表示上述卷積運(yùn)算,水平方向長度示意卷積核的數(shù)量。
因?yàn)檩斎胧菃瓮ǖ赖?,因此每卷積核只有一層,它的參數(shù)為5×5+1=26,共32個卷積核,因此訓(xùn)練參數(shù)為26×32=832個。
如果待處理張量規(guī)模很大,可以將卷積核由依次移動改為跳躍移動,即加大步長(strides),減少計算量,加快訓(xùn)練速度。
為了提取到邊緣的特征,可以在待處理張量的邊緣填充0再進(jìn)行卷積運(yùn)算,稱為零填充(zero-padding)。填充也可以根據(jù)就近的值進(jìn)行填充。邊緣填充的另一個用途是在張量與卷積核不匹配時,通過填充使之匹配,從而卷積核能掃描到所有數(shù)據(jù)。
卷積層代碼如下
### MindSpore
class mindspore.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, pad_mode='same', padding=0, dilation=1, group=1, has_bias=False, weight_init='normal', bias_init='zeros', data_format='NCHW')
?
### TensorFlow2
tf.keras.layers.Conv2D(
filters, kernel_size, strides=(1, 1), padding='valid',
data_format=None, dilation_rate=(1, 1), groups=1, activation=None,
use_bias=True, kernel_initializer='glorot_uniform',
bias_initializer='zeros', kernel_regularizer=None,
bias_regularizer=None, activity_regularizer=None, kernel_constraint=None,
bias_constraint=None, **kwargs
)
?池化層和Flatten層
池化(pooling)層一般跟在卷積層之后,用于壓縮數(shù)據(jù)和參數(shù)的數(shù)量。
池化操作也叫下采樣(sub-sampling),具體過程與卷積層基本相同,只不過卷積核只取對應(yīng)位置的最大值或平均值,分別稱為最大池化或平均池化。
池化層的移動方式與卷積層不同,它是不重疊地移動。
Flatten層很簡單,只是將輸入的多維數(shù)據(jù)拉成一維的,直觀上可理解為將數(shù)據(jù)“壓平”。
除卷積層、池化層和全連接層(輸入之前隱含F(xiàn)latten層)之外的層,不改變網(wǎng)絡(luò)結(jié)構(gòu),因此,一般只用這三層來表示神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)。
?批標(biāo)準(zhǔn)化層
針對誤差難繼續(xù)傳遞問題,批標(biāo)準(zhǔn)化對每一層的批量輸入數(shù)據(jù)x進(jìn)行標(biāo)準(zhǔn)化,使之盡量避免落入飽和區(qū),具體來講就是使之均值為0,方差為1。對每一批輸入數(shù)據(jù)B={x_1,x_2,…,x_m}:
?
其中,?為防止除0的很小的常數(shù)。前三步分別為計算均值、計算方差、標(biāo)準(zhǔn)化,最后一步是對歸一化后的結(jié)果進(jìn)行縮放和平移,其中的γ和β是要學(xué)習(xí)的參數(shù)。文章來源:http://www.zghlxwxcb.cn/news/detail-481341.html
創(chuàng)作不易 覺得有幫助請點(diǎn)贊關(guān)注收藏~~~文章來源地址http://www.zghlxwxcb.cn/news/detail-481341.html
到了這里,關(guān)于【Python機(jī)器學(xué)習(xí)】卷積神經(jīng)網(wǎng)絡(luò)卷積層、池化層、Flatten層、批標(biāo)準(zhǔn)化層的講解(圖文解釋)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!