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

相关推荐
爱喝白开水a13 分钟前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
takashi_void20 分钟前
如何在本地部署大语言模型(Windows,Mac,Linux)三系统教程
linux·人工智能·windows·macos·语言模型·nlp
OpenCSG25 分钟前
【活动预告】2025斗拱开发者大会,共探支付与AI未来
人工智能·ai·开源·大模型·支付安全
生命是有光的28 分钟前
【深度学习】神经网络基础
人工智能·深度学习·神经网络
数字供应链安全产品选型32 分钟前
国家级!悬镜安全入选两项“网络安全国家标准应用实践案例”
人工智能·安全·web安全
科技新知44 分钟前
大厂AI各走“开源”路
人工智能·开源
字节数据平台1 小时前
火山引擎Data Agent再拓新场景,重磅推出用户研究Agent
大数据·人工智能·火山引擎
TGITCIC1 小时前
LLaVA-OV:开源多模态的“可复现”革命,不只是又一个模型
人工智能·开源·多模态·ai大模型·开源大模型·视觉模型·大模型ai
GeeLark1 小时前
GeeLark 9月功能更新回顾
人工智能
mwq301231 小时前
GPT-2 中的 Pre-Layer Normalization (Pre-LN) 架构详解
人工智能