【Pytorch神经网络理论篇】 13 深层卷积神经网络介绍+池化操作+深层卷积神经网络实战
1 深層卷積神經網絡概述
1.1 深層卷積神經網絡模型結構圖
1.1.1 深層卷積神經網絡的正向結構構成剖析
- 輸入層,將每個像素作為一個特征節點輸入網絡。
- 卷積層:由多個濾波器組合而成。
- 池化層:將卷積結果降維,對卷積后的特征圖進行降維處理,得到更為顯著的特征,池化層會對特征圖中的數據作最大值/均值處理,在保留特征圖原有的特征的基礎上,減少后續運算量。
- 全局平均池化層:對生成的特征圖取全局平均值,該層可以用全連接網絡代替。
- 輸出層:網絡需要將數據分成幾類,該層就有幾個輸出節點,每個輸出節點代表屬于當前樣本的該類型的概率。
1.2 卷積神經網絡的反向傳播的步驟
(1)將誤差傳到前面一層,對卷積操作的反向求導時、需要先將生成的特征圖做一次padding,再與轉置后的卷積核做一次卷積操作,即得到輸入端的誤美,叢而實現了誤差的反向傳遞。
(2)根據當前的誤差對應的學習參數表達式來算出其需要更新的差值,與全連接網絡中的反向求導是一樣的,仍然是使用鏈式求縣法則,找到使誤差最小化的橫度,再配合學習率算出更新的差值。
2 池化操作
2.1 池化操作的概述
2.1.1 池化操作的作用
主要目的降維,使得保持原有的特征基礎上最大限度的降低數組大小。
2.1.2 池化與卷積對比
池化:只關心濾波器的尺寸,主要將濾波器映射區內的像素點取平均值或者最大值。
卷積:對應位置上的像素點的乘積。
2.2 池化操作的分類
2.2.1 均值池化
在圖片上的對應出濾波器大小的區域,對于其所有像素點取均值,對背景信息更敏感。
2.2.2 最大池化
在圖片上的對應出濾波器大小的區域,對于其所有像素點取最大值,對紋理特征更敏感。
2.2 池化函數接口
2.2.1 平均池化函數
nn.AvgPool2d——二維平均池化操作https://blog.csdn.net/qq_50001789/article/details/120537858
torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True, divisor_override=None)
- kernel_size:池化核的尺寸大小
- stride:窗口的移動步幅,默認與kernel_size大小一致
- padding:在兩側的零填充寬度大小
- ceil_mode:設為True時,在計算輸出形狀的過程中采用向上取整的操作,否則,采用向下取整
- count_include_pad:布爾類型,當為True時,將在平均池化計算中包括零填充,否則,不包括零填充
- divisor_override:如果被指定,則除數會被代替成divisor_override。換句話說,如果不指定該變量,則平均池化的計算過程其實是在一個池化核內,將元素相加再除以池化核的大小,也就是divisor_override默認為池化核的高×寬;如果該變量被指定,則池化過程為將池化核內元素相加再除以divisor_override。
2.2.2 最大池化函數
class torch.nn.MaxPool1d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)- kernel_size(int or tuple) - max pooling的窗口大小
- stride(int or tuple, optional) - max pooling的窗口移動的步長。默認值是kernel_size
- padding(int or tuple, optional) - 輸入的每一條邊補充0的層數
- dilation(int or tuple, optional) – 一個控制窗口中元素步幅的參數
- return_indices - 如果等于True,會返回輸出最大值的序號,對于上采樣操作會有幫助
- ceil_mode - 如果等于True,計算輸出信號大小的時候,會使用向上取整,代替默認的向下取整的操作
- kernel_size(int or tuple) - max pooling的窗口大小
- stride(int or tuple, optional) - max pooling的窗口移動的步長。默認值是kernel_size
- padding(int or tuple, optional) - 輸入的每一條邊補充0的層數
- dilation(int or tuple, optional) – 一個控制窗口中元素步幅的參數
- return_indices - 如果等于True,會返回輸出最大值的序號,對于上采樣操作會有幫助
- ceil_mode - 如果等于True,計算輸出信號大小的時候,會使用向上取整,代替默認的向下取整的操作
2.3 池化函數的實戰
2.3.1 定義輸入變量 --- pool2d.py(第1部分)
import torch### 1.1 定義輸入變量 img = torch.tensor([[[0.0,0.0,0.0,0.0],[1.0,1.0,1.0,1.0],[2.0,2.0,2.0,2.0],[3.0,3.0,3.0,3.0]],[[4.0,4.0,4.0,4.0],[5.0,5.0,5.0,5.0],[6.0,6.0,6.0,6.0],[7.0,7.0,7.0,7.0]] ]).reshape([1,2,4,4]) # 定義張量,模擬輸入圖像 print(img) # 輸出結果 print(img[0][0]) # 輸出第1通道的內容# 輸出:
# tensor([[0, 0, 0, 0],
# ? ? ? ? [1, 1, 1, 1],
# ? ? ? ? [2, 2, 2, 2],
# ? ? ? ? [3, 3, 3, 3]])
print(img[0][1]) # 輸出第2通道的內容
# 輸出:
# tensor([[4, 4, 4, 4],
# ? ? ? ? [5, 5, 5, 5],
# ? ? ? ? [6, 6, 6, 6],
# ? ? ? ? [7, 7, 7, 7]])
2.3.2 定義池化操作并計算 --- pool2d.py(第2部分)
### 定義池化操作 pooling = torch.nn.functional.max_pool2d(img,kernel_size=2) print("pooling :",pooling) # 輸出最大池化結果(池化區域為2,步長為2),pooling1 = torch.nn.functional.max_pool2d(img,kernel_size=2,stride=1) # 不補0 print("pooling1 :",pooling1) # 不補0,輸出最大池化結果(池化區域為2X2,步長為1),生成3X3的矩陣pooling2 = torch.nn.functional.avg_pool2d(img,kernel_size=2,stride=1,padding=1)# 先執行補0,再進行池化 print("pooling2 :",pooling2) # 先執行補0,輸出平均池化結果(池化區域為4X4,步長為1),生成3X3的矩陣# 全局池化操作,使用一個與原來輸入相同尺寸的池化區域來進行池化操作,一般在最后一層用于圖像表達 pooling3 = torch.nn.functional.avg_pool2d(img,kernel_size=4) print("pooling3 :",pooling3) # 輸出平均池化結果(池化區域為4,步長為4)# 對于輸入的張量計算兩次均值,可得平均池化結果 m1 = img.mean(3) print("第1次均值結果",m1) print("第2次均值結果",m1.mean(2)) ### 對于輸入數據進行兩次平均值操作時,可以看到在輸入數據進行兩次平均值計算的結果與pooling3的數值是一直的,即為等價pooling : tensor([[[[1., 1.],
? ? ? ? ? [3., 3.]],
? ? ? ? ?[[5., 5.],
? ? ? ? ? [7., 7.]]]])
pooling1 : tensor([[[[1., 1., 1.],
? ? ? ? ? [2., 2., 2.],
? ? ? ? ? [3., 3., 3.]],
? ? ? ? ?[[5., 5., 5.],
? ? ? ? ? [6., 6., 6.],
? ? ? ? ? [7., 7., 7.]]]])
pooling2 : tensor([[[[0.0000, 0.0000, 0.0000, 0.0000, 0.0000],
? ? ? ? ? [0.2500, 0.5000, 0.5000, 0.5000, 0.2500],
? ? ? ? ? [0.7500, 1.5000, 1.5000, 1.5000, 0.7500],
? ? ? ? ? [1.2500, 2.5000, 2.5000, 2.5000, 1.2500],
? ? ? ? ? [0.7500, 1.5000, 1.5000, 1.5000, 0.7500]],
? ? ? ? ?[[1.0000, 2.0000, 2.0000, 2.0000, 1.0000],
? ? ? ? ? [2.2500, 4.5000, 4.5000, 4.5000, 2.2500],
? ? ? ? ? [2.7500, 5.5000, 5.5000, 5.5000, 2.7500],
? ? ? ? ? [3.2500, 6.5000, 6.5000, 6.5000, 3.2500],
? ? ? ? ? [1.7500, 3.5000, 3.5000, 3.5000, 1.7500]]]])
pooling3 : tensor([[[[1.5000]],?[[5.5000]]]])
第1次均值結果 tensor([[[0., 1., 2., 3.],
? ? ? ? ?[4., 5., 6., 7.]]])
第2次均值結果 tensor([[1.5000, 5.5000]])
2.3.3 代碼總覽 --- pool2d.py
import torch### 1.1 定義輸入變量 img = torch.tensor([[[0.0,0.0,0.0,0.0],[1.0,1.0,1.0,1.0],[2.0,2.0,2.0,2.0],[3.0,3.0,3.0,3.0]],[[4.0,4.0,4.0,4.0],[5.0,5.0,5.0,5.0],[6.0,6.0,6.0,6.0],[7.0,7.0,7.0,7.0]] ]).reshape([1,2,4,4]) # 定義張量,模擬輸入圖像 print(img) # 輸出結果 print(img[0][0]) # 輸出第1通道的內容 # 輸出: # tensor([[0, 0, 0, 0], # [1, 1, 1, 1], # [2, 2, 2, 2], # [3, 3, 3, 3]]) print(img[0][1]) # 輸出第2通道的內容 # 輸出: # tensor([[4, 4, 4, 4], # [5, 5, 5, 5], # [6, 6, 6, 6], # [7, 7, 7, 7]])### 定義池化操作 pooling = torch.nn.functional.max_pool2d(img,kernel_size=2) print("pooling :",pooling) # 輸出最大池化結果(池化區域為2,步長為2),pooling1 = torch.nn.functional.max_pool2d(img,kernel_size=2,stride=1) # 不補0 print("pooling1 :",pooling1) # 不補0,輸出最大池化結果(池化區域為2X2,步長為1),生成3X3的矩陣pooling2 = torch.nn.functional.avg_pool2d(img,kernel_size=2,stride=1,padding=1)# 先執行補0,再進行池化 print("pooling2 :",pooling2) # 先執行補0,輸出平均池化結果(池化區域為4X4,步長為1),生成3X3的矩陣# 全局池化操作,使用一個與原來輸入相同尺寸的池化區域來進行池化操作,一般在最后一層用于圖像表達 pooling3 = torch.nn.functional.avg_pool2d(img,kernel_size=4) print("pooling3 :",pooling3) # 輸出平均池化結果(池化區域為4,步長為4)# 對于輸入的張量計算兩次均值,可得平均池化結果 m1 = img.mean(3) print("第1次均值結果",m1) print("第2次均值結果",m1.mean(2)) ### 對于輸入數據進行兩次平均值操作時,可以看到在輸入數據進行兩次平均值計算的結果與pooling3的數值是一直的,即為等價3 深層卷積神經網絡實戰
總結
以上是生活随笔為你收集整理的【Pytorch神经网络理论篇】 13 深层卷积神经网络介绍+池化操作+深层卷积神经网络实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript 打印结果时多出一
- 下一篇: mongo java 日期,Java 8