当前位置: 首页 > news >正文

神经网络的卷积操作中不同的卷积核和不同的填充获得同样的输出

神经网络的卷积操作中不同的卷积核和不同的填充获得同样的输出

nn.Conv2d(in_channels,out_channels,kernel size, stride=l,
padding-0,dilation=l,groups=l,bias=True,padding_mode='zeros',device=None, dtype=None)

nn.Conv2d卷积输人数据的格式是(batch_size,C,H,W),其中 batch_size 是指在一次迭代中输人网络的数据量; C代表输入数据的通道数(channel); H和W分别代表输人数据的长(Height)和宽(Width)。根据不同的需求,需要给Con2d设定不同的参数,下面将对参数的设置方式进行介绍。首先定义卷积操作中各参数对应的符号如下。
H i n / H o u t H_{in}/H_{out} Hin/Hout:代表输入/输出特征图长度,$ W i n / W o u t W_{in}/W_{out} Win/Wout代表输入/输出特征图宽度
KH 代表卷积核的长度、KW 代表卷积核的宽度。
PH 代表长度方向补0的数目、PW 代表宽度方向补0的数目。
SH 代表长度方向卷积步长、SW 代表宽度方向卷积步长。
DH 代表长度方向空洞率、DW 代表宽度方向空洞率。
C i n C_{in} Cin代表输入特征图的通道数、 C o u t C_{out} Cout代表输出特征图的通道数。根据上面的符号设定,可以将特征图的输入和输出尺寸的关系表示如下,floor 向下取整:

H out  = f l o o r ( H in  + 2 × P H − D H × ( K H − 1 ) − 1 S H + 1 ) W out  = f l o o r ( W in  + 2 × P W − D W × ( K W − 1 ) − 1 S W + 1 ) \begin{gathered} H_{\text {out }}=floor(\frac{H_{\text {in }}+2 \times \mathrm{PH}-\mathrm{DH} \times(\mathrm{KH}-1)-1}{\mathrm{SH}}+1 )\\ W_{\text {out }}=floor(\frac{W_{\text {in }}+2 \times \mathrm{PW}-\mathrm{DW} \times(\mathrm{KW}-1)-1}{\mathrm{SW}}+1) \end{gathered} Hout =floor(SHHin +2×PHDH×(KH1)1+1)Wout =floor(SWWin +2×PWDW×(KW1)1+1)

上面的公式总结了 Conv2d 的输入和输出特征图的长宽尺寸计算关系,根据需求选择不同的参数搭配。此外,还需要指定 Conv2d 的输入和输出的通道数。

下面的示例实现了输入和输出特征图长宽相同的卷积计算。根据卷积的计算方式可知,为了保证输入和输出特征图的长宽一致,可以使用步长为1的卷积,所以SH和SW 均设置为1。对于不同的卷积核尺寸(KH,KW),需要计算出对应的补0数目(PH,PW),它们的对应关系如下:

P H = i n t ( K H 2 ) P W = i n t ( K W 2 ) \begin{gathered} \mathrm{PH}=int(\frac{\mathrm{KH}}{2})\\ \mathrm{PW}=int(\frac{\mathrm{KW}}{2}) \end{gathered} PH=int(2KH)PW=int(2KW)

下面将卷积核尺寸 k_size 分别设置为1、3、5和7,这几种卷积核尺寸是最为常用的。所有卷积过程的步长 stride 均设置为1,根据上式计算得到的补0数目分别为0,1,2,3。下面的代码对计算进行了验证,运行后将输出4行torch.Size([1,3,300,400]),证明卷积后输出特征图维度和输入相同。

import torch
import torch.nn as nn
data_in = torch.randn(size=(1, 3, 400, 400))
print(data_in.size())
# 输出结果
k_size = [1, 3, 5, 7]
stride = [1, 1, 1, 1]
pad = [0, 1, 2, 3]
# 输入和输出通道数均设为3
ch_in = 3
ch_out = 3for i in range(len(k_size)):conv2d = nn.Conv2d(ch_in, ch_out, k_size[i], stride[i], pad[i])print(conv2d(data_in).size())

输出:

torch.Size([1, 3, 400, 400])
torch.Size([1, 3, 400, 400])
torch.Size([1, 3, 400, 400])
torch.Size([1, 3, 400, 400])

相关文章:

  • 【Linux】进程信号2——阻塞信号,捕捉信号
  • Serverless如何赋能餐饮行业数字化?乐凯撒思变之道
  • C++ Day1
  • Python 用相对名称来导入包中的子模块
  • 怎么添加网页到桌面快捷方式?
  • 深度学习500问——Chapter11:迁移学习(3)
  • CP AUTOSAR标准之LSduRouter(AUTOSAR_CP_SWS_LSduRouter)
  • Open WebUI的SearXNG网络搜索配置【403报错解决方法】
  • 我又挖到宝了!小米、352、希喂宠物空气净化器除毛能力PK
  • MySQL WHERE子句的使用和优化方法
  • 模方4.0导出osgb模型一直提示正在运行任务,请取消所有任务后再尝试?
  • Python初体验
  • iOS Category
  • rsa加签验签C#和js、java、微信小程序互通
  • 【MYSQL】解决数据库Too many connections
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • CSS盒模型深入
  • ES6系统学习----从Apollo Client看解构赋值
  • extract-text-webpack-plugin用法
  • Java超时控制的实现
  • JS专题之继承
  • LeetCode29.两数相除 JavaScript
  • MQ框架的比较
  • oschina
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • supervisor 永不挂掉的进程 安装以及使用
  • Theano - 导数
  • vue的全局变量和全局拦截请求器
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 初识 beanstalkd
  • 读懂package.json -- 依赖管理
  • 分布式事物理论与实践
  • 微信公众号开发小记——5.python微信红包
  • 线性表及其算法(java实现)
  • 协程
  • ionic异常记录
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​zookeeper集群配置与启动
  • # include “ “ 和 # include < >两者的区别
  • #考研#计算机文化知识1(局域网及网络互联)
  • (4)事件处理——(7)简单事件(Simple events)
  • (vue)页面文件上传获取:action地址
  • (不用互三)AI绘画工具应该如何选择
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (计算机网络)物理层
  • (离散数学)逻辑连接词
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (五)Python 垃圾回收机制
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • @Bean注解详解
  • @Not - Empty-Null-Blank
  • [AIGC] Spring Interceptor 拦截器详解