• 欢迎访问佰阅部落,本站为优质开源程序分享站,所有自研项目均开源免费,可在Github查看源码。 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧
  • 欢迎积极参与讨论、反馈问题

图像分类训练-使用LetNet卷积网络分类CIFAR10

人工智能 佰阅部落 3周前 (07-24) 159次浏览
文章目录[隐藏]

图像分类训练发展至今,究竟有多少种卷积神经网络呢?从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. 相关参考


佰阅部落 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:图像分类训练-使用LetNet卷积网络分类CIFAR10
赞一下 (1)
佰阅部落
关于作者:
爱折腾,爱学习,用心分享各种实用搭建教程,让优质web程序脱颖而出,欢迎订阅!