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

相关推荐
OpenCSG9 分钟前
CSGHub开源版本v1.2.0更新
人工智能
weixin_515202499 分钟前
第R3周:RNN-心脏病预测
人工智能·rnn·深度学习
Altair澳汰尔12 分钟前
数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者
人工智能·算法·机器学习·数据分析·知识图谱
AI视觉网奇33 分钟前
人脸生成3d模型 Era3D
人工智能·计算机视觉
call me by ur name36 分钟前
VLM--CLIP作分类任务的损失函数
人工智能·机器学习·分类
Python机器学习AI41 分钟前
分类模型的预测概率解读:3D概率分布可视化的直观呈现
算法·机器学习·分类
吃个糖糖1 小时前
34 Opencv 自定义角点检测
人工智能·opencv·计算机视觉
禁默1 小时前
2024年图像处理、多媒体技术与机器学习
图像处理·人工智能·microsoft
KeepThinking!1 小时前
YOLO-World:Real-Time Open-Vocabulary Object Detection
人工智能·yolo·目标检测·多模态
AIGCmagic社区1 小时前
AI多模态技术介绍:理解多模态大语言模型的原理
人工智能·语言模型·自然语言处理