240627_关于CNN中图像维度变化问题

240627_关于CNN中图像维度变化问题

在学习一些经典模型时,其中得维度变化关系总搞不太明白,集中学习了以下,在此作以梳理总结:

一般来说涉及到的维度变换都是四个维度,当batch size=4,图像尺寸为640*640,RGB三通道时,此时维度就是4×3×640×640。3的意思是RGB三通道,如果你传入的图像是单通道图像,此时维度就是4×1×640×640。

当然有些图你看着是一个黑白图,但是他还是有可能是一张RGB三通道图,具体怎么区分呢。右击图片打开属性,打开详细信息,里面可以看到位深度,位深度为24,则为RGB图,位深度为8,则为单通道图。此处就是一个坑,图像分割任务中,标签往往是单通道图,但是有时从网上找到的数据集看起来是黑白的,但是实际训练就会报错,查看了才发现位深度是24,需要用python代码进行修改,具体跳转240627_图像24位深度(RGB图)转为8位深度(单通道图)-CSDN博客。

当维度是三维时,就是没有batch size这个维度,可以理解为这个维度指的是其中一张图。

标准卷积

以U_Net为例

python 复制代码
# U_Net网络的简单结构,就写了一层,其他同理
block1=block_down(3,64)
x1_use=block1(x) # torch.Size([3, 64, 568, 568])
x1=self.maxpool(x1_use) # torch.Size([3, 64, 284, 284])

'''
block down中卷积核的定义为
self.conv1 = nn.Conv2d(inp_channel, out_channel, kernel_size=3, stride=1,padding_mode='reflect')
self.conv2 = nn.Conv2d(out_channel, out_channel, kernel_size=3, stride=1,padding_mode='reflect')
'''

卷积输出的计算公式为

h e i g h t o u t = ( h e i g h t i n − h e i g h t k e r n e l + 2 ∗ p a d d i n g ) s t r i d e + 1 height_{out}=\frac{(height_{in}-height_{kernel}+2*padding)}{stride}+1 heightout=stride(heightin−heightkernel+2∗padding)+1

w i d t h o u t = ( w i d t h i n − w i d t h k e r n e l + 2 ∗ p a d d i n g ) s t r i d e + 1 width_{out}=\frac{(width_{in}-width_{kernel}+2*padding)}{stride}+1 widthout=stride(widthin−widthkernel+2∗padding)+1

输入3张572572的RGB图像(3×3×572×572),经过3×3卷积(padding=0,stride=1),此时的计算公式为
h e i g h t o u t = w i d t h o u t = ( 572 − 3 + 2 ∗ 0 ) 1 + 1 = 570 height_{out}=width_{out}=\frac{(572-3+2*0)}{1}+1=570 heightout=widthout=1(572−3+2∗0)+1=570
一共经过两层之后尺寸为568
568,因为kernel的out_channel定义的是64,所以一共有64个卷积核,输出通道为64,此时维度为3×64×568×568。

然后经过最大池化层,尺寸除以2,通道数不变,此时维度为3×64×284×284

其余层数同理

batch_size height width in_channel out_channel
Input 3 572 572 3
Kernel 3 3 3 64
Output 3 570 570 64

1×1卷积

以ResNet50为例

我们看shortcuts分支(右半弧线分支),这个分支输入一张维度为1×256×56×56的图像,经过一个1×1卷积(stride=2,padding=0),此时经过上述公式计算,尺寸为28,输出通道数为512。

batch_size height width in_channel out_channel
Input 1 56 56 256
Kernel 1 1 256 512
Output 1 28 28 512

当然也有特殊情况,1×1卷积,卷积核尺寸为1,步长为1,padding=0,通过以上公式可以计算出来尺寸不会发生变化,但通道数可以发生改变,由卷积核数量决定。

全连接层

全连接层就是把所有的像素点都摊开,摊成尺寸为1×1,通道数好多好多,其卷积核尺寸和输入尺寸一致,输出 通道数就是卷积核个数

batch_size height width in_channel out_channel
Input 1 56 56 256
Kernel 56 56 256 512
Output 1 1 1 512

总结

输出通道数就是卷积核个数

卷积后尺寸计算公式就是

h e i g h t o u t = ( h e i g h t i n − h e i g h t k e r n e l + 2 ∗ p a d d i n g ) s t r i d e + 1 height_{out}=\frac{(height_{in}-height_{kernel}+2*padding)}{stride}+1 heightout=stride(heightin−heightkernel+2∗padding)+1

w i d t h o u t = ( w i d t h i n − w i d t h k e r n e l + 2 ∗ p a d d i n g ) s t r i d e + 1 width_{out}=\frac{(width_{in}-width_{kernel}+2*padding)}{stride}+1 widthout=stride(widthin−widthkernel+2∗padding)+1

相关推荐
阿部多瑞 ABU10 分钟前
空能指的再生产:一个符号政治经济学的分析框架
人工智能·ai写作
xx_xxxxx_20 分钟前
论文阅读-SAR
人工智能·深度学习·机器学习
桃西西呀29 分钟前
LangChain 之七:回调与可观测
人工智能·langchain·llm
2601_9603563831 分钟前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
桃西西呀32 分钟前
LangChain 之六:记忆与历史
人工智能·langchain·llm
周杰伦fans1 小时前
8GB显存下模型量化实战指南
人工智能·后端·c#
秦先生在广东1 小时前
gstack 深度解析:AI 驱动的单人虚拟工程团队与端到端自动化
人工智能
Yyyyyy~1 小时前
【Anaconda】安装
人工智能·python
golang学习记1 小时前
VSCode AI新特性:HydraFusion来了:系统会自己组队干活
ide·人工智能·vscode
EatFan1 小时前
从“框架混战“到“运行时收敛“:2026 年 AI Agent 开发框架的三条路线之争
java·数据库·人工智能·多智能体·ai agent·mcp·agent 框架