上两节博客,分别学习了卷积神经网络的基础知识和处理手写字数据集,具体的可以看前边两篇博客:
CNN基础知识
CNN处理mnist数据集
mnist只是单一高度(channel)的数据集,使用卷积处理时的卷积核是二维平面形状,而实际情况下我们要处理的往往是彩色图像,因此是有高度(channel)值的,这时卷积核更像是一个立方体的样子,看下面的图就很好理解了。
1.问题的提出
这节课我们用另一个著名的数据集CIFAR-10来做彩色图片分类,CIFAR-10是一个常用的彩色图片数据集,它有10个类别airplane、automobile、bird、cat、deer、dog、frog、horse、ship和trunk。每张图片都是3×32×32,也就是3通道彩色图片,分辨率为32×32。
我们选几张图片来看一下,今天要做的就是搭建CNN完成这个彩色图片的10分类任务。
2.数据处理
数据集的准备仍然使用torchvison来下载数据集,第一次下载可能会有些慢,如果已经下载好了,可以通过root参数指定。
仍然将数据分为训练集和测试集,还要对数据进行归一化的处理,同时使用批数据处理的方法进行训练,见程序:
# 定义对数据的预处理
transform = transforms.Compose([
transforms.ToTensor(), # 转为Tensor
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)), # 归一化
])
# 训练集
train_data = tv.datasets.CIFAR10(
root='C:\\Users\\hurunqiao\\Downloads',
train=True,
download=True,
transform=transform
)
train_loader = torch.utils.data.DataLoader(
dataset=train_data,
batch_size=Batch_size,
shuffle=True,
num_workers=2
)
# 测试集
test_data = tv.datasets.CIFAR10(
'C:\\Users\\hurunqiao\\Downloads',
train=False,
download=True,
transform=transform
)
test_loader = torch.utils.data.DataLoader(
dataset=test_data,
batch_size=Batch_size,
shuffle=False,
num_workers=2
)
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
还要定义些超参数:Epoch(训练轮数)、Batch_size(批数据处理个数)、LR(学习率)。
# 一些超参数的定义
Epoch = 3
Batch_size = 4
LR = 0.01
3.CNN网络的搭建
我们这次搭建的CNN网络具有两层卷积层、两层池化层和两层全连接层。它们的参数设置如下:
- 卷积层:
- in_channels: 表示输入图像的高度(channel),彩色图像为3。
- out_channels: 表示输出的高度(channel),也可理解为卷积核个数。
- kernel_size: 表示卷积核的大小(5×5的方形)。
- stride: 表示步长。
- padding: 当 stride=1时,如果想要卷积出来的图片长宽没有变化 ,padding=(kernel_size-1)/2。
- 池化层:
使用的是Max Pooling,我们只需要设置池化层Filter的大小。
- 全连接层:
- 输入层单元数: 将处理后的数据展平成一维向量后的个数。<