深度学习之 filtering and padding

本文介绍了卷积神经网络(CNN)的相关知识。阐述了卷积运算中滤波和填充的概念,解决图片缩小和边缘信息丢失问题;说明了多通道图片卷积过程,介绍了CNN单层结构及参数特点;给出简单CNN网络模型和数字识别例子,还分析了CNN相比标准神经网络参数少、不易过拟合等优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Filtering and Padding

原始图片为nxn当经fxf的filter后大小就变成了 (n-f+1)f一般是奇数如果有步长S 那么输出就是(n−f)/S+1(n-f)/S+1(nf)/S+1

这时候就会出现两个问题

  • 卷积运算后,输入图片尺寸减小
  • 原始图片边缘信息对输出贡献少,输出图片会丢失边缘信息

为了解决图片缩小的问题,使用padding的方法,对原始图片进行扩展,扩展区域补零,用p表示扩展宽度,

在这里插入图片描述

经过padding后,原始图片变成(n+2p)x(n+2p)(n+2p)x(n+2p)(n+2p)x(n+2p)

所以要保证卷积前后图片尺寸的一致那么p=(f−1)/2p=(f-1)/2p=(f1)/2

Stride表示filter在原图片中水平方向和垂直方向每次的步进长度。之前我们默认stride=1。若stride=2,则表示filter每次步进长度为2,即隔一点移动一次。

img

我们用s表示stride长度,p表示padding长度,如果原始图片尺寸为n x n,filter尺寸为f x f,则卷积后的图片尺寸为:

⌊n+2p−fs+1⌋X⌊n+2p−fs+1⌋⌊\frac{n+2p−f}{s}+1⌋X⌊\frac{n+2p−f}{s}+1⌋sn+2pf+1Xsn+2pf+1

值得一提的是,相关系数(cross-correlations)与卷积(convolutions)之间是有区别的。实际上,真正的卷积运算会先将filter绕其中心旋转180度,然后再将旋转后的filter在原始图片上进行滑动计算。filter旋转如下所示:

img

其实,目前为止我们介绍的CNN卷积实际上计算的是相关系数,而不是数学意义上的卷积。但是,为了简化计算,我们一般把CNN中的这种“相关系数”就称作卷积运算。之所以可以这么等效,是因为滤波器算子一般是水平或垂直对称的,180度旋转影响不大;而且最终滤波器算子需要通过CNN网络梯度下降算法计算得到,旋转部分可以看作是包含在CNN模型算法中。总的来说,忽略旋转运算可以大大提高CNN网络运算速度,而且不影响模型性能。

卷积运算服从结合律:
(A∗B)∗C=A∗(B∗C) (A*B)*C=A*(B*C) (AB)C=A(BC)

Convolutions Over Volume

对于3通道的RGB图片,其对应的滤波器算子同样也是3通道的。例如一个图片是6 x 6 x 3,分别表示图片的高度(height)、宽度(weight)和通道(#channel)。

3通道图片的卷积运算与单通道图片的卷积运算基本一致。过程是将每个单通道(R,G,B)与对应的filter进行卷积运算求和,然后再将3通道的和相加,得到输出图片的一个像素值。

img

不同通道的滤波算子可以不相同。例如R通道filter实现垂直边缘检测,G和B通道不进行边缘检测,全部置零,或者将R,G,B三通道filter全部设置为水平边缘检测。

为了进行多个卷积运算,实现更多边缘检测,可以增加更多的滤波器组。例如设置第一个滤波器组实现垂直边缘检测,第二个滤波器组实现水平边缘检测。这样,不同滤波器组卷积得到不同的输出,个数由滤波器组决定。

img

若输入图片的尺寸为n x n x nc,filter尺寸为f x f x nc,则卷积后的图片尺寸为(n-f+1) x (n-f+1) x nc’。其中,nc为图片通道数目,nc’为滤波器组个数。

** One Layer of a Convolutional Network**

卷积神经网络的单层结构如下所示:

img

相比之前的卷积过程,CNN的单层结构多了激活函数ReLU和偏移量b。整个过程与标准的神经网络单层结构非常类似:

每个滤波器组有3x3x3=27个参数,还有1个偏移量b,则每个滤波器组有27+1=28个参数,两个滤波器组总共包含28×2=56个参数。我们发现,选定滤波器组后,参数数目与输入图片尺寸无关。所以,就不存在由于图片尺寸过大,造成参数过多的情况。例如一张1000x1000x3的图片,标准神经网络输入层的维度将达到3百万,而在CNN中,参数数目只由滤波器组决定,数目相对来说要少得多,这是CNN的优势之一。

参数的数量与图片的size无关

最后,我们总结一下CNN单层结构的所有标记符号,设层数为l

理解,输入:图片的宽高和维度叠加上滤波器后,那么权重的个数其实就是滤波器的参数个数,偏置为输出的滤波器个数

Simple Convolutional Network Example

下面介绍一个简单的CNN网络模型:

该CNN模型各层结构如上图所示。需要注意的是,a[3]∗a[3]a^{[3]}*a^[3]a[3]a[3]的维度是7 x 7 x 40,将a[3]∗a[3]a^{[3]}*a^[3]a[3]a[3]排列成1列,维度为1960 x 1,然后连接最后一级输出层。输出层可以是一个神经元,即二元分类(logistic);也可以是多个神经元,即多元分类(softmax)。最后得到预测输出y^\hat yy^

值得一提的是,随着CNN层数增加,nH[l]和nW[l]n_H^{[l]}和n_W^{[l]}nH[l]nW[l]一般逐渐减小,而nc[l]n_c^{[l]}nc[l]一般逐渐增大。

对于参数的话最后的每一层的参数为fxfxnc[l−1]n_c^{[ l-1 ]}nc[l1]+nc[l]n_c^{[ l ]}nc[l]

CNN有三种类型的layer:

  • Convolution层(CONV)
  • Pooling层(POOL)
  • Fully connected层(FC)

CNN Example

下面介绍一个简单的数字识别的CNN例子:

img

图中,CON层后面紧接一个POOL层,CONV1和POOL1构成第一层,CONV2和POOL2构成第二层。特别注意的是FC3和FC4为全连接层FC,它跟标准的神经网络结构一致。最后的输出层(softmax)由10个神经元构成。

整个网络各层的尺寸和参数如下表格所示:

img

Why Convolutions

相比标准神经网络,CNN的优势之一就是参数数目要少得多。参数数目少的原因有两个:

  • 参数共享:一个特征检测器(例如垂直边缘检测)对图片某块区域有用,同时也可能作用在图片其它区域。
  • 连接的稀疏性:因为滤波器算子尺寸限制,每一层的每个输出只与输入部分区域内有关。

除此之外,由于CNN参数数目较小,所需的训练样本就相对较少,从而一定程度上不容易发生过拟合现象。而且,CNN比较擅长捕捉区域位置偏移。也就是说CNN进行物体检测时,不太受物体所处图片位置的影响,增加检测的准确性和系统的健壮性。

### BM3D算法与医学图像处理中的三维分类实现 BM3D(Block-Matching and 3D filtering)是一种高效的去噪方法,在医学图像领域得到了广泛的应用[^1]。然而,对于医学图像的三维分类问题,则更多涉及的是特征提取、机器学习模型以及深度学习框架的支持。 以下是基于Python的一个简单示例代码片段,展示如何利用深度学习库PyTorch来构建一个基础的三维卷积神经网络(CNN),用于医学图像的三维分类任务: ```python import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader class Simple3DCNN(nn.Module): def __init__(self, num_classes=2): super(Simple3DCNN, self).__init__() self.conv_layer = nn.Sequential( nn.Conv3d(1, 8, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool3d(kernel_size=2, stride=2), nn.Conv3d(8, 16, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool3d(kernel_size=2, stride=2) ) self.fc_layer = nn.Sequential( nn.Linear(16 * 7 * 7 * 7, 128), nn.ReLU(), nn.Dropout(p=0.5), nn.Linear(128, num_classes) ) def forward(self, x): out = self.conv_layer(x) out = out.view(out.size(0), -1) # Flatten the tensor out = self.fc_layer(out) return out # Example usage: device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = Simple3DCNN(num_classes=2).to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) print(model) ``` 上述代码定义了一个简单的三维卷积神经网络结构,适用于输入尺寸为 \(C \times D \times H \times W\) 的数据集,其中\(C\)表示通道数,而\(D\), \(H\), 和 \(W\)分别代表深度、高度和宽度。该模型可以扩展到更复杂的架构以适应不同的应用场景。 关于三维重建方面,VTK(Visualization Toolkit)是一个强大的工具包,支持从二维切片生成三维可视化效果[^2]。如果需要进一步探索具体的注册技术及其应用背景,可参考文献中提到的相关研究进展[^3]。 此外,实际开发过程中可能还需要考虑预处理阶段的数据增强操作以及后端评估指标的设计等问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值