39_上下采样、MaxPool2d、AvgPool2d、ReLU案例、二维最大池化层和平均池化层、填充和步幅、多通道
1.34.PyTorch Down/up sample (pytorch上下采樣)
1.34.1. 首先介紹下采樣
1.34.1.1. MaxPool2d案例
1.34.1.2. AvgPool2d案例
1.34.2. F.interpolate案例(上采樣)
1.34.3.ReLU案例
1.34.4.Pooling
1.34.4.1.二維最大池化層和平均池化層
1.34.4.2.填充和步幅
1.34.4.3.多通道
1.34.4.4.小結(jié)
1.34.PyTorch Down/up sample (pytorch上下采樣)
pooling(池化)層原則上為采樣操作,與upsample(上采樣)不同的是,pooling為下采樣操作,即將feature map變小的操作。
那么下采樣和上采樣是什么含義呢?
1.34.1.首先介紹下采樣
如圖所示,將圖片上的矩陣由右變向左的操作即為下采樣。上圖可見是每隔1個元素取一個樣,向右方向取了A和B、向下方向取了A和C。這樣完成了44矩陣向22矩陣的轉(zhuǎn)化。
而在卷積神經(jīng)網(wǎng)絡中,以max pooling操作為例:
過程如下
Kernel size為2*2的小窗口,在第一個框內(nèi)取了最大值6后,向右方向進行了步長為2的移動,在2、4、7、8四個值中取了最大值8。同理再進行向下移動。
與max pooling對應的還有Avg pooling,即取平均數(shù)。
比較簡單,這里不再贅述。
那么在pytorch中如何完成pooling(下采樣)操作。
1.34.1.1.MaxPool2d案例
# -*- coding: UTF-8 -*-import torch import torch.nn as nn# 先定義x x = torch.rand(1, 16, 28, 28) # 括號內(nèi)第一個參數(shù)是:窗口的大小,第二個是移動的步長距離 layer = nn.MaxPool2d(2, stride=2) out1 = layer(x) print(out1.size()) """輸出結(jié)果: torch.Size([1, 16, 14, 14]) """1.34.1.2.AvgPool2d案例
# -*- coding: UTF-8 -*-import torch import torch.nn as nn# 先定義x x = torch.rand(1, 16, 28, 28) # 括號內(nèi)第一個參數(shù)是:窗口的大小,第二個是移動的步長距離 layer = nn.AvgPool2d(2, stride=2) # 進行Avg pooling的計算 out2 = layer(x) print(out2.size()) """ 輸出結(jié)果: torch.Size([1, 16, 14, 14]) """1.34.2.F.interpolate案例(上采樣)
同樣向上采樣的過程為:
如上圖從左至右的過程為上采樣過程。上圖將原數(shù)據(jù)進行復制即得到新的數(shù)據(jù)。
在PyTorch中,代碼為:
Bias和input channel不發(fā)生改變,原來的2828放大兩倍至5656
1.34.3.ReLU案例
下面再簡單扼要的介紹ReLU的效果:
之前有介紹過ReLU函數(shù)時將低于某個閾值的輸出全部歸為0,高于閾值的線性輸出。
上圖是使用效果圖。將黑色區(qū)塊全部取消:
1.34.4.Pooling
一個典型的訓練神經(jīng)網(wǎng)絡的步驟是:
- 定義一個包含一組待學習的參數(shù)的神經(jīng)網(wǎng)絡
- 將數(shù)據(jù)輸入到神經(jīng)網(wǎng)絡中并進行前向傳播
- 根據(jù)損失函數(shù)計算輸出結(jié)果與目標值之間的差距
- 進行梯度反向傳播到各個參數(shù)
- 更新網(wǎng)絡參數(shù),典型的更新方式是:weight=weight-learning_rate*gradinet
實際圖像里,我們感興趣的物體不會總出現(xiàn)在固定位置:即使我們連續(xù)拍攝同一個物體也極有可能出現(xiàn)像素位置上的偏移。這會導致同一個邊緣對應的輸出可能出現(xiàn)在卷積輸出Y中的不同位置,進而對后面的模式識別造成不便。
Pooling層,它的提出是為了緩解卷積層對位置的過度敏感性。
1.34.4.1.二維最大池化層和平均池化層
同卷積層一樣,池化層每次對輸入數(shù)據(jù)的一個固定形狀窗口(又稱池化窗口)中的元素計算輸出。不同于卷積層里計算輸入和核的互相關性,池化層直接計算池化窗口內(nèi)元素的最大值或者平均值。該運算也分別叫做最大池化或平均池化。在二維最大池化中,池化窗口從輸入數(shù)組的最左上方開始,按從左往右、從上往下的順序,依次在輸入數(shù)組上滑動。當池化窗口滑動到某一位置時,窗口中的輸入子數(shù)組的最大值即輸出數(shù)組中相應位置的元素。
圖5.6展示了池化窗口形狀為2 × 2的最大池化,陰影部分為第一個輸出元素及其計算所使用的輸入元素。輸出數(shù)組的高和寬分別為2,其中的4個元素由取最大值運算max得出:
二維平均池化的工作原理與二維最大池化類似,但將最大運算符替換成平均運算符。
1.34.4.2.填充和步幅
同卷積層一樣,池化層也可以在輸入的高和寬兩側(cè)的填充并調(diào)整窗口的移動步幅來改變輸出形狀。池化層填充和步幅與卷積層填充和步幅的工作機制一樣。我們將通過nn模塊里的二維最大池化層MaxPool2d來演示池化層填充和步幅的工作機制。我們先構造一個形狀為(1,1,4,4)的輸入數(shù)據(jù),前兩個維度分別是批量和通道。
X = torch.arange(16, dtype=torch.float).view((1, 1, 4, 4)) X “”” 輸出結(jié)果: tensor([[[[ 0., 1., 2., 3.],[ 4., 5., 6., 7.],[ 8., 9., 10., 11.],[12., 13., 14., 15.]]]]) “””默認情況下,MaxPool2d實例里步幅和池化窗口形狀相同。下面使用形狀為(3,3)的池化窗口,默認獲得形狀為(3,3)的步幅。
pool2d = nn.MaxPool2d(3) pool2d “”” 輸出結(jié)果: tensor([[[[ 5., 7.],[13., 15.]]]]) “””當然,我們也可以指定非正方形的池化窗口,并分別指定高和寬上的填充和步幅。
pool2d = nn.MaxPool2d((2, 4), padding=(1,2), stride=(2, 3)) pool2d(X) “”” 輸出: tensor([[[[ 1., 3.],[ 9., 11.],[13., 15.]]]]) “””1.34.4.3.多通道
在處理多通道輸入數(shù)據(jù)時,池化層對每個輸入通道分別池化,而不是像卷積層那樣將各通道的輸入按通道相加。這意味著池化層的輸出通道數(shù)與輸入通道數(shù)相等。下面將數(shù)組X和X+1在通道維上連結(jié)來構造通道數(shù)為2的輸入。
X = torch.cat((X, X + 1), dim = 1) X “”” 輸出: tensor([[[[ 0., 1., 2., 3.],[ 4., 5., 6., 7.],[ 8., 9., 10., 11.],[12., 13., 14., 15.]],[[ 1., 2., 3., 4.],[ 5., 6., 7., 8.],[ 9., 10., 11., 12.],[13., 14., 15., 16.]]]]) “””池化后,我們發(fā)現(xiàn)輸出通道數(shù)仍然是2。
pool2d = nn.MaxPool2d(3, padding=1, stride=2) pool2d(X) “”” 輸出: tensor([[[[ 5., 7.],[13., 15.]],[[ 6., 8.],[14., 16.]]]]) “””1.34.4.4.小結(jié):
?最大池化和平均池化分別取池化窗口中輸入元素的最大值和平均值作為輸出。
?池化層的一個主要作用是緩解卷積層對位置的過度敏感性。
?可以指定池化層的填充和步幅。
?池化層的輸出通道數(shù)跟輸入通道數(shù)相同。
總結(jié)
以上是生活随笔為你收集整理的39_上下采样、MaxPool2d、AvgPool2d、ReLU案例、二维最大池化层和平均池化层、填充和步幅、多通道的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分红是怎么算的 不懂的一定要多看看
- 下一篇: 40_pytorch Batch Nor