本篇博文主要介绍AlexNet以及利用PyTorch实现AlexNet训练CIFAR10数据集,最终在CIFAR10实现了75%的识别率。
AlexNet详解
AlexNet的网络结构分为5个卷积层和三个全连接层,原文中因为显存原因使用了两块GPU,现在我们使用1块GPU,AlexNet是VGGNet、GoogLeNet、ResNet、DenseNet等经典网络的基础和开端。
AlexNet的创新点
Relu作为激活函数
在最初的模型中,输入和输出的关系一般如下所示:
这样仅仅是纯粹的线性关系,具有较大的局限性,即使有多层网络,也难以拟合出
后来我们引入了和函数,相关的激活函数可以看[常用的激活函数].
数据增强
AlexNet中对数据做了以下操作:
- 随机裁剪,对256×256的图片进行随机裁剪到227×227,然后进行水平翻转。
- 测试的时候,对左上、右上、左下、右下、中间分别做了5次裁剪,然后翻转,共10个裁剪,之后对结果求平均。
- 对RGB空间做PCA(主成分分析),然后对主成分做一个(0, 0.1)的高斯扰动,也就是对颜色、光照作变换,结果使错误率又下降了1%。
层叠池化
在AlexNet中,池化是可重叠的,每次池化单元移动的步长小于自身的大小。
局部相应归一化
Dropout
AlexNet的网络结构
AlexNet的网络包含5层卷积层和3层全连接层。
卷积层结构
全连接层结构
AlexNet网络代码如下(训练CIFAR10数据集)
class AlexNet(nn.Module):
def __init__(self, num_classes=NUM_CLASSES):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=3, stride=2, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2),
nn.Conv2d(64, 192, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2),
nn.Conv2d(192, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2),
)
self.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(256 * 2 * 2, 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 = x.view(x.size(0), 256 * 2 * 2)
x = self.classifier(x)
return x
特别说明:
1.Conv2d的参数说明:
nn.Conv2d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True)
在nn.Conv2d中,in_channels表示输入数据体的深度,out_channel。表示输出数据体的深度,kernel_size表示卷积核的大小,stride表示滑动的步长,padding表示边界填充0的个数,dilation表示输入数据体的空间间隔,groups表示输入数据体和输出数据体在深度上的关联,bias表示偏置。
网友评论