本周首先介绍了AlexNet网络。
AlexNet是一个深度卷积神经网络模型,由Alex Krizhevsky等人在2012年提出,是第一个在ImageNet图像识别竞赛中获得冠军的深度学习模型。
AlexNet模型包含8个卷积层和3个全连接层,具有60百万个参数和650,000个神经元。与传统的神经网络相比,AlexNet模型采用了多个技术改进,如ReLU激活函数、局部响应归一化、dropout等,从而提高了模型的准确率和泛化能力。
AlexNet的突破性贡献在于:(1)采用GPU加速训练,极大地提高了训练速度;(2)采用了大规模无标注数据(ImageNet数据集)进行预训练,避免了传统方法中需要手动标注的缺陷;(3)通过增加网络深度和使用更多的神经元,实现了更好的图像识别性能。
AlexNet的成功为深度学习在图像识别领域的应用奠定了基础,并引领了后来的深度学习研究。
AlexNet的具体网络结构如下:
- 输入层:图像大小为227x227x3
- 第一层:卷积层,96个11x11的卷积核,步长为4,使用ReLU激活函数,输出的特征图大小为55x55x96。
- 第二层:局部响应归一化层,对每个位置在相邻通道上进行归一化。
- 第三层:最大池化层,3x3的池化窗口,步长为2,输出的特征图大小为27x27x96。
- 第四层:卷积层,256个5x5的卷积核,步长为1,使用ReLU激活函数,输出的特征图大小为27x27x256。
- 第五层:局部响应归一化层。
- 第六层:最大池化层,3x3的池化窗口,步长为2,输出的特征图大小为13x13x256。
- 第七层:卷积层,384个3x3的卷积核,步长为1,使用ReLU激活函数,输出的特征图大小为13x13x384。
- 第八层:卷积层,384个3x3的卷积核,步长为1,使用ReLU激活函数,输出的特征图大小为13x13x384。
- 第九层:卷积层,256个3x3的卷积核,步长为1,使用ReLU激活函数,输出的特征图大小为13x13x256。
- 第十层:最大池化层,3x3的池化窗口,步长为2,输出的特征图大小为6x6x256。
- 第十一层:全连接层,4096个神经元,使用ReLU激活函数。
- 第十二层:Dropout层,减少过拟合。
- 第十三层:全连接层,4096个神经元,使用ReLU激活函数。
- 第十四层:Dropout层。
- 第十五层:输出层,1000个神经元,使用softmax函数进行分类。
AlexNet总共包含了5个卷积层、3个全连接层和3个池化层,其中第一层卷积层采用了较大的卷积核和步长,可以提取更高层次的特征。同时,局部响应归一化层和Dropout层的使用有助于减少过拟合。
下面是使用PyTorch实现AlexNet网络的代码示例:
import torch
import torch.nn as nn
class AlexNet(nn.Module):
def __init__(self, num_classes=1000):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 96, kernel_size=11, stride=4),
nn.ReLU(inplace=True),
nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75, k=2),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(96, 256, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75, k=2),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(256, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
)
self.avgpool = nn.AdaptiveAvgPool2d((6, 6))
self.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, num_classes),
)
def forward(self, x):
x = self.features(x)
x = self.avgpool(x)
x = torch.flatten(x, 1)
x = self.classifier(x)
return x
之后介绍了VGG-16。
VGG-16是由牛津大学的研究者Simonyan和Zisserman在2014年提出的一种深度卷积神经网络,它在ImageNet图像识别竞赛中取得了很好的表现,被广泛应用于图像分类、目标检测等计算机视觉任务中。
VGG-16的名字来源于它的网络结构,它包含16个卷积层和3个全连接层,其中卷积层的核大小均为 3 × 3 3 \times 3 3×3,步长均为1,填充为1,而池化层的核大小均为 2 × 2 2 \times 2 2×2,步长为2,使用最大池化方式。VGG-16相较于之前的卷积神经网络,它的深度更深,参数更多,但是也更容易训练。
下面是VGG-16的具体网络结构:
输入层(224 x 224 x 3)
卷积层1-1:64个 3x3 的卷积核,填充1,步长1
卷积层1-2:64个 3x3 的卷积核,填充1,步长1
池化层1:2x2的最大池化,步长2
卷积层2-1:128个 3x3 的卷积核,填充1,步长1
卷积层2-2:128个 3x3 的卷积核,填充1,步长1
池化层2:2x2的最大池化,步长2
卷积层3-1:256个 3x3 的卷积核,填充1,步长1
卷积层3-2:256个 3x3 的卷积核,填充1,步长1
卷积层3-3:256个 3x3 的卷积核,填充1,步长1
池化层3:2x2的最大池化,步长2
卷积层4-1:512个 3x3 的卷积核,填充1,步长1
卷积层4-2:512个 3x3 的卷积核,填充1,步长1
卷积层4-3:512个 3x3 的卷积核,填充1,步长1
池化层4:2x2的最大池化,步长2
卷积层5-1:512个 3x3 的卷积核,填充1,步长1
卷积层5-2:512个 3x3 的卷积核,填充1,步长1
卷积层5-3:512个 3x3 的卷积核,填充1,步长1
池化层5:2x2的最大池化,步长2
全连接层1:4096个神经元
全连接层2:4096个神经元
全连接层3:1000个神经元(对应ImageNet数据集的1000个类别)
输出层:Softmax
VGG-16使用了多个小卷积核来代替一个大卷积核,这样做有两个好处:一是可以减少网络参数,加速网络的训练和推断过程;二是可以提高网络的性能,增强网络的表达能力,减少过拟合的风险。
VGG-16的网络结构非常简单清晰,这也是它受欢迎的原因之一。虽然VGG-16已经有些年头了,但它仍然是一个很好的基准模型,许多后来的网络结构都是基于VGG-16的改进。
之后介绍残差网络。
残差网络(ResNet)是由微软亚洲研究院的研究者He等人在2015年提出的一种深度卷积神经网络,它的主要特点是使用残差模块(Residual block)来解决深度卷积神经网络中梯度消失和梯度爆炸的问题。
在传统的卷积神经网络中,每个卷积层的输入都是上一层的输出。当网络变得很深时,由于深层的特征很难直接传到输出层,因此网络的性能会下降。这种现象被称为“退化”问题,通常通过增加层数、使用更小的卷积核、减小步长等方式来缓解,但这些方法仍然无法解决这个问题。
残差网络提出了一种全新的思路:不直接学习输入和输出之间的映射,而是学习残差映射。在残差模块中,网络在学习一个残差映射的同时,保留了原始的输入特征,这样可以确保高层特征的表示不会损失原始特征的信息。在残差模块中,输入特征首先经过一系列的卷积层和激活函数,然后与输入特征进行相加,最终输出残差映射的结果。
具体来说,残差模块的结构如下所示:
输入特征
|
卷积层
|
ReLU激活函数
|
卷积层
|
输出特征(加上输入特征)
|
ReLU激活函数
残差模块的引入使得网络可以更加深层,并且可以更容易地训练。残差网络还使用了一种被称为“bottleneck”的结构,在卷积层中使用了1x1的卷积核来降低计算复杂度,提高网络性能。
之后介绍了一些常用的数据集。
MNIST(Modified National Institute of Standards and Technology)是一种常用的手写数字识别数据集。它由美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)于1998年制作,由于其数据集被广泛使用,因此被称为MNIST数据集。
MNIST数据集包含60,000个训练图像和10,000个测试图像,每个图像都是28x28像素大小的灰度图像。这些图像是由不同的人手写的数字0-9。
MNIST数据集的应用十分广泛,主要用于手写数字识别的算法验证和性能比较。很多深度学习框架都提供了MNIST数据集的预处理函数,使得使用MNIST数据集进行实验变得十分容易。
Fashion-MNIST是一种用于衣物分类任务的图像数据集,由Zalando研究机构在2017年发布。它是对MNIST数据集的一种扩展,由于MNIST数据集在手写数字识别方面的易用性和广泛使用性,因此Fashion-MNIST也得到了广泛的应用。
Fashion-MNIST数据集包含60,000个训练图像和10,000个测试图像,每个图像都是28x28像素大小的灰度图像。这些图像包含10个类别的服装和鞋子。
Fashion-MNIST数据集的类别包括:T-shirt/top, Trouser, Pullover, Dress, Coat, Sandal, Shirt, Sneaker, Bag, Ankle boot。与MNIST数据集不同,Fashion-MNIST数据集中的图像包含了更加复杂的纹理和形状,因此对于图像分类算法的性能评估更加具有挑战性。
与MNIST数据集类似,Fashion-MNIST数据集的应用也十分广泛,主要用于图像分类算法的验证和性能比较。很多深度学习框架都提供了Fashion-MNIST数据集的预处理函数,使得使用Fashion-MNIST数据集进行实验变得十分容易。
CIFAR-10是一个常用的用于图像分类的数据集,由加拿大计算机科学研究所(Canadian Institute for Advanced Research)在2009年发布。它包含10个类别的图像,每个类别有5,000张训练图像和1,000张测试图像。每个图像都是32x32像素大小的彩色图像。
CIFAR-10数据集中的10个类别分别为:airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truck。CIFAR-10数据集中的图像相对于MNIST和Fashion-MNIST数据集来说更加复杂和多样化,因此对于图像分类算法的性能评估更加具有挑战性。
CIFAR-10数据集的应用也十分广泛,主要用于图像分类算法的验证和性能比较。很多深度学习框架都提供了CIFAR-10数据集的预处理函数,使得使用CIFAR-10数据集进行实验变得十分容易。