pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
F.avg_pool1d()數據是三維輸入
input維度: (batch_size,channels,width)channel可以看成高度
kenerl維度:(一維:表示width的跨度)channel和輸入的channel一致可以認為是矩陣的高度
假設kernel_size=2,則每倆列相加求平均,stride默認和kernel_size保持一致,越界則丟棄(下面表示1,2列和3,4列相加求平均)
input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float() print(input) m = F.avg_pool1d(input,kernel_size=2) m tensor([[[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [0., 0., 0., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]]) tensor([[[1.0000, 1.0000], [1.0000, 1.0000], [0.0000, 0.5000], [1.0000, 1.0000], [1.0000, 1.0000]]])
假設kenerl_size=3,表示前3列相加求平均,後面的不足3列丟棄
input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float() print(input) m = F.avg_pool1d(input,kernel_size=3) m tensor([[[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [0., 0., 0., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]]) tensor([[[1.], [1.], [0.], [1.], [1.]]]) input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float() print(input) m = F.avg_pool1d(input,kernel_size=4) m tensor([[[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [0., 0., 0., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]]) tensor([[[1.0000], [1.0000], [0.2500], [1.0000], [1.0000]]])
假設stride=1每次移動一個步伐
input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float() print(input) m = F.avg_pool1d(input,kernel_size=2,stride=1) m tensor([[[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [0., 0., 0., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]]) tensor([[[1.0000, 1.0000, 1.0000, 1.0000], [1.0000, 1.0000, 1.0000, 1.0000], [0.0000, 0.0000, 0.5000, 1.0000], [1.0000, 1.0000, 1.0000, 1.0000], [1.0000, 1.0000, 1.0000, 1.0000]]]) input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float() print(input) m = F.avg_pool1d(input,kernel_size=4,stride=1) m tensor([[[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [0., 0., 0., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]]) tensor([[[1.0000, 1.0000], [1.0000, 1.0000], [0.2500, 0.5000], [1.0000, 1.0000], [1.0000, 1.0000]]])
F.avg_pool2d()數據是四維輸入
input維度: (batch_size,channels,height,width)
kenerl維度:(二維:表示width的跨度)channel和輸入的channle一致,如果數據是三維,則channel為1.(如果隻寫一個數n,kenerl=(n,n))
stride默認和kenerl一致,這是個二維的,所以在height和width上均和kenerl一致,越界同樣丟棄。
跟cnn卷積一致
input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float() print(input.size()) print(input) m = F.avg_pool2d(input,kernel_size=(4,4)) m torch.Size([1, 5, 5]) tensor([[[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [0., 0., 0., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]]) tensor([[[0.8125]]]) input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float() print(input.size()) print(input) m = F.avg_pool2d(input,kernel_size=(4,4),stride=1) m torch.Size([1, 5, 5]) tensor([[[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [0., 0., 0., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]]) tensor([[[0.8125, 0.8750], [0.8125, 0.8750]]])
如果求列的平均kenerl=(1,5),此時默認stride=(1,5)
input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float() print(input.size()) print(input) m = F.avg_pool2d(input,kernel_size=(1,5)) m torch.Size([1, 5, 5]) tensor([[[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [0., 0., 0., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]]) tensor([[[1.0000], [1.0000], [0.4000], [1.0000], [1.0000]]])
如果求行的平均kenerl=(5,1),此時默認stride=(5,1),用卷積的概念取思考
input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float() print(input.size()) print(input) m = F.avg_pool2d(input,kernel_size=(5,1)) m torch.Size([1, 5, 5]) tensor([[[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [0., 0., 0., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]]) tensor([[[0.8000, 0.8000, 0.8000, 1.0000, 1.0000]]])
對於四維的數據,channel默認和輸入一致
input=torch.randn(10,3,4,4) m=F.avg_pool2d(input,(4,4)) print(m.size()) torch.Size([10, 3, 1, 1])
補充:PyTorch中AdaptiveAvgPool函數解析
自適應池化(AdaptiveAvgPool1d):
對輸入信號,提供1維的自適應平均池化操作 對於任何輸入大小的輸入,可以將輸出尺寸指定為H*W,但是輸入和輸出特征的數目不會變化。
torch.nn.AdaptiveAvgPool1d(output_size) #output_size:輸出尺寸
對輸入信號,提供1維的自適應平均池化操作 對於任何輸入大小的輸入,可以將輸出尺寸指定為H*W,但是輸入和輸出特征的數目不會變化。
# target output size of 5 m = nn.AdaptiveAvgPool1d(5) input = autograd.Variable(torch.randn(1, 64, 8)) output = m(input)
自適應池化(AdaptiveAvgPool2d):
class torch.nn.AdaptiveAvgPool2d(output_size)
對輸入信號,提供2維的自適應平均池化操作 對於任何輸入大小的輸入,可以將輸出尺寸指定為H*W,但是輸入和輸出特征的數目不會變化。
參數:
output_size: 輸出信號的尺寸,可以用(H,W)表示H*W的輸出,也可以使用耽擱數字H表示H*H大小的輸出
# target output size of 5x7 m = nn.AdaptiveAvgPool2d((5,7)) input = autograd.Variable(torch.randn(1, 64, 8, 9)) # target output size of 7x7 (square) m = nn.AdaptiveAvgPool2d(7) input = autograd.Variable(torch.randn(1, 64, 10, 9)) output = m(input)
自適應池化的數學解釋:
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- PyTorch零基礎入門之構建模型基礎
- pytorch下的unsqueeze和squeeze的用法說明
- pytorch中常用的乘法運算及相關的運算符(@和*)
- Pytorch深度學習之實現病蟲害圖像分類
- pytorch_detach 切斷網絡反傳方式