一、认识卷积操作
卷积操作是一种数学运算,它涉及两个函数:输入函数(通常是图像)和卷积核(也称为滤波器或特征检测器)。卷积核在输入函数上滑动,将核中的每个元素与其覆盖的输入函数区域中的对应元素相乘,然后将所有乘积相加,形成输出函数的一个值。这个过程在整个输入函数上重复,生成一个新的二维数组,称为特征图或激活图。
卷积操作的主要目的是从输入数据中提取特征。通过改变卷积核的值,可以检测不同类型的特征,如边缘、角点、纹理等。
二、运用卷积操作
1、卷积操作函数
在PyTorch中,可以使用torch.nn.functional.conv2d
函数执行二维卷积操作。该函数的输入包括输入张量、卷积核、以及其他可选参数,如步长(stride)、填充(padding)等。
2、函数参数解释
对常用的参数进行一些说明
- 输入通道数 (in_channels): 这表示输入图像有多少个颜色通道。例如,对于彩色图像,通常有红、绿、蓝三个通道,所以输入通道数就是3。
- 输出通道数 (out_channels): 这表示卷积操作后,你希望有多少个特征图或者卷积核。每一个特征图都可以看作是一种特征检测器,用于检测输入图像中的某种特定特征。
- 卷积核大小 (kernel_size): 这表示卷积核的尺寸。卷积核就像一个滑动窗口,在输入图像上滑动,进行像素值的加权求和。常见的卷积核大小有3x3、5x5等。
- 步长 (stride): 这表示卷积核在输入图像上滑动时,每次移动的距离。步长越大,输出的特征图尺寸就越小。
- 填充 (padding): 在输入图像的周围添加额外的像素值,通常是0。填充的目的是为了控制输出特征图的尺寸,以及让卷积核能够处理到输入图像的边界像素。
其他的具体参数,可以查看官方文档,里面有详细说明
torch.nn.functional.conv2d — PyTorch 2.3 documentationhttps://pytorch.org/docs/stable/generated/torch.nn.functional.conv2d.html#torch.nn.functional.conv2d
3、简单进行卷积操作
常理,先进行导包操作
import torch
import torch.nn.functional as F
接着定义输入的矩阵和卷积核,输入矩阵形状为5*5,卷积核大小为3*3
# 输入
input = torch.tensor([[1, 2, 0, 3, 1],
[0, 1, 2, 3, 1],
[1, 2, 1, 0, 0],
[5, 2, 3, 1, 1],
[2, 1, 0, 1, 1]])
# 卷积核
kernel = torch.tensor([[1, 2, 1],
[0, 1, 0],
[2, 1, 0]])
将输入图像和卷积核重塑为四维张量,以适应conv2d函数的要求
input = torch.reshape(input, [1, 1, 5, 5])
kernel = torch.reshape(kernel, [1, 1, 3, 3])
输出张量的形状为[1, 1, 3, 3],其中第一个和第二个维度分别表示批量大小和通道数(在这个例子中都是1),第三个和第四个维度表示输出特征图的高和宽。
接着,执行卷积操作
output = F.conv2d(input, kernel, stride=1, padding=0)
得出结果如下:
三、卷积函数的原理
这里就结合着上面的demo来讲解一下,如果学过矩阵的话,这就很好理解了,在默认步长为1的情况下,由于卷积核是3*3的,那么就会在原来的输入矩阵中,框出同样为3*3的区域,按照矩阵中每一个位置对应相乘,再相加,就得到卷积后3*3矩阵的第一行第一列的结果10
接下来红色所示的框会移动,重复上述操作即可得到卷积结果
四、卷积层的工作原理
卷积层是卷积神经网络(CNN)中的基本组件之一。它的工作原理是通过在输入数据上滑动卷积核来提取特征。每个卷积核都可以学习并检测输入数据中的特定类型的特征。卷积层的输出是一个特征图,其中每个位置的值表示该位置在输入数据中是否存在某种特征。后期将会和Tensorboard结合使用,更加直观地了解工作过程。