zoukankan      html  css  js  c++  java
  • Pytorch 四种边界填充方式(Padding)

    1. 选用卷积之前填充(强烈建议)

       小生非常推荐大家不再使用卷积所带的填充方式,虽然那种方式简单,但缺陷太多。① 不能根据自己的需要来决定上与下填充不等的边界,左右填充不等的边界;② 边界填充零容易出现伪影的情况,对实验效果影响比较大。将卷积中的Padding方式换为卷积前Padding效果会更佳,以下列了四种填充方式(零填充,常数填充,镜像填充,复制填充)。

      小生就不赘言了,客官请下观~~

    2. 边界填充之零填充

      零填充是常数填充的特例,这种填充方式和卷积中的填充的类似,都是填充零元素,不过这个比卷积填充更灵活,我们可以根据自己的需要再上下左右分别填充相应的0元素。

    2.1 Code

     1 import torch
     2 import torch.nn as nn
     3 
     4 
     5 # ==================  零填充  ==================
     6 def conv_ZeroPad2d():
     7     # 定义一个四维数据:(batchSize, channel, height, width)
     8     data = torch.tensor([[[[1, 2, 3],
     9                            [4, 5, 6],
    10                            [7, 8, 9]]]]).float()
    11     print("data_shape: ", data.shape)
    12     print("data: ", data)
    13     # 零填充,在边界填充n个0,分别为:左、右、上、下
    14     ZeroPad = nn.ZeroPad2d(padding=(1, 2, 1, 2))
    15     data1 = ZeroPad(data)
    16     print("data1_shape: ", data1.shape)
    17     print("data1: ", data1)
    18 
    19 
    20 if __name__ == '__main__':
    21     conv_ZeroPad2d()

    2.2 结果显示

        可以看到,分别在左边填充1列0元素,右边填充2列0元素,上边填充1列0元素,下边填充2列0元素。

              

     3. 边界填充之常数填充

      常数填充方式, 可以根据自己的需要在上下左右分别填充指定的元素。

    3.1 Code

     1 import torch
     2 
     3 
     4 # ================== 常量填充 ==================
     5 def conv_ConstantPad2d():
     6     # 定义一个四维数据:(batchSize, channel, height, width)
     7     data = torch.tensor([[[[1, 2, 3],
     8                            [4, 5, 6],
     9                            [7, 8, 9]]]]).float()
    10     print("data_shape: ", data.shape)
    11     print("data: ", data)
    12     # 用给定的纸填充,0填充是常亮填充的特列,分别为:左、右、上、下
    13     ConstantPad = nn.ConstantPad2d(padding=(1, 2, 1, 2), value=10)
    14     data1 = ConstantPad(data)
    15     print("data1_shape: ", data1.shape)
    16     print("data1: ", data1)
    17 
    18 
    19 if __name__ == '__main__':
    20     conv_ConstantPad2d()

    3.2 结果显示

      可以看到,分别在左边填充1列10元素,右边填充2列10元素,上边填充1列10元素,下边填充2列10元素。

           

    4. 边界填充之镜像填充

       镜像填充方式是根据对称性来填充的。

    4.1 Code

     1 import torch 
     2 
     3 
     4 # ================== 镜像填充 ==================
     5 def conv_ReflectionPad2d():
     6     # 定义一个四维数据:(batchSize, channel, height, width)
     7     data = torch.tensor([[[[1, 2, 3],
     8                            [4, 5, 6],
     9                            [7, 8, 9]]]]).float()
    10     print("data_shape: ", data.shape)
    11     print("data: ", data)
    12     # 复制边界n次,分别为:左、右、上、下
    13     ReflectionPad = nn.ReflectionPad2d(padding=(1, 2, 1, 2))
    14     data1 = ReflectionPad(data)
    15     print("data1_shape: ", data1.shape)
    16     print("data1: ", data1)
    17 
    18 
    19 if __name__ == '__main__':
    20     conv_ReflectionPad2d()

    4.2 结果显示

     

    5. 边界填充之复制填充

      复制填充方式,小生非常推荐。复制填充是复制最外边界的元素来填充,这样填充的元素与边界元素相近,对实验结果的影响会降到最小。

    5.1 Code

     1 import torch
     2 
     3 
     4 # ================== 重复填充 ==================
     5 def conv_ReplicationPad2d():
     6     # 定义一个四维数据:(batchSize, channel, height, width)
     7     data = torch.tensor([[[[1, 2, 3],
     8                            [4, 5, 6],
     9                            [7, 8, 9]]]]).float()
    10     print("data_shape: ", data.shape)
    11     print("data: ", data)
    12     # 用对称位置的像素来填充,分别为:左、右、上、下
    13     ReplicationPad = nn.ReplicationPad2d(padding=(1, 2, 1, 2))
    14     data1 = ReplicationPad(data)
    15     print("data1_shape: ", data1.shape)
    16     print("data1: ", data1)
    17 
    18 
    19 if __name__ == '__main__':
    20     conv_ReplicationPad2d()

    5.2 结果显示

       可以看到,填充的元素与最外边界的元素相同。

      

     6. 总结

      努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

      如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)!

  • 相关阅读:
    Windows下 flex + bison 小例子
    MongoDB 启动基于角色的登录认证功能
    多线程中数的原子性加减
    pymongo.errors.OperationFailure: Authentication failed.
    Windows 中 . 和 .. 的区别
    CString常用函数
    string常用函数
    回调函数 小例子
    VS2008兼容安装
    测试代码的执行时间魔法方法%time和%timeit
  • 原文地址:https://www.cnblogs.com/haifwu/p/12866319.html
Copyright © 2011-2022 走看看