PyTorch

F.avg_pool1d()

F.avg_pool1d()数据是三维输入:

  • input维度:(batch_size,channels,width)channel可以看成高度
  • kenerl维度:(一维:表示width的跨度)channel和输入的channel一致可以认为是矩阵的高度

假设kernel_size=2,则每俩列相加求平均,stride默认和kernel_size保持一致,越界则丢弃(下面表示1,2列和3,4列相加求平均):

  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()
  2. print(input)
  3. m = F.avg_pool1d(input,kernel_size=2)
  4. m
  5. tensor([[[1., 1., 1., 1., 1.],
  6. [1., 1., 1., 1., 1.],
  7. [0., 0., 0., 1., 1.],
  8. [1., 1., 1., 1., 1.],
  9. [1., 1., 1., 1., 1.]]])
  10. tensor([[[1.0000, 1.0000],
  11. [1.0000, 1.0000],
  12. [0.0000, 0.5000],
  13. [1.0000, 1.0000],
  14. [1.0000, 1.0000]]])

假设kenerl_size=3,表示前3列相加求平均,后面的不足3列丢弃:

  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()
  2. print(input)
  3. m = F.avg_pool1d(input,kernel_size=3)
  4. m
  5. tensor([[[1., 1., 1., 1., 1.],
  6. [1., 1., 1., 1., 1.],
  7. [0., 0., 0., 1., 1.],
  8. [1., 1., 1., 1., 1.],
  9. [1., 1., 1., 1., 1.]]])
  10. tensor([[[1.],
  11. [1.],
  12. [0.],
  13. [1.],
  14. [1.]]])
  15. 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()
  16. print(input)
  17. m = F.avg_pool1d(input,kernel_size=4)
  18. m
  19. tensor([[[1., 1., 1., 1., 1.],
  20. [1., 1., 1., 1., 1.],
  21. [0., 0., 0., 1., 1.],
  22. [1., 1., 1., 1., 1.],
  23. [1., 1., 1., 1., 1.]]])
  24. tensor([[[1.0000],
  25. [1.0000],
  26. [0.2500],
  27. [1.0000],
  28. [1.0000]]])

假设stride=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()
  2. print(input)
  3. m = F.avg_pool1d(input,kernel_size=2,stride=1)
  4. m
  5. tensor([[[1., 1., 1., 1., 1.],
  6. [1., 1., 1., 1., 1.],
  7. [0., 0., 0., 1., 1.],
  8. [1., 1., 1., 1., 1.],
  9. [1., 1., 1., 1., 1.]]])
  10. tensor([[[1.0000, 1.0000, 1.0000, 1.0000],
  11. [1.0000, 1.0000, 1.0000, 1.0000],
  12. [0.0000, 0.0000, 0.5000, 1.0000],
  13. [1.0000, 1.0000, 1.0000, 1.0000],
  14. [1.0000, 1.0000, 1.0000, 1.0000]]])
  15. 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()
  16. print(input)
  17. m = F.avg_pool1d(input,kernel_size=4,stride=1)
  18. m
  19. tensor([[[1., 1., 1., 1., 1.],
  20. [1., 1., 1., 1., 1.],
  21. [0., 0., 0., 1., 1.],
  22. [1., 1., 1., 1., 1.],
  23. [1., 1., 1., 1., 1.]]])
  24. tensor([[[1.0000, 1.0000],
  25. [1.0000, 1.0000],
  26. [0.2500, 0.5000],
  27. [1.0000, 1.0000],
  28. [1.0000, 1.0000]]])

F.avg_pool2d()

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卷积一致。

  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()
  2. print(input.size())
  3. print(input)
  4. m = F.avg_pool2d(input,kernel_size=(4,4))
  5. m
  6. torch.Size([1, 5, 5])
  7. tensor([[[1., 1., 1., 1., 1.],
  8. [1., 1., 1., 1., 1.],
  9. [0., 0., 0., 1., 1.],
  10. [1., 1., 1., 1., 1.],
  11. [1., 1., 1., 1., 1.]]])
  12. tensor([[[0.8125]]])
  13. 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()
  14. print(input.size())
  15. print(input)
  16. m = F.avg_pool2d(input,kernel_size=(4,4),stride=1)
  17. m
  18. torch.Size([1, 5, 5])
  19. tensor([[[1., 1., 1., 1., 1.],
  20. [1., 1., 1., 1., 1.],
  21. [0., 0., 0., 1., 1.],
  22. [1., 1., 1., 1., 1.],
  23. [1., 1., 1., 1., 1.]]])
  24. tensor([[[0.8125, 0.8750],
  25. [0.8125, 0.8750]]])

如果求列的平均kenerl=(1,5),此时默认stride=(1,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()
  2. print(input.size())
  3. print(input)
  4. m = F.avg_pool2d(input,kernel_size=(1,5))
  5. m
  6. torch.Size([1, 5, 5])
  7. tensor([[[1., 1., 1., 1., 1.],
  8. [1., 1., 1., 1., 1.],
  9. [0., 0., 0., 1., 1.],
  10. [1., 1., 1., 1., 1.],
  11. [1., 1., 1., 1., 1.]]])
  12. tensor([[[1.0000],
  13. [1.0000],
  14. [0.4000],
  15. [1.0000],
  16. [1.0000]]])

如果求行的平均kenerl=(5,1),此时默认stride=(5,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()
  2. print(input.size())
  3. print(input)
  4. m = F.avg_pool2d(input,kernel_size=(5,1))
  5. m
  6. torch.Size([1, 5, 5])
  7. tensor([[[1., 1., 1., 1., 1.],
  8. [1., 1., 1., 1., 1.],
  9. [0., 0., 0., 1., 1.],
  10. [1., 1., 1., 1., 1.],
  11. [1., 1., 1., 1., 1.]]])
  12. tensor([[[0.8000, 0.8000, 0.8000, 1.0000, 1.0000]]])

对于四维的数据,channel默认和输入一致:

  1. input=torch.randn(10,3,4,4)
  2. m=F.avg_pool2d(input,(4,4))
  3. print(m.size())
  4. torch.Size([10, 3, 1, 1])