卷积层的输出

卷积层的输出

flyfish

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

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

标准卷积

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

import torch
import torch.nn as nnclass 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.mzph.cn/pingmian/38759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot设置自动跳转前端界面

一般情况下,我们的Application启动文件的内容为一行的运行代码,默认启动项目以后不会自动跳转到我们的前端页面 public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);} 这里我的可以通过设置文件的内容&#…

【系统架构设计师】计算机组成与体系结构 ⑤ ( 主存编址计算 | 存储单元 | 内存编址 | 存储单元个数 和 总容量 计算 )

文章目录 一、主存编址计算1、存储单元2、内存编址3、存储单元个数 和 总容量 计算4、主存编址案例 一、主存编址计算 1、存储单元 存储单元 概念 : 最小存储单位 : 1 bit 是 计算机中最小的 容量单位 , 只能表示 0 或 1 ;存储单元 : 在 存储器 中 , 查找 1 bit 是比较困难的 …

c++全排列函数next_permutation详解

c全排列函数next_permutation详解 在 C 的 库中,next_permutation 是一个用于计算给定范围内元素的下一个排列的函数。这个函数特别适用于对整数序列或可以比较的元素进行全排列的生成。 参数 first, last:表示范围的迭代器,即要重新排列的…

300价值指数投资价值

300价值指数是价值股的代表。 它的选股是在沪深300指数里面按照低市盈率,低市净率,低市现率,高股息率挑选的100只股票组成。 这个指数是由中证指数公司于2008年1月21日发布,以2004年12月31日为基准,是个老牌指数了。 …

Go线程实现模型-G

G 概述 一个G就代表一个goroutine(或称Go例程),也与go函数相对应。作为编程人员,我们只是使用go语句向Go的运行时系统提交一个并发任务,而Go的运行时系统则会按照我们要求并发地执行它 Go编译器会把go语句变成对内部函数newproc的调用&…

美德政府转移比特币、以太坊引发市场下跌

小编通过链上地址监控,令人意外的发现德国和美国政府都进行了大规模的数字货币转移,转移了价值 1.5 亿美元的比特币和以太坊。这些大额转移势必引起了数字货币市场分析师和投资者的关注。 BTC价格 从今年起德国政府已转移了其持有的相当一部分比特币&…

OPPO保活方案测试

下面是OPPO手机各种方案的测试记录, 也包括无效的方案 1. OPPO的电源设置和应用省电设置 OPPO手机电源设置里面不限制性能, 优化全部关闭, "自动优化"修改成不优化 第四张图应用省电设置里面的开关也全部打开 图片不能在本地保存, 保存在文件<OPPO手机电池设置和…

【MySQL备份】Percona XtraBackup实战篇

目录 1. 前言 2.准备工作 2.1.创建备份目录 2.2.配置/etc/my.cnf文件 2.3.授予root用户BACKUP_ADMIN权限 3.全量备份 4.准备备份 5.数据恢复 6.总结 "实战演练&#xff1a;利用Percona XtraBackup执行MySQL全量备份操作详解" 1. 前言 本文将继续上篇【My…

玩Stable Diffusion不可不知的5款真人模型!大佬都在用!(附模型包)

模型对于AI绘画起决定性作用&#xff0c;今天推荐5款超好用的Stable Diffusion模型。 这些模型都在市面上收获了各种好评&#xff0c;而且各具特色&#xff0c;能满足你对写实人像的各种要求。 1、MajicMIX realisric 麦橘写实 写实系的人像大模型&#xff0c;具有非常好的质…

uboot 环境变量初始化流程

初始化在board_f.c,读取flash环境变量到ddr内在board_r.c arch/arm/cpu/armv8/start.Sbl _mainarch/arm/lib/crt0_64.S xxxxbl board_init_fxxxxb board_init_r commonboard_f.c static const init_fnc_t init_sequence_f[] {setup_mon_len,arch_cpu_init, /* basic arch c…

数据结构笔记第3篇:双向链表

1、双向链表的结构 注意&#xff1a;这里的 "带头" 跟前面我们说的 "头结点" 是两个概念&#xff0c;实际前面的在单链表阶段称呼不严谨&#xff0c;但是为了同学们更好的理解就直接称为单链表的头结点。 带头链表里的头结点&#xff0c;实际为 "哨兵…

勒索病毒--认知与防范

免责声明:本文仅做技术交流与学习... 目录 应急响应-勒索病毒 1、什么是勒索病毒&#xff1f; 勒索病毒是一种新型电脑病毒&#xff0c;主要以RDP爆破、邮件、程序木马、网页挂马的形式进行传播。该病毒性质恶劣、危害极大&#xff0c;一旦感染将给用户带来无法估量的损失。…

已解决 SyntaxError: invalid syntax,Python报错原因和解决方案。

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 这篇文章带大家…

2065.最大化一张图中的路径价值

解题思路 枚举 枚举从0开始所有可能的路径&#xff0c;代码能力就是如何枚举&#xff0c;递归回溯 递归函数&#xff1a;当前节点&#xff0c;当前路径总时间&#xff0c;节点的价值之和。对相联通的节点进行递归搜索&#xff0c;如果回到节点0&#xff0c;则更新。 超过总时…

精灵图和base64的区别

精灵图&#xff1a;把多张小图整合到一张大图上&#xff0c;利用定位的一些属性把小图显示在页面上&#xff0c;这样访问页面的时候&#xff0c;可以减少请求次数&#xff0c;提高加载速度。 base64&#xff1a;这是一种传输8bit字节代码的编码方式&#xff0c;是一种用64个字符…

C++编程(七)继承

文章目录 一、继承&#xff08;一&#xff09;概念&#xff08;二&#xff09;语法格式&#xff08;三&#xff09;通过子类访问父类中的成员1. 类内2. 类外 &#xff08;四&#xff09;继承中的特殊成员函数1. 构造函数2. 析构函数3. 拷贝构造函数4. 拷贝赋值函数 二、多重继承…

怎样把热门抖音短视频下载保存到手机相册?

怎样把热门抖音短视频下载保存到手机相册? 1、在手机上打开抖音短视频APP&#xff1b; 2、打开后搜索或找到要下载保存的抖音短视频&#xff1b; 3、打开短视频后&#xff0c;点击右则的分享&#xff0c;并滑动找到保存到相册&#xff1b; 4、点击后等待完成下载&#xff0c;…

Python实现接糖果小游戏

介绍: 基于Pygame的糖果从屏幕顶部下落的游戏代码。这个游戏包括了一个可以左右移动的篮子来接住下落的糖果&#xff0c;接住糖果会增加得分。 代码: import pygame import random import os# 初始化pygame和设置屏幕大小 pygame.init() screen_width, screen_height 800, 6…

【LeetCode】反转字符串中的单词

目录 一、题目二、解法完整代码 一、题目 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1…