02 - 卷积层
概念
卷积层是深度学习神经网络中的一种基本层,用于提取输入数据中的特征。它通过卷积操作对输入数据进行处理,并输出具有更高级别表示的特征图(feature map)。卷积层在图像处理、自然语言处理等领域中都有广泛的应用。卷积分为不同维度,有Conv1d,Conv2d和Conv3d,我们主要学习二维卷积。其主要特点包括:
- 局部感知:卷积操作在输入数据的局部区域上进行滑动,每次滑动一定步长并对局部区域应用卷积核,从而实现对局部特征的感知。
- 权值共享:卷积核的权重在整个输入数据上共享,这样可以大大减少网络参数数量,降低过拟合的风险,同时提高模型的泛化能力。
- 稀疏交互:由于卷积核的尺寸通常远小于输入数据的尺寸,卷积操作在进行特征提取时只关注局部区域的交互,从而降低了计算量。
- 多通道处理:卷积层可以同时处理多通道的输入数据,每个通道有自己的卷积核集合,可以提取不同通道的特征信息。
卷积层通常与其他层结合使用,如激活函数层(如ReLU)、池化层(如最大池化、平均池化)和全连接层,构成深度神经网络的基本架构。通过堆叠多个卷积层,可以逐步提取更加抽象和高级别的特征,从而实现对复杂数据的有效建模和学习。
torch.nn.Conv2d
是PyTorch中用于创建二维卷积层的类,其构造函数的定义如下:
in_channels
: 输入数据的通道数,例如RGB图像有3个通道。out_channels
: 输出数据的通道数,也就是卷积核的数量,决定了卷积层的输出特征图的深度。kernel_size
: 卷积核的大小,可以是一个整数表示正方形卷积核的边长,也可以是一个元组(H, W)
表示高度和宽度分别为H和W的卷积核。stride
: 卷积操作的步长,默认为1,表示卷积核在输入数据上滑动的步长。padding
: 在输入数据的边界周围填充0的层数,默认为0,用于控制卷积操作的输出大小。dilation
: 卷积核元素之间的间隔,默认为1,用于控制卷积操作中元素之间的距离。groups
: 输入通道分组数,默认为1,用于实现分组卷积,将输入通道分成几个组进行卷积操作。bias
: 是否使用偏置项,默认为True,表示卷积层是否包含可学习的偏置。padding_mode
: 填充模式,默认为’zeros’,表示使用0填充输入数据的边界。device
: 张量所在的设备,默认为None,表示使用当前的默认设备。dtype
: 张量的数据类型,默认为None,表示使用当前的默认数据类型。
https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md
示例
import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
dataset = torchvision.datasets.CIFAR10("./dataset", train=False,
transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size=64)
class myModel(nn.Module):
def __init__(self):
super(myModel, self).__init__()
self.conv1 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)
def forward(self, x):
x = self.conv1(x)
return x
mm = myModel()
print(mm)
writer = SummaryWriter("dataloader")
step = 0
for data in dataloader:
imgs, labels = data
output = mm(imgs)
print(imgs.shape)
print(output.shape)
writer.add_images("input", imgs, step)
# shape当中的-1是占位符,让PyTorch自动计算维度大小
output = torch.reshape(output, (-1, 3, 30, 30))
writer.add_images("output", output, step)
step += 1