做外匯都要看什么網(wǎng)站吉林seo管理平臺(tái)
1 深度學(xué)習(xí)池化概述
1.1 什么是池化
池化層是卷積神經(jīng)網(wǎng)絡(luò)中常用的一個(gè)組件,池化層經(jīng)常用在卷積層后邊,通過(guò)池化來(lái)降低卷積層輸出的特征向量,避免出現(xiàn)過(guò)擬合的情況。池化的基本思想就是對(duì)不同位置的特征進(jìn)行聚合統(tǒng)計(jì)。池化層主要是模仿人的視覺(jué)系統(tǒng)對(duì)數(shù)據(jù)進(jìn)行降維,用更高層次的特征表示圖像。池化層一般沒(méi)有參數(shù),所以反向傳播的時(shí)候,只需對(duì)輸入?yún)?shù)求導(dǎo),不需要進(jìn)行權(quán)值更新。
池化操作的基本思想是將特征圖劃分為若干個(gè)子區(qū)域(一般為矩形),并對(duì)每個(gè)子區(qū)域進(jìn)行統(tǒng)計(jì)匯總。池化操作的方式可以有很多種,比如最大池化(Max Pooling)、平均池化(Average Pooling)等。其中,最大池化操作會(huì)選取每個(gè)子區(qū)域內(nèi)的最大值作為輸出,而平均池化操作則會(huì)計(jì)算每個(gè)子區(qū)域內(nèi)的平均值作為輸出。
1.2 池化的作用
理論上來(lái)說(shuō),網(wǎng)絡(luò)可以在不對(duì)原始輸入圖像執(zhí)行降采樣的操作,通過(guò)堆疊多個(gè)的卷積層來(lái)構(gòu)建深度神經(jīng)網(wǎng)絡(luò),如此一來(lái)便可以在保留更多空間細(xì)節(jié)信息的同時(shí)提取到更具有判別力的抽象特征。然而,考慮到計(jì)算機(jī)的算力瓶頸,通常都會(huì)引入池化層,來(lái)進(jìn)一步地降低網(wǎng)絡(luò)整體的計(jì)算代價(jià),這是引入池化層最根本的目的。
池化層大大降低了網(wǎng)絡(luò)模型參數(shù)和計(jì)算成本,也在一定程度上降低了網(wǎng)絡(luò)過(guò)擬合的風(fēng)險(xiǎn)。概括來(lái)說(shuō),池化層主要有以下五點(diǎn)作用:
-
增大網(wǎng)絡(luò)感受野
-
抑制噪聲,降低信息冗余
-
降低模型計(jì)算量,降低網(wǎng)絡(luò)優(yōu)化難度,防止網(wǎng)絡(luò)過(guò)擬合
-
使模型對(duì)輸入圖像中的特征位置變化更加魯棒
1.3 池化核大小
池化窗口的大小,在PyTorch里池化核大小可以是一個(gè)整數(shù)或者一個(gè)元組,例如 kernel_size=2 或者 kernel_size=(2, 3)。
- 如果是一個(gè)整數(shù),則表示高和寬方向上的池化窗口大小相同;
- 如果是一個(gè)元組,則第一個(gè)元素表示高方向上的池化窗口大小,第二個(gè)元素表示寬方向上的池化窗口大小。
1.4 步幅大小
用于指定池化窗口在高和寬方向上的步幅大小,可以是一個(gè)整數(shù)或者一個(gè)元組,例如 stride=2 或者 stride=(2, 3)。
- 如果是一個(gè)整數(shù),則表示高和寬方向上的步幅大小相同;
- 如果是一個(gè)元組,則第一個(gè)元素表示高方向上的步幅大小,第二個(gè)元素表示寬方向上的步幅大小。
1.5 填充
池化層的填充(padding)可以控制池化操作在特征圖邊緣的行為,使得池化后的輸出特征圖與輸入特征圖大小相同或相近。
在池化操作時(shí),如果輸入特征圖的尺寸不能被池化窗口的大小整除,那么最后一列或者最后一行的部分像素就無(wú)法被包含在池化窗口中進(jìn)行池化,因此池化后的輸出特征圖尺寸會(huì)減小。
通過(guò)在輸入特征圖的邊緣添加填充,可以使得池化操作在邊緣像素處進(jìn)行池化,避免了信息的丟失,并且保持了輸出特征圖的大小與輸入特征圖相同或相近。同時(shí),填充也可以增加模型的穩(wěn)定性,減少過(guò)擬合的風(fēng)險(xiǎn)。
需要注意的是,池化層的填充和卷積層的填充有所不同:
- 池化層的填充通常是指在輸入特征圖的邊緣添加0值像素;
- 卷積層的填充是指在輸入特征圖的邊緣添加0值像素或者復(fù)制邊緣像素。
PyTorch里的填充大小可以是一個(gè)整數(shù)或者一個(gè)元組,例如 padding=1 或者 padding=(1, 2)。
- 如果是一個(gè)整數(shù),則表示在高和寬方向上的填充大小相同;
- 如果是一個(gè)元組,則第一個(gè)元素表示高方向上的填充大小,第二個(gè)元素表示寬方向上的填充大小。默認(rèn)為 0,表示不進(jìn)行填充。
2 pytorch中的池化詳解
2.1 Max Pooling(最大池化)
2.1.1 定義
最大池化(Max Pooling)是將輸入的圖像劃分為若干個(gè)矩形區(qū)域,對(duì)每個(gè)子區(qū)域輸出最大值。其定義如下:
最大池化就是選取圖像區(qū)域中的最大值作為該區(qū)域池化后的值。在前向傳播過(guò)程中,選擇圖像區(qū)域中的最大值作為該區(qū)域池化后的值;在反向傳播過(guò)程中,梯度通過(guò)前向傳播過(guò)程時(shí)的最大值反向傳播,其他位置的梯度為0。如下圖所示,采用22的filters,步長(zhǎng)stride=2,在原特征圖44中提取特征得到右圖2*2。
最大值池化的優(yōu)點(diǎn)在于它能學(xué)習(xí)到圖像的邊緣和紋理結(jié)構(gòu)。
對(duì)于最大池化,在前向傳播計(jì)算時(shí),是選取的每個(gè)區(qū)域中的最大值,這里需要記錄下最大值在每個(gè)小區(qū)域中的位置。在反向傳播時(shí),只有那個(gè)最大值對(duì)下一層有貢獻(xiàn),所以將殘差傳遞到該最大值的位置,區(qū)域內(nèi)其余位置置零。具體過(guò)程如下圖,其中4*4矩陣中非零的位置即為前邊計(jì)算出來(lái)的每個(gè)小區(qū)域的最大值的位置。
2.1.2 pytorch中的最大池化
PyTorch中的最大池化函數(shù):
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
-
kernel_size (int or tuple)【必選】:max pooling 的窗口大小,當(dāng)最大池化窗口是方形的時(shí)候,只需要一個(gè)整數(shù)邊長(zhǎng)即可;最大池化窗口不是方形時(shí),要輸入一個(gè)元組表 高和寬。
-
stride (int or tuple, optional)【可選】:max pooling 的窗口移動(dòng)的步長(zhǎng)。默認(rèn)值是 kernel_size
-
padding (int or tuple, optional)【可選】:輸入的每一條邊補(bǔ)充0的層數(shù)
-
dilation (int or tuple, optional)【可選】:一個(gè)控制窗口中元素步幅的參數(shù)
-
return_indices (bool)【可選】:如果等于 True,會(huì)返回輸出最大值的序號(hào),對(duì)于上采樣操作會(huì)有幫助
-
ceil_mode (bool)【可選】:如果等于True,計(jì)算輸出信號(hào)大小的時(shí)候,會(huì)使用向上取整,代替默認(rèn)的向下取整的操作
torch.nn.MaxPool2d
和 torch.nn.functional.max_pool2d
,在 pytorch 構(gòu)建模型中,都可以作為最大池化層的引入,但前者為類模塊,后者為函數(shù),在使用上存在不同。
torch.nn.functional.max_pool2d(input, kernel_size, stride=None, padding=0, dilation=1, ceil_mode=False, return_indices=False
)
2.1.3 使用示例
- 張量池化
import torch# 定義輸入數(shù)據(jù)張量,大小為 (batch_size, channels, height, width)
input_tensor = torch.randn(2, 3, 16, 16)# 定義最大池化層,kernel_size 為池化核大小,stride 為步幅
max_pool = torch.nn.MaxPool2d(kernel_size=2, stride=2)# 對(duì)輸入數(shù)據(jù)進(jìn)行最大池化操作
output_tensor = max_pool(input_tensor)# 輸出池化前后的結(jié)果張量大小
print("input_tensor:", input_tensor.shape)
print("output_tensor:", output_tensor.shape)
運(yùn)行結(jié)果顯示:
input_tensor: torch.Size([2, 3, 16, 16])
output_tensor: torch.Size([2, 3, 8, 8])
輸入大小為 (2,3,16,16)的張量, 然后定義了一個(gè)最大池化層,池化操作以后,
最后輸出的張量大小是: torch.Size([2, 3, 8, 8])
- 圖片池化
import torch
from PIL import Image
from torchvision.transforms import ToTensor
from torchvision.transforms.functional import to_pil_image
import matplotlib.pyplot as plt# 讀入示例圖片并將其轉(zhuǎn)換為 PyTorch 張量
img = Image.open('./data/lena.jpeg')
img_tensor = ToTensor()(img)# 定義 MaxPool2d 函數(shù),進(jìn)行池化操作
max_pool = torch.nn.MaxPool2d(kernel_size=2, stride=2)
img_pool = max_pool(img_tensor.unsqueeze(0)).squeeze(0)# 將池化后的張量轉(zhuǎn)換為 PIL 圖像并保存
img_pool_pil = to_pil_image(img_pool)plt.subplot(121)
plt.imshow(img)
plt.title('original')
plt.axis('off')
plt.subplot(122)
plt.imshow(img_pool_pil)
plt.title('pool')
plt.axis('off')
plt.show()
運(yùn)行結(jié)果顯示:
2.1.4 總結(jié)
對(duì)于最大池化操作,只選擇每個(gè)矩形區(qū)域中的最大值進(jìn)入下一層,而其他元素將不會(huì)進(jìn)入下一層。所以最大池化提取特征圖中響應(yīng)最強(qiáng)烈的部分進(jìn)入下一層,這種方式摒棄了網(wǎng)絡(luò)中大量的冗余信息,使得網(wǎng)絡(luò)更容易被優(yōu)化。同時(shí)這種操作方式也常常丟失了一些特征圖中的細(xì)節(jié)信息,所以最大池化更多保留些圖像的紋理信息。
2.2 Average Pooling(平均池化)
2.2.1 定義
平均池化(Average Pooling)是將輸入的圖像劃分為若干個(gè)矩形區(qū)域,對(duì)每個(gè)子區(qū)域輸出所有元素的平均值。其定義如下:
平均池化就是計(jì)算圖像區(qū)域的平均值作為該區(qū)域池化后的值,Resnet網(wǎng)絡(luò)結(jié)構(gòu)后一般會(huì)使用平均池化。
對(duì)于平均池化,我們需要把殘差平分,傳遞到前邊小區(qū)域的n個(gè)單元即可,不需要記錄下元素在每個(gè)小區(qū)域中的位置。平均池化比較容易讓人理解錯(cuò)的地方就是會(huì)簡(jiǎn)單的認(rèn)為直接把梯度復(fù)制N遍之后直接反向傳播回去,但是這樣會(huì)造成loss之和變?yōu)樵瓉?lái)的N倍,網(wǎng)絡(luò)是會(huì)產(chǎn)生梯度爆炸的。
2.2.2 pytorch中的平均池化
torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True, divisor_override=None)
-
kernel_size:池化窗口的大小??梢允且粋€(gè)整數(shù),表示正方形窗口的邊長(zhǎng),也可以是一個(gè)元組,表示不同維度的窗口大小。例如,(2, 2)表示寬和高為2的正方形窗口。
-
stride:池化窗口的步幅??梢允且粋€(gè)整數(shù),表示在所有維度上的步幅相同,也可以是一個(gè)元組,表示不同維度上的步幅。例如,(2, 2)表示在寬和高上的步幅為2。
-
padding:輸入張量的填充大小。可以是一個(gè)整數(shù),表示在所有維度上的填充大小相同,也可以是一個(gè)元組,表示不同維度上的填充大小。例如,(1, 1)表示在寬和高上的填充大小為1。
-
ceil_mode:是否采用向上取整的方式計(jì)算輸出大小。如果為True,則輸出大小會(huì)向上取整。默認(rèn)為False。
-
count_include_pad:是否將填充值計(jì)算在內(nèi)。如果為True,則會(huì)將填充值計(jì)算在內(nèi)。默認(rèn)為True。
-
divisor_override:用于覆蓋默認(rèn)的輸出元素?cái)?shù)。如果指定了該參數(shù),則輸出元素?cái)?shù)將被覆蓋為該值。默認(rèn)為None。
2.2.3 使用示例
- 張量池化
import torch# 定義輸入數(shù)據(jù)張量,大小為 (batch_size, channels, height, width)
input_tensor = torch.randn(2, 3, 16, 16)# 定義平均池化層,kernel_size 為池化核大小,stride 為步幅
avg_pool = torch.nn.AvgPool2d(kernel_size=2, stride=2)# 對(duì)輸入數(shù)據(jù)進(jìn)行平均池化操作
output_tensor = avg_pool(input_tensor)# 輸出池化前后的結(jié)果張量大小
print("input_tensor:", input_tensor.shape)
print("output_tensor:", output_tensor.shape)
運(yùn)行結(jié)果顯示:
input_tensor: torch.Size([2, 3, 16, 16])
output_tensor: torch.Size([2, 3, 8, 8])
- 圖片池化?
import torch
from PIL import Image
from torchvision.transforms import ToTensor
from torchvision.transforms.functional import to_pil_image
import matplotlib.pyplot as plt# 讀入示例圖片并將其轉(zhuǎn)換為 PyTorch 張量
img = Image.open('./data/lena.jpeg')
img_tensor = ToTensor()(img)# 定義 AvgPool2d 函數(shù),進(jìn)行池化操作
avg_pool = torch.nn.AvgPool2d(kernel_size=2, stride=2)
img_pool = avg_pool(img_tensor.unsqueeze(0)).squeeze(0)# 將池化后的張量轉(zhuǎn)換為 PIL 圖像并保存
img_pool_pil = to_pil_image(img_pool)plt.subplot(121)
plt.imshow(img)
plt.title('original')
plt.axis('off')
plt.subplot(122)
plt.imshow(img_pool_pil)
plt.title('pool')
plt.axis('off')
plt.show()
?
2.2.4 總結(jié)
平均池化取每個(gè)矩形區(qū)域中的平均值,可以提取特征圖中所有特征的信息進(jìn)入下一層,而不像最大池化只保留值最大的特征,所以平均池化可以更多保留些圖像的背景信息。
2.3 Global Average Pooling(全局平均池化)
在卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練初期,卷積層通過(guò)池化層后一般要接多個(gè)全連接層進(jìn)行降維,最后再Softmax分類,這種做法使得全連接層參數(shù)很多,降低了網(wǎng)絡(luò)訓(xùn)練速度,且容易出現(xiàn)過(guò)擬合的情況。在這種背景下,M Lin等人提出使用全局平均池化Global Average Pooling[1]來(lái)取代最后的全連接層。用很小的計(jì)算代價(jià)實(shí)現(xiàn)了降維,更重要的是GAP極大減少了網(wǎng)絡(luò)參數(shù)(CNN網(wǎng)絡(luò)中全連接層占據(jù)了很大的參數(shù))。
論文地址: https://arxiv.org/pdf/1312.4400.pdf
代碼鏈接: https://worksheets.codalab.org/worksheets
2.3.1 定義
全局平均池化是一種特殊的平均池化,只不過(guò)它不劃分若干矩形區(qū)域,而是將整個(gè)特征圖中所有的元素取平均輸出到下一層。其定義如下:
2.3.2 總結(jié)
作為全連接層的替代操作,GAP對(duì)整個(gè)網(wǎng)絡(luò)在結(jié)構(gòu)上做正則化防止過(guò)擬合,直接剔除了全連接層中黑箱的特征,直接賦予了每個(gè)channel實(shí)際的類別意義。除此之外,使用GAP代替全連接層,可以實(shí)現(xiàn)任意圖像大小的輸入,而GAP對(duì)整個(gè)特征圖求平均值,也可以用來(lái)提取全局上下文信息,全局信息作為指導(dǎo)進(jìn)一步增強(qiáng)網(wǎng)絡(luò)性能。
2.4 Mix Pooling(混合池化)
論文地址:?http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.678.7068
2.4.1 定義
為了提高訓(xùn)練較大CNN模型的正則化性能,受Dropout(將一半激活函數(shù)隨機(jī)設(shè)置為0)的啟發(fā),Dingjun Yu等人提出了一種隨機(jī)池化Mix Pooling[2] 的方法,隨機(jī)池化用隨機(jī)過(guò)程代替了常規(guī)的確定性池化操作,在模型訓(xùn)練期間隨機(jī)采用了最大池化和平均池化方法,并在一定程度上有助于防止網(wǎng)絡(luò)過(guò)擬合現(xiàn)象。其定義如下:
2.4.2 總結(jié)
混合池化優(yōu)于傳統(tǒng)的最大池化和平均池化方法,并可以解決過(guò)擬合問(wèn)題來(lái)提高分類精度。此外該方法所需要的計(jì)算開(kāi)銷可忽略不計(jì),而無(wú)需任何超參數(shù)進(jìn)行調(diào)整,可被廣泛運(yùn)用于CNN。
2.5 Stochastic Pooling(隨機(jī)池化)
論文地址:?https://arxiv.org/pdf/1301.3557
代碼鏈接:?https://github.com/szagoruyko/imagine-nn
2.5.1 定義
隨機(jī)池化Stochastic Pooling[3] 是Zeiler等人于ICLR2013提出的一種池化操作。隨機(jī)池化的計(jì)算過(guò)程如下:
??? 先將方格中的元素同時(shí)除以它們的和sum,得到概率矩陣。
??? 按照概率隨機(jī)選中方格。
??? pooling得到的值就是方格位置的值。
假設(shè)特征圖中Pooling區(qū)域元素值如下(參考Stochastic Pooling簡(jiǎn)單理解):
則這時(shí)候的poolng值為1.5。使用stochastic pooling時(shí)(即test過(guò)程),其推理過(guò)程也很簡(jiǎn)單,對(duì)矩陣區(qū)域求加權(quán)平均即可。比如對(duì)上面的例子求值過(guò)程為為:
說(shuō)明此時(shí)對(duì)小矩形pooling后的結(jié)果為1.625。在反向傳播求導(dǎo)時(shí),只需保留前向傳播已經(jīng)記錄被選中節(jié)點(diǎn)的位置的值,其它值都為0,這和max-pooling的反向傳播非常類似。本小節(jié)參考Stochastic Pooling簡(jiǎn)單理解[4]。
2.5.2 總結(jié)
隨機(jī)池化只需對(duì)特征圖中的元素按照其概率值大小隨機(jī)選擇,即元素值大的被選中的概率也大,而不像max-pooling那樣,永遠(yuǎn)只取那個(gè)最大值元素,這使得隨機(jī)池化具有更強(qiáng)的泛化能力。
2.6 Power Average Pooling(冪平均池化)
論文地址:?http://proceedings.mlr.press/v32/estrach14.pdf
2.7 Detail-Preserving Pooling(DPP池化)
論文地址: Saeedan_Detail-Preserving_Pooling_in_CVPR_2018_paper.pdf
代碼鏈接: https://github.com/visinf/dpp
為了降低隱藏層的規(guī)模或數(shù)量,大多數(shù)CNN都會(huì)采用池化方式來(lái)減少參數(shù)數(shù)量,來(lái)改善某些失真的不變性并增加感受野的大小。由于池化本質(zhì)上是一個(gè)有損的過(guò)程,所以每個(gè)這樣的層都必須保留對(duì)網(wǎng)絡(luò)可判別性最重要的部分進(jìn)行激活。但普通的池化操作只是在特征圖區(qū)域內(nèi)進(jìn)行簡(jiǎn)單的平均或最大池化來(lái)進(jìn)行下采樣過(guò)程,這對(duì)網(wǎng)絡(luò)的精度有比較大的影響?;谝陨蠋c(diǎn),Faraz Saeedan等人提出一種自適應(yīng)的池化方法-DPP池化Detail-Preserving Pooling[6],該池化可以放大空間變化并保留重要的圖像結(jié)構(gòu)細(xì)節(jié),且其內(nèi)部的參數(shù)可通過(guò)反向傳播加以學(xué)習(xí)。DPP池化主要受**Detail-Preserving Image Downscaling[7]**的啟發(fā)。
DPP池化允許縮減規(guī)模以專注于重要的結(jié)構(gòu)細(xì)節(jié),可學(xué)習(xí)的參數(shù)控制著細(xì)節(jié)的保存量,此外,由于細(xì)節(jié)保存和規(guī)范化相互補(bǔ)充,DPP可以與隨機(jī)合并方法結(jié)合使用,以進(jìn)一步提高準(zhǔn)確率。
2.8 Local Importance Pooling(局部重要性池化)
論文地址: Gao_LIP_Local_Importance-Based_Pooling_ICCV_2019_paper.pdf
代碼鏈接: https://github.com/sebgao/LIP
CNN通常使用空間下采樣層來(lái)縮小特征圖,以實(shí)現(xiàn)更大的接受場(chǎng)和更少的內(nèi)存消耗,但對(duì)于某些任務(wù)而言,這些層可能由于不合適的池化策略而丟失一些重要細(xì)節(jié),最終損失模型精度。為此,作者從局部重要性的角度提出了局部重要性池化Local Importance Pooling[8],通過(guò)基于輸入學(xué)習(xí)自適應(yīng)重要性權(quán)重,LIP可以在下采樣過(guò)程中自動(dòng)增加特征判別功能。
Local Importance Pooling可以學(xué)習(xí)自適應(yīng)和可判別性的特征圖以匯總下采樣特征,同時(shí)丟棄無(wú)信息特征。這種池化機(jī)制能極大保留物體大部分細(xì)節(jié),對(duì)于一些細(xì)節(jié)信息異常豐富的任務(wù)至關(guān)重要。
2.9 Soft Pooling(軟池化)
論文地址:?https://arxiv.org/pdf/2101.00440
代碼鏈接:?https://github.com/alexandrosstergiou/SoftPool
現(xiàn)有的一些池化方法大都基于最大池化和平均池化的不同組合,而軟池化Soft Pooling[9] 是基于softmax加權(quán)的方法來(lái)保留輸入的基本屬性,同時(shí)放大更大強(qiáng)度的特征激活。與maxpooling不同,softpool是可微的,所以網(wǎng)絡(luò)在反向傳播過(guò)程中為每個(gè)輸入獲得一個(gè)梯度,這有利于提高訓(xùn)練效果。
SoftPool的計(jì)算流程如下:
- a. 特征圖透過(guò)滑動(dòng)視窗來(lái)框選局部數(shù)值
- b. 框選的局部數(shù)值會(huì)先經(jīng)過(guò)指數(shù)計(jì)算,計(jì)算出的值為對(duì)應(yīng)的特征數(shù)值的權(quán)重
- c. 將各自的特征數(shù)值與其相對(duì)應(yīng)的權(quán)重相乘
- d. 最后進(jìn)行加總
這樣的方式讓整體的局部數(shù)值都有所貢獻(xiàn),重要的特征占有較高的權(quán)重。比Max pooling(直接選擇最大值)、Average pooling (求平均,降低整個(gè)局部的特征強(qiáng)度) 能夠保留更多訊息。
??? SoftPool的數(shù)學(xué)定義如下:
計(jì)算特征數(shù)值的權(quán)重,其中R為框選的局部區(qū)域,a為特征數(shù)值
作為一種新穎地池化方法,SoftPool可以在保持池化層功能的同時(shí)盡可能減少池化過(guò)程中帶來(lái)的信息損失,更好地保留信息特征并因此改善CNN中的分類性能。大量的實(shí)驗(yàn)結(jié)果表明該算法的性能優(yōu)于原始的Avg池化與Max池化。隨著神經(jīng)網(wǎng)絡(luò)的設(shè)計(jì)變得越來(lái)越困難,而通過(guò)NAS等方法也幾乎不能大幅度提升算法的性能,為了打破這個(gè)瓶頸,從基礎(chǔ)的網(wǎng)絡(luò)層優(yōu)化入手,不失為一種可靠有效的精度提升手段。
?