图像分类训练发展至今,究竟有多少种卷积神经网络呢?从1998年经典的LetNet,到2012年历史性的AlexNet,之后深度学习进入了蓬勃发展阶段,百花齐放,大放异彩。而LetNet是入门卷积神经网络的必经之路,因为其包含和卷积神经网络的基本框架,也就是卷积层、激活、池化层、全连接安全层,这几个基本组件也是后续许多神经网络的基本单元。
0. 图像分类训练一般步骤
大致分为三步骤,第一步是数据的分类整理,获得原始的训练集和测试集;第二步是筛选合适的神经网络进行训练,并保存训练后的结果模型;第三步是加载训练好的模型,预测未知的测试集数据。
其中第一步要做的事情,就是在data目录下,每种分类建立一个文件夹,文件夹内存放该分类下的图片。
CIFAR10
是比较经典的数据集,包含5万张训练图像和1万张测试图像,大小均为32*32像素。
1. LetNet卷积神经网络
LetNet网络可以用下图说明:
用代码形式展现为如下(Pytorch):
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
其中conv代表卷积提取特征;relu激活函数;pool为池化层。
在CIFAR10默认的卷积网络下,最终测试精度如下:
64%的精度对我们而言比较牵强,因此我又开始调整了下这个神经网络,扩展conv层为3层。
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.pool = nn.MaxPool2d(2, 2) #2*2池化层,步长为2
self.conv1 = nn.Conv2d(3, 14, 5) #
self.conv2 = nn.Conv2d(14, 28, 5) #
self.conv3 = nn.Conv2d(28, 32, 5) #增加一层
self.fc1 = nn.Linear(32 * 4 * 4, 360)
self.fc2 = nn.Linear(360, 120)
self.fc3 = nn.Linear(120, 10)
# 9通道,5x,66%,84s
def forward(self, x):
x = F.relu(self.conv1(x)) #32*32*3cov>>28*28*14
x = self.pool(F.relu(self.conv2(x))) #28*28*14>>24*24*28>>12*12*28
x = self.pool(F.relu(self.conv3(x))) #12*12*28>>8*8*32>>4*4*32
x = x.view(-1, 32 * 4 * 4)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
2. 讨论
增加conv层后,精度提高约5~8%,最好的时候可以到72%。不论原始的维度如何降为,letNet网络似乎最多就只能用3层网络,也有人直接做到1*1维度,其中的影响我目前还不是很清楚,不过可以直观的看到,增加卷积层可以提高精度,那如果只用一层呢?结果测试时发现,精度也达到了68%,可能得益于原始通道的信息提取。
于是乎,我把最原始的3通道变成64通道,使用两层卷积网络后,精度令人惊讶的趋近73%。
当我继续加大通到的256时,GPU的cuda占用率终于达到90%多,训练4次就可以达到72%的精度,遗憾的是越往后,精度没有继续提高。而且训练时间也比上一次增加3倍。
3. 小结
虽然LetNet在1998年就已经诞生,但是目前实践中还是有很多人在用,毕竟模型简单好理解,足够胜任普通的图像分类。当前针对CIFAR-10分类,paperswithcode网站给出的最高排行榜上,BiT-L(ResNet)的精度为99.37%,虽然没有线性代数上的99.99的精度,但是足以说明人工智能神经网络的强悍之处。后面我将继续学习其他卷积网络模式,尝试获得更高精度。
4. 相关参考
- Image Classification on CIFAR-10
- 从LeNet到SENet——卷积神经网络回顾
- ImageNet Classification
- 文章代码请参考Pytorch官方文档:TRAINING A CLASSIFIER