一、基本卷积神经网络
1.Alexnet
2.VGG-16
VGG16(Visual Geometry Group 16)是由牛津大学视觉几何组(Visual Geometry Group)开发的深度卷积神经网络架构之一,用于图像分类和识别任务。VGG16由16个卷积层和3个全连接层组成,因此得名。
结构
说明
- 改进
- 更深的网络结构: VGG16比AlexNet更深,通过堆叠更多的卷积层和池化层,可以更好地学习图像的特征。网络规模进一步增大,参数数量约为1.38亿。
- 小卷积核的使用: VGG16采用了连续的3x3卷积核,相比于AlexNet的11x11和5x5卷积核,这样的设计使得网络对特征的挖掘能力更加深入。
- 减少全连接层的使用: VGG16相比于AlexNet减少了全连接层的数量,从而降低了过拟合的风险,提高了模型的泛化能力。
- 由于各卷积层、池化层的超参数基本相同,整体结构呈现出规整的特点。
- 普遍规律
随着网络深入,高和宽衰减,通道数增多
优缺点
- 优点:
- 表征能力强: VGG16通过堆叠多个卷积层和池化层,能够学习到更加复杂和抽象的图像特征,从而提高了网络的表征能力。
- 易于理解和实现: VGG16的结构相对简单,只有基本的卷积和池化层,因此易于理解和实现。
- 通用性强: VGG16在各种图像分类任务中表现良好,具有较好的通用性。
- 缺点:
- 参数量大: VGG16拥有大量的参数,这导致了网络模型的尺寸较大,不利于在资源有限的情况下部署和训练。
- 计算量大: 由于网络深度较大,VGG16的计算量较大,训练和推断时间较长,不太适用于实时性要求高的应用场景。
- 容易过拟合: VGG16相对于AlexNet减少了全连接层,但仍然有较多参数,容易在训练过程中出现过拟合的问题,特别是在数据集较小的情况下。
示例
示例代码搭建的网络结构为为vgg-11,在jupyter notebbok中运行
import torch
from torch import nn
from d2l import torch as d2l
def vgg_block(num_convs, in_channels, out_channels):
layers = []
for _ in range(num_convs):
layers.append(nn.Conv2d(in_channels, out_channels,
kernel_size=3, padding=1))
layers.append(nn.ReLU())
in_channels = out_channels
layers.append(nn.MaxPool2d(kernel_size=2,stride=2))
return nn.Sequential(*layers)
conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))
def vgg(conv_arch):
conv_blks = []
in_channels = 1
# 卷积层部分
for (num_convs, out_channels) in conv_arch:
conv_blks.append(vgg_block(num_convs, in_channels, out_channels))
in_channels = out_channels
return nn.Sequential(
*conv_blks, nn.Flatten(),
# 全连接层部分
nn.Linear(out_channels * 7 * 7, 4096), nn.ReLU(), nn.Dropout(0.5),
nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(0.5),
nn.Linear(4096, 10))
net = vgg(conv_arch)
X = torch.randn(size=(1, 1, 224, 224))
for blk in net:
X = blk(X)
print(blk.__class__.__name__,'output shape:\t',X.shape)
ratio = 4
small_conv_arch = [(pair[0], pair[1] // ratio) for pair in conv_arch]
net = vgg(small_conv_arch)
lr, num_epochs, batch_size = 0.05, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
- 运行结果
2.残差网络
残差网络(Residual Network,简称ResNet)是一种由微软亚洲研究院提出的深度神经网络架构,旨在解决深度神经网络训练过程中的梯度消失和网络退化问题。ResNet通过引入残差连接(residual connections)来允许网络学习残差,从而更有效地训练深度网络。
Deep residual learning for image recognition
梯度消失问题
非残差网络的缺陷:理想情况下,随着网络的加深,训练后的性能会递增,然而实际上,层数过多后网络的性能反而开始下降。引起这种现象的主要原因是梯度消失。
梯度消失问题通常出现在深度网络中,特别是在使用一些特定的激活函数(比如 Sigmoid 和 Tanh)时更加明显,因为这些激活函数的导数在输入值很大或很小的时候会趋近于零(下图为sigmoid函数及其导数),从而使得反向传播时梯度减小。当梯度逐层递减时,越靠近输入端的层的权重更新越缓慢,因此这些层可能无法有效地学习到有用的特征。
基本原理
为了解决梯度消失问题和由此引发的网络退化问题,ResNet引入了残差连接。在传统的神经网络中,假设某一层的输入为x,输出为H(x),则网络学习的目标是学习从输入x到输出H(x)的映射。如果我们认为H(x)的表达能力不够,即网络无法完全学习到期望的映射,我们可以考虑引入一个残差F(x),使得H(x)= F(x)+x。这样,网络的学习目标就转变为学习残差F(x)而非完整的映射H(x)。
- 残差块(Residual Block)
ResNet中的基本组件是残差块。一个残差块由两个连续的卷积层组成,中间通过恒等映射(identity mapping)连接。设输入为x,第一个卷积层的输出为F(x),第二个卷积层的输出为H(x)=F(x)+x,结构如下:
优势
- 梯度传播: 残差块允许梯度沿着残差连接直接传播到前面的层,从而避免了梯度在传播过程中逐层递减的问题。在传统的深度神经网络中,梯度逐层递减可能导致梯度消失,使得较浅层的参数无法得到有效的更新。而残差块的引入使得梯度能够更好地传播,从而提高了网络的训练效果。
- 学习残差: 残差块的设计思想是让网络学习残差而非完整的映射。通过引入残差连接,网络只需要学习到输入和输出之间的差异,即残差,而不需要学习完整的映射。这使得网络更容易优化,加快了训练速度,并且有助于提高网络的泛化能力。
- 解决网络退化问题: 深度神经网络的一个常见问题是网络退化(network degradation),即随着网络深度的增加,网络性能开始下降。残差块通过引入残差连接,即使网络变得非常深,也不会出现性能下降的情况,从而缓解了网络退化问题。
- 增加网络深度: 由于残差块解决了梯度消失问题,因此可以构建更深的网络结构。更深的网络通常具有更强的表达能力,可以学习到更复杂的特征,因此残差块的引入使得网络能够更好地适应复杂的任务。
残差网络
- 普通网络的基准模型受VGG网络的启发
- 卷积层主要有3×3的过滤器,并遵循两个简单的设计规则:
- 对输出特征图的尺寸相同的各层,都有相同数量的过滤器;
- 如果特征图的大小减半,那么过滤器的数量就增加倍,以保证每一层的时间复杂度相同。
- ResNet模型比VGG网络更少的过滤器和更低的复杂性。ResNet具有34层的权重层,有36亿FLOPs,只有VGG-19 ( 19.6亿FLOPs)的18%。
网络结构
性能
示例
在这里插入代码片
- 运行结果
二、常用数据集
1. MNIST
MNIST 数据集是一个常用的手写数字识别数据集,由 Yann LeCun 等人收集并发布。它包含了 60000 个训练样本和 10000 个测试样本,每个样本都是一个 28x28 像素的灰度图像,表示了一个手写的单个数字(0 到 9)。MNIST 数据集的特点包括:
- 简单易用: MNIST 数据集是深度学习领域最常用的数据集之一,因为它简单易用,可以用于快速测试和验证模型的性能。
- 标签清晰: 每个样本都有一个对应的标签,表示图像中手写数字的真实值,使得该数据集适用于监督学习任务。
- 标准化: MNIST 数据集已经被标准化处理过,图像中的数字位于中心位置,且大小一致,这样有助于模型对图像进行统一处理。
- 小规模: MNIST 数据集相对较小,训练和测试速度比较快,因此适合用于教学、演示以及快速原型设计。
MNIST 数据集通常被用来作为深度学习模型的基准测试,许多学术研究和算法验证都会使用这个数据集。同时,由于 MNIST 数据集相对简单,一些基础的模型如多层感知机(MLP)、卷积神经网络(CNN)等也可以在这个数据集上获得不错的性能。
- MINST数据集加载
def load_data_fashion_mnist(batch_size, resize=None): #@save
"""下载Fashion-MNIST数据集,然后将其加载到内存中。"""
trans = [transforms.ToTensor()]
if resize:
trans.insert(0, transforms.Resize(resize))
trans = transforms.Compose(trans)
mnist_train = torchvision.datasets.FashionMNIST(
root="../data", train=True, transform=trans, download=True)
mnist_test = torchvision.datasets.FashionMNIST(
root="../data", train=False, transform=trans, download=True)
return (data.DataLoader(mnist_train, batch_size, shuffle=True,
num_workers=get_dataloader_workers()),
data.DataLoader(mnist_test, batch_size, shuffle=False,
num_workers=get_dataloader_workers()))
2. Fashion-MNIST数据集
- FashionMNIST 是一个替代 MNIST 手写数字集 的图像数据集。它是由Zalando旗下的研究部门提供,涵盖了来自 10 种类别的共 7 万个不同商品的正面图片。
- FashionMNIST 的大小、格式和训练集/测试集划分与原始的MNIST 完全一致。60000/10000 的训练测试数据划分,28x28的灰度图片。你可以直接用它来测试你的机器学习和深度学习算法性能,且不需要改动任何的代码。
以下是数据集中的类,以及来自每个类的10个随机图像:
3. CIFAR-10数据集
CIFAR-10数据集由10个类的60000个32x32彩色图像组成,每个类有6000个图像。有50000个训练图像和10000个测试图像数据集。分为五个训练批次和一个测试批次,每个批次有10000个图像。测试批次包含来自每个类别的恰好1000个随机选择的图像。
- 以下是数据集中的类,以及来自每个类的10个随机图像:
4. PASCAL VOC数据集
- PASCAL的全称是Pattern Analysis, Statistical Modelling and Computational Learning
- VOC的全称是Visual Object Classes
- 目标分类(识别)、检测、分割最常用的数据集之一
- 第一届PASCAL VOC举办于2005年,2012年终止。常用的是PASCAL 2012
- 一共分成20类:
- person
- bird, cat, cow, dog, horse, sheep
- aeroplane, bicycle, boat, bus, car, motorbike, train
- bottle, chair, dining table, potted plant, sofa, tv/monitor
文件格式:
标注格式:
里面是图像对应的XML标注信息描述,每张图像有一个与之对应同名的描述XML文件,XML前面部分声明图像数据来源,大小等元信息,举例如下
Pascal VOC2012 Main中统计的训练、验证、验证与训练、测试图像:
20类图像实例:
5. MS COCO数据集
- MS COCO的全称是Microsoft Common Objects in Context,起源于微软于2014年出资标注的Microsoft COCO数据集
- 数据集以scene understanding为目标,主要从复杂的日常场景中截取
- 包含目标分类(识别)、检测、分割、语义标注等数据集
- ImageNet竞赛停办后,COCO竞赛就成为是当前目标识别、检测等领域的一个最权威、最重要的标杆
- 官网:http://cocodataset.org
- 提供的标注类别有80 类,有超过33 万张图片,其中20 万张有标注,整个数据集中个体的数目超过150 万个。
- 人:1类
- 交通工具:8类,自行车,汽车等
- 公路常见:5类,信号灯,停车标志等
- 动物:10类,猫狗等
- 携带物品:5类,背包,雨伞等
- 运动器材:10类,飞盘,滑雪板,网球拍等。
- 厨房餐具:7类,瓶子,勺子等
- 水果及食品:10类
- 家庭用品:7类,椅子、床,电视等
- 家庭常见物品:17类,笔记本,鼠标,遥控器等
MS COCO数据集示例:
6. ImageNet数据集
- 始于2009年,李飞飞与Google的合作:“ImageNet: A Large-Scale Hierarchical Image Database”
- 总图像数据:14,197,122
- 总类别数:21841
- 带有标记框的图像数:1,034,908
7. ISLVRC 2012子数据集
- 训练集:1,281,167张图片+标签
- 类别数:1,000
- 验证集:50,000张图片+标签
- 测试集:100,000张图片