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

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

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

2. 边界填充之零填充

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

2.1 Code

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

2.2 结果显示

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

3. 边界填充之常数填充

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

3.1 Code

 import torch

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

3.2 结果显示

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

4. 边界填充之镜像填充

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

4.1 Code

 import torch 

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

4.2 结果显示

5. 边界填充之复制填充

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

5.1 Code

 import torch

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

5.2 结果显示

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

6. 总结

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

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

Pytorch 四种边界填充方式(Padding)的更多相关文章

  1. ASP.NET MVC下的四种验证编程方式[续篇]

    在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注Validation ...

  2. ASP.NET MVC下的四种验证编程方式

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...

  3. thinkphp四种url访问方式详解

    本文实例分析了thinkphp的四种url访问方式.分享给大家供大家参考.具体分析如下: 一.什么是MVC thinkphp的MVC模式非常灵活,即使只有三个中和一个也可以运行. M -Model 编 ...

  4. ASP.NET MVC下的四种验证编程方式[续篇]【转】

    在<ASP.NET MVC下的四种验证编程方式> 一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式(“手工验证”.“标注ValidationAttribute特性”.“ ...

  5. ASP.NET MVC下的四种验证编程方式【转】

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效 性,我们将针对参数的验证成为Model绑 ...

  6. thinkPHP四种URL访问方式(二)

    原文:thinkPHP四种URL访问方式(二) 四.url的4种访问方式      1.PATHINFO 模式 -- (重点) http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/ ...

  7. python接口自动化(十)--post请求四种传送正文方式(详解)

    简介 post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先 ...

  8. 快速理解VirtualBox的四种网络连接方式

    VirtualBox中有4中网络连接方式: NAT Bridged Adapter Internal Host-only Adapter VMWare中有三种,其实他跟VMWare 的网络连接方式都是 ...

  9. python3+requests:post请求四种传送正文方式(详解)

    前言:post请求我在python接口自动化2-发送post请求详解(二)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等,可以参考Get,Post请求方式经典详解进行学习一下. 我 ...

随机推荐

  1. 绕过XSS过滤姿势总结

    0x01 弹窗关键字检测绕过 基本WAF都针对常用的弹窗函数做了拦截,如alert().prompt().confirm(),另外还有代码执行函数eval(),想要绕过去也比较简单,我们以alert( ...

  2. threejs 鼠标移动控制模型旋转

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. C#中分布式事务的超时处理问题

    事务是个很精妙的存在,我们在数据层.服务层.业务逻辑层等多处地方都会使用到. 在这里我只说下TransactionScope这个微软推荐使用的隐式事务.它是从Framework 2.0开始引入的一个事 ...

  4. PHP函数:fopen

    fopen()  - 打开文件或者 URL. 注意:array_key_exists() 仅仅搜索第一维的键. 多维数组里嵌套的键不会被搜索到. 说明: fopen ( string $filenam ...

  5. (第二篇)shell的简单了解

    Shell (类似开发工具) Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程 ...

  6. js的属性监听

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8">     <title ...

  7. OpenWrt-19.07.2 For HC5861(极路由3) /HiWiFi/Gee最新固件,极路由3刷openwrt

    OpenWrt For HiWiFi(HC5861) 自编译精减固件,极路由3自用固件 HC5861-uboot.bin v19.07.2 下载 支持 NTFS 读写 支持 Wi-Fi 5G 驱动 默 ...

  8. 狄慧201771010104《面向对象程序设计(java)》第十六周学习总结

    实验十六  线程技术 实验时间 2017-12-8 一.知识点总结: 1.程序与进程的概念 ‐程序是一段静态的代码,它是应用程序执行的蓝本. ‐进程是程序的一次动态执行,它对应了从代码加载.执行至执行 ...

  9. 如何将Superset嵌入后台系统之实践

    1. 前言 此次实践过程全属个人学习,我选择了在window下安装Superset,并进行嵌入后台系统实践.对此进行实践过程总结,实践成果分享给大家,供大家参考,如果你有更好的想法,欢迎留言交流. 2 ...

  10. JS的String()、toString()、valueOf()的一些隐秘特性

    toString()方法 要把一个值转换为一个字符串,最常用的就是,使用几乎每个值都有的toString()方法,这个方法唯一要做的就是返回相应值的字符串表现. 数值.布尔值.对象和字符串值(没错,每 ...