卷积层的输出

卷积层的输出

flyfish

在卷积神经网络中,卷积层的输出尺寸计算主要依赖于输入尺寸、卷积核尺寸、步幅(stride)和填充(padding)。

经典的卷积神经网络模型 - AlexNet

标准卷积

以AlexNet第一个卷积层作为说明

import torch
import torch.nn as nn

class AlexNet(nn.Module):
    def __init__(self, num_classes=1000):
        super(AlexNet, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
            ......

nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2)

  • 64核 :意味着卷积层有64个不同的卷积核,每个核都会生成一个特征图(feature map)。所以输出的深度是64。

  • 输出尺寸 :输出特征图的高度和宽度可以用以下公式计算:
    Output Size = ⌊ Input Size − Kernel Size + 2 × Padding Stride ⌋ + 1 \text{Output Size} = \left\lfloor \frac{\text{Input Size} - \text{Kernel Size} + 2 \times \text{Padding}}{\text{Stride}} \right\rfloor + 1 Output Size=StrideInput SizeKernel Size+2×Padding+1
    现在,我们应用这个公式来计算 AlexNet 模型中第一卷积层的输出尺寸。

输入数据

原始图片: 3 × 224 × 224 3 \times 224 \times 224 3×224×224 (3个通道,每个通道的大小为224x224)

卷积层 1

  • 卷积核数量(输出通道数):64

  • 卷积核尺寸: 11 × 11 11 \times 11 11×11

  • 步幅(stride):4

  • 填充(padding):2

计算输出尺寸

我们需要计算输出特征图的宽度和高度:
Output Height = ⌊ 224 − 11 + 2 × 2 4 ⌋ + 1 = ⌊ 224 − 11 + 4 4 ⌋ + 1 = ⌊ 217 4 ⌋ + 1 = 54 + 1 = 55 \text{Output Height} = \left\lfloor \frac{224 - 11 + 2 \times 2}{4} \right\rfloor + 1 = \left\lfloor \frac{224 - 11 + 4}{4} \right\rfloor + 1 = \left\lfloor \frac{217}{4} \right\rfloor + 1 = 54 + 1 = 55 Output Height=422411+2×2+1=422411+4+1=4217+1=54+1=55
Output Width = ⌊ 224 − 11 + 2 × 2 4 ⌋ + 1 = ⌊ 224 − 11 + 4 4 ⌋ + 1 = ⌊ 217 4 ⌋ + 1 = 54 + 1 = 55 \text{Output Width} = \left\lfloor \frac{224 - 11 + 2 \times 2}{4} \right\rfloor + 1 = \left\lfloor \frac{224 - 11 + 4}{4} \right\rfloor + 1 = \left\lfloor \frac{217}{4} \right\rfloor + 1 = 54 + 1 = 55 Output Width=422411+2×2+1=422411+4+1=4217+1=54+1=55

输出尺寸

所以,卷积层1的输出特征图尺寸为: 64 × 55 × 55 64 \times 55 \times 55 64×55×55(64个特征图,每个特征图的大小为55x55)。
卷积核的数量(filters)就是输出通道数(output channels)。在卷积神经网络中,每个卷积核会生成一个特征图,这些特征图共同组成了输出张量的深度(通道数)。

  • 输入通道数(input channels) :输入数据的通道数。例如,一个RGB图像有3个通道(红、绿、蓝)。

  • 输出通道数(output channels) :卷积层输出的通道数,也就是卷积核的数量。每个卷积核会生成一个特征图,所有特征图的数量就是输出通道数。

import torch
import torch.nn as nn

# 定义输入张量,形状为 (batch_size, channels, height, width)
input_data = torch.randn(1, 3, 224, 224)

# 定义一个卷积层
# 输入通道数 3,输出通道数 64,卷积核大小 11x11,步幅 4,填充 2
conv_layer = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=11, stride=4, padding=2)

# 计算卷积层的输出
output = conv_layer(input_data)

print(f"输入张量的形状: {input_data.shape}")
print(f"输出张量的形状: {output.shape}")
输入张量的形状: torch.Size([1, 3, 224, 224])
输出张量的形状: torch.Size([1, 64, 55, 55])

有了dilation参数就是扩张卷积(dilated convolution)或者 膨胀卷积

import torch
import torch.nn as nn

# 定义输入张量,形状为 (batch_size, channels, height, width)
input_data = torch.randn(1, 3, 224, 224)

# 定义一个卷积层,扩张率为2
# 输入通道数 3,输出通道数 64,卷积核大小 11x11,步幅 4,填充 2,扩张率 2
conv_layer = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=11, stride=4, padding=2, dilation=2)

# 计算卷积层的输出
output = conv_layer(input_data)

print(f"输入张量的形状: {input_data.shape}")
print(f"输出张量的形状: {output.shape}")

输入张量的形状: torch.Size([1, 3, 224, 224])
输出张量的形状: torch.Size([1, 64, 52, 52])

计算输出形状:
H out = ⌊ H in + 2 P − D × ( K − 1 ) − 1 S ⌋ + 1 H_{\text{out}} = \left\lfloor \frac{H_{\text{in}} + 2P - D \times (K - 1) - 1}{S} \right\rfloor + 1 Hout=SHin+2PD×(K1)1+1
W out = ⌊ W in + 2 P − D × ( K − 1 ) − 1 S ⌋ + 1 W_{\text{out}} = \left\lfloor \frac{W_{\text{in}} + 2P - D \times (K - 1) - 1}{S} \right\rfloor + 1 Wout=SWin+2PD×(K1)1+1

给定参数

  • 输入尺寸 H in = 224 H_{\text{in}} = 224 Hin=224, W in = 224 W_{\text{in}} = 224 Win=224

  • 卷积核大小 K = 11 K = 11 K=11

  • 步幅 S = 4 S = 4 S=4

  • 填充 P = 2 P = 2 P=2

  • 扩张率 D = 2 D = 2 D=2

计算感受野

感受野的大小指的是在图像中一个特定位置的输出单元所覆盖的输入区域的大小。
扩张卷积的实际感受野为:
Effective Kernel Size = D × ( K − 1 ) + 1 = 2 × ( 11 − 1 ) + 1 = 21 \text{Effective Kernel Size} = D \times (K - 1) + 1 = 2 \times (11 - 1) + 1 = 21 Effective Kernel Size=D×(K1)+1=2×(111)+1=21

计算输出高度和宽度

使用公式计算输出尺寸:
H out = ⌊ 224 + 2 × 2 − 21 4 ⌋ + 1 H_{\text{out}} = \left\lfloor \frac{224 + 2 \times 2 - 21}{4} \right\rfloor + 1 Hout=4224+2×221+1
= ⌊ 224 + 4 − 21 4 ⌋ + 1 = \left\lfloor \frac{224 + 4 - 21}{4} \right\rfloor + 1 =4224+421+1
= ⌊ 207 4 ⌋ + 1 = \left\lfloor \frac{207}{4} \right\rfloor + 1 =4207+1
= ⌊ 51.75 ⌋ + 1 = \left\lfloor 51.75 \right\rfloor + 1 =51.75+1
= 51 + 1 = 51 + 1 =51+1
= 52 = 52 =52
感受野是卷积核在输入图像中覆盖的区域。 21 × 21 21 \times 21 21×21是感受野的大小 。 52 × 52 52 \times 52 52×52 是卷积操作之后输出特征图(feature map)的大小。

卷积的扩张率

扩张率 D D D 决定了卷积核元素之间插入零的数量。对于标准卷积(即扩张率 D = 1 D = 1 D=1),卷积核的元素是连续的,没有插入零。例如,一个 3 × 3 3 \times 3 3×3 的标准卷积核如下:

| a | b | c |
| d | e | f |
| g | h | i |

对于扩张率 D = 2 D = 2 D=2,在卷积核的每两个元素之间插入一个零:

| a | 0 | b | 0 | c |
| 0 | 0 | 0 | 0 | 0 |
| d | 0 | e | 0 | f |
| 0 | 0 | 0 | 0 | 0 |
| g | 0 | h | 0 | i |

可以看到,卷积核元素之间插入了 D − 1 = 1 D - 1 = 1 D1=1 个零。

感受野的扩展

扩张卷积的感受野计算公式为 D × ( K − 1 ) + 1 D \times (K - 1) + 1 D×(K1)+1,其中 K K K 是卷积核的尺寸。这个公式表示扩张卷积的实际感受野:

  • D D D :扩张率(dilation rate)。它决定了卷积核元素之间的距离。

  • K K K :卷积核的尺寸(即卷积核的边长,如果是 K × K K \times K K×K)。

  • K − 1 K - 1 K1 :表示卷积核中元素之间的间距数量。对于 K K K 长度的卷积核,有 K − 1 K - 1 K1 个间距。

  • D × ( K − 1 ) D \times (K - 1) D×(K1) :这是扩展后的卷积核覆盖的实际范围(即感受野)。

  • 最后的 + 1 +1 +1 :确保感受野包括卷积核的边界。假设 K = 3 K = 3 K=3,则卷积核有3个元素,需要考虑这3个元素的间距。公式 D × ( K − 1 ) D \times (K - 1) D×(K1)计算的是卷积核内部元素之间的距离,但这并不包括卷积核的边界元素。因此,感受野需要 +1 来包括卷积核的边界。

例如,对于 3 × 3 3 \times 3 3×3 的卷积核和扩张率 D = 2 D = 2 D=2

| a | 0 | b | 0 | c |
| 0 | 0 | 0 | 0 | 0 |
| d | 0 | e | 0 | f |
| 0 | 0 | 0 | 0 | 0 |
| g | 0 | h | 0 | i |

这个扩张卷积的感受野是:
2 × ( 3 − 1 ) + 1 = 2 × 2 + 1 = 5 2 \times (3 - 1) + 1 = 2 \times 2 + 1 = 5 2×(31)+1=2×2+1=5感受野从 3 × 3 3 \times 3 3×3 扩展到 5 × 5 5 \times 5 5×5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/762891.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js修改scss变量

style.scss $color : var(--color,#ccc); // 默认值 #ccc .color{background: $color; } 定义了一个scss变量($color),用普通的css变量(--color)给他赋值,这里需要一个默认值,此时css变量(--co…

python 中的 下划线_ 是啥意思

在 Python 中,_(下划线)通常用作占位符,表示一个变量名,但程序中不会实际使用这个变量的值。 目录 忽略循环变量:忽略函数返回值:在解释器中使用:举例子1. 忽略循环变量2. 忽略不需…

001 SpringMVC介绍

文章目录 基础概念介绍BS和CS开发架构应用系统三层架构MVC设计模式 SpringMVC介绍SpringMVC是什么SpringMVC与Spring的联系为什么要学习SpringMVC 六大组件介绍六大组件(MVC组件其他三大组件)说明 基础概念介绍 BS和CS开发架构 一种是C/S架构,也就是客户端/服务器…

依托天拓四方工业智能网关实现CNC数控机床的远程运维

随着工业4.0时代的到来,智能制造和工业互联网成为了推动制造业转型升级的重要力量。CNC数控机床作为制造业的核心设备,其运行效率与稳定性直接关系到企业的生产效益。因此,实现CNC数控机床的远程运维,对于提升企业竞争力、降低运营…

使用systemd管理Linux下的frps服务:安装、配置及自动化操作指南

在 Linux 系统下,使用 systemd 可以方便地控制 frps 服务端的启动、停止、配置后台运行以及开机自启动。以下是具体的操作步骤: 1. 安装 systemd 如果您的 Linux 服务器上尚未安装 systemd,可以使用包管理器如 yum(适用于 Cent…

K8S学习教程(一):使用PetaExpress云服务器安装Minikube 集群题

什么是Minikube Minikube是一款工具,主要用于在本地运行 Kubernetes 集群。Kubernetes 开源的平台,用于自动化容器化应用的部署、扩展和管理,而Minikube 使得开发人员能够在本地机器上轻松创建一个单节点的 Kubernetes 集群,从而…

从新手到高手:Scala函数式编程完全指南,Scala 数据类型(4)

1、Scala 数据类型 Scala 与 Java有着相同的数据类型,下表列出了 Scala 支持的数据类型:

JMH319【亲测整理】2017剑侠情缘2剑网2汉化版+网游VM单机版+修复纹饰翅膀+内置GM命令无限道具+一键端视频安装教学

资源介绍: 这一套新端早就在手上 一直没分享出来 既然大家放出来了 我也就发出来大家研究吧 目前在改另外一套 是否需要虚拟机:是 文件大小:压缩包约7G 支持系统:win7、win10、win11 硬件需求:运行内存12G …

如何在OpenEuler 上快速部署一套Zabbix7.0监控系统

如何在OpenEuler 上快速部署一套Zabbix监控系统 一、环境信息 用途机器IP操作系统备注zabbix-server172.22.33.180openeuler 22.03 LTS SP37.0 LTS 版本,容器部署zabbix-agent172.16.10.182openeuler 22.03 LTS SP37.0 源码编译部署 二、Docker 部署 2.1 二进制…

七月论文审稿GPT第5版:拿我司七月的早期paper-7方面review数据集微调LLama 3

前言 llama 3出来后,为了通过paper-review的数据集微调3,有以下各种方式 不用任何框架 工具 技术,直接微调原生的llama 3,毕竟也有8k长度了 效果不期望有多高,纯作为baseline通过PI,把llama 3的8K长度扩展…

生产环境部署与协同开发-Docker(原创超全)

关闭防火墙 systemctl stop firewalld.service 关闭SELinux vim /etc/selinux/config 查看yum支持的包并安装docker引擎 yum listyum install -y docker 启动docker设置docker自启动测试docker是否安装成功? systemctl start dockersystemctl enable dockerdoc…

把图片的透明部分去掉

问题: canvas裁剪的图把整个画布都剪下来了,但只要有元素的部分 // 图像处理// 把图片的透明部分去掉 export function getImagesRealSize(dataUrl) {return new Promise((resolve, reject) > {// 将Base64解码为二进制数据let binaryString atob(…

【启明智显活动分享】 启明与你,上海慕尼黑电子展不见不散!

启明与你,上海慕尼黑电子展不见不散!🎉 🔍 展会现场,你将亲眼目睹RTOS、LINUX、Android全系列方案及产品的精彩展示。从经典到前沿,一站式满足你的技术探索需求。 💡 更值得期待的是&#xff0…

微信小程序毕业设计-英语互助系统项目开发实战(附源码+论文)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

硬件实用技巧:cadence Aleego创建焊盘过程

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140110911 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

windows USB 设备驱动开发-Host端和Device端

Windows 中的 USB 宿主端驱动程序 下图显示了适用于 Windows 的 USB 驱动程序堆栈的体系结构框图。 此图显示了适用于 USB 2.0 和 USB 3.0 的单独 USB 驱动程序堆栈。 当设备连接到 xHCI 控制器时,Windows 加载 USB 3.0 驱动程序堆栈。 Windows 为连接到 EHCI、OHC…

Windows/Linux/Mac 系统局域网服务发现协议及传输速度比较

简介 分析 / 验证对比常见局域网服务发现协议在 Windows/Linux/Mac 等不同系统下的支持和表现 在使用不同系统的智能硬件时,如常见的树莓派 / Openwrt 路由器 / Debian/Fedora/Windows/Mac 等系统是,系统间相互发现以及网络共享本应是系统的基础服务&a…

【RT摩拳擦掌】基于RT106L/S语音识别的百度云控制系统

【RT摩拳擦掌】基于RT106L/S语音识别的百度云控制系统 一 文档简介二 平台构建2.1 使用平台2.2 百度智能云2.2.1 物联网核心套件2.2.2 在线语音合成 2.3 playback语音数据准备与烧录2.4 开机语音准备与添加2.5 唤醒词识别词命令准备与添加 三 代码准备3.1 sln-local/2-iot 代码…

黑马点评下订单-小程序下单没问题但是Postman发送请求失败了,返回401

经过多方探索,这个✓8错误就是由于黑马点评使用了拦截器,我们直接发送请求是会被拦截器拦截下来的,我给出的解决方案是通过配置Postman解决,方法很简单! 解决方案 右边的value写上Redis里面登录所用token值就可以了…

【TB作品】打地鼠游戏,ATMEGA16单片机,Proteus仿真 打地鼠游戏

11个按键LCD1602显示器9个灯蜂鸣器打地鼠小游戏就是九个灯泡,对应九个按键,灯泡有红黄蓝,每间隔一会儿就会亮一个灯,代表地鼠冒出来,按一下按键让灯泡灭掉代表打地鼠,红的三分,黄的两分&#xf…