如何用CNN实现图像分类的实战技巧?
摘要:本文介绍了CNN的基本概念 以及 如何基于预训练的CNN模型对于CIFAR-10数据集做图像分类的案例。基于预训练好的CNN模型作为基线模型,针对你自己的图片数据集做二次训练(迁移学习),通常可以兼顾成本和性能,是值得采用的实践方式。
大家好,我是Edison。
最近入坑黄佳老师的《AI应用实战课》,记录下我的学习之旅,也算是总结回顾。
今天是我们的第10站,一起了解CNN卷积神经网络 以及 通过CNN做图像分类任务的案例。
CNN卷积神经网络介绍
卷积神经网络(CNN)是一种用于图像识别和处理的人工神经网络,其灵感来自于动物视觉皮层的生物过程。它们由具有可学习权重和偏差的神经元组成。
CNN在至少一个层中使用一种称为卷积的技术,而不是一般的矩阵乘法,卷积是一种特殊的线性运算。
下图展示了一个典型的CNN架构:输入的是图像,输出的是图像的标签。例如下图中输入了一张卡通人物(崔弟鸟)的图片,输出的是几个可能得标签及其概率,其中AI认为Tweety(动画片 崔弟鸟的名字)的概率最高。
那么,从输入到输出之间都经历了什么呢?
输入层一般是图像,这里的图像通常来说图像的张量,它是神经网络能够读取的图片的结构。然后,通过卷积层(Convolution)做图像特征的提取(一般是局部特征),再通过池化(Pooling)降低特征空间的维度,然后继续多次卷积和池化,提取上一层中的特征图的特征,随诊深度网络的加深,特征也就越来越纯,会变得越来越抽象,但神经网络可以理解。最后,经历一个展平层(Flatten Layer)进入全连接层(Fully connected Layer)做一个Softmax激活(激活函数),完成分类输出,上图中输出了3个分类,所有分类的概率值加起来之和为0.7+0.2+0.1=1。
CIFAR-10数据集
接下来,我们要做一个基于CNN的图像分类的案例,那么,就需要一个输入的图片数据集。这里,我们了解一下CIFAR-10数据集,10代表10种常见物体,大概有6万张这10种物体的图片,这个数据集也常用于图像分类问题的教学任务。
这些图片全都是32*32的尺寸,类别包括:飞机、汽车、鸟、猫、鹿、狗、蛙、马、船、卡车,每个类别都有5000张训练图片和1000张测试图片。对于我们用PyTorch来做Demo来说,不需要我们自己将整个数据集手动下载下来并保存到某个目录,使用PyTorch提供的图像库函数会自动帮我们下载和加载到程序中,十分方便。当程序代码完成下载后,CIFAR-10数据集也就会保存到你当前应用程序的目录下:
需要注意的是,下载下来的文件目录中的内容并不是原始的一张张图片,而是已经转化为张量的适合PyTorch读取的格式。
基于CNN做图像分类案例
基线模型:ResNet-18
这里我们使用预训练好的ResNet-18模型作为预训练网络(或者说基线模型),它是一个典型的用于图像识别的CNN神经网络模型。它本身采用了ImageNet的大量图片做了训练,这里我们将其下载下来对我们的CIFAR10数据集做二次训练,也可以称为“迁移学习”。
对于深度学习来说,建议在GPU上进行训练,在CPU上训练会很慢很慢。
