高 艳
(山西农业大学信息学院,太谷 030800)
2016年3月,谷歌公司利用卷积神经网络开发的人工智能围棋程序Alphago战胜了围棋世界冠军,引起了广泛的关注[1]。卷积神经网络作为深度学习的一种方法,在图像识别、自然语言处理、语音识别等领域有着重要的应用。
神经网络的研究最早开始于20世纪40年代,之后了一定的低谷期,原因在于软硬件的限制无法满足神经网络的极大的并行计算量。21世纪以来,随着软硬件技术的不断发展,有专门处理图像的图像处理器GPU,能够支持大规模的集群节点计算,在此背景下,谷歌公司开发Tensorflow框架出现并得到了快速发展[2]。文章采用基于Tensorflow框架应用卷积神经网络对cifar数据集的50,000张图片进行了处理、建模、训练、测试等,可以为不同行业的进一步应用打下良好的基础。
Tensorflow是Google公司发布的开源人工智能深度学习框架,具有可移植性、可扩展性、高效性、灵活性等特点[3]。TensorFlow提供了丰富的构建和训练机器学习模型的API库,支持卷积神经网络(CNN)、循环神经网络(RNN)、长短期记忆网络(LSTMN)等深度神经网络模型。TensorFlow支持C++、Python、Go、Java、Lua、Javascript、R等主流语言,能够应用到教育、交通、医疗等多个行业[4]。
卷积神经网络的神经元模型[5]如图1所示,
图1 神经元模型
数学公式表达为:
式中,x为输入;w为权重;b为偏置值;f为激活函数。
卷积神经网络主要包括输入层、卷积层、池化层、全连接层、输出层。卷积和池化过程是为了更好的提取图像特征。
(1)输入层:对于图像识别来说输入层即我们输入的原始图像。
(2)卷基层:卷积是一种有效提取图片特征的方法。一般用一个正方形卷积核,遍历图片上的每一个像素点。图片与卷积核重合区域内相对应的每一个像素值乘卷积核内相对应点的权重,然后求和,再加上偏置后,最后得到输出图片中的一个像素值[6],如图2所示。
图2 卷积过程
(3)池化层:卷基层得到的结果并经过激活函数后作为输入,根据池化核窗口以及滑动步长,求得到图片在池化核窗口中最大值或者平均值作为输出,取最大值即为最大池化,取平均值为平均池化,平均池化有利于保留图片背景的特征。
(4)全连接:池化层得到的结果需要进行拉直后喂入全连接网络,使用神经元模型公式进行计算即可,即每个输入值乘以不同的权重求和加偏置并激活经过多次神经网络连接,并且在训练过程中需要舍弃一定的神经元节点,之后通过Softmax函数回归,得到输出层。
图3 全连接过程
实验采用Anaconda软件,并安装jupyter环境,以及TensorFlow框架、numpy库、PIL库等基础上完成。
数据采用keras官方下载的cifar-10-batches-py数据集,包含5万张训练集图片和1万张测试集图片。图像大小为32*32的3通道彩色图像,图片分为10类,分别为飞机、汽车、鸟、猫、鹿、狗、青蛙、马、轮船、卡车,如图4所示。
首先将测试集和训练集的二进制图像转换为jpg格式图像,具体操作是在打开二进制文件的基础上用pickle库对文件进行加载,numpy库对文件进行处理、用scipy库对图形进行保存,通过循环完成所有文件的处理。
图4 10类图片
基于TensorFlow的神经网络,数据用张量(tensor)来表示,神经网络用计算图来搭建,用会话执行计算图,并优化权重得到模型。整个卷积神经网络模型搭建过程如图5所示。
图5 卷积神经网络模型
具体处理步骤如下:
(1)输入层:采用第3.2部分中得到的jpg图像,由于转换后的数据按顺序排列的,需要打乱图片的顺序,并将图片数据转换为数组,根据批次100划分测试集和训练集,然后喂入神经网络卷积层。
(2)卷积、池化层:连续采用2次卷积、激活、池化对图像处理,进行特征提取,卷积层1卷积核大小为5*5,核个数为20,池化层1池化窗口为2*2,步长为2*2,卷积层2的卷积核大小为4*4,核个数为40,池化层2池化窗口为2*2,步长为2*2,之后将数据拉直转化进入全连接层。Tensorflow中采用tf.layers.conv2d()函数、tf.layers.max_pooling2d()函数完成卷积和池化,用tf.nn.relu()函数完成激活。relu函数的公式[7]为:除relu激活函数外,常用的激活函数有sigmoid和tanh。
(3)全连接:在全连接层中为了防止过拟合现象的发生,加入Dropout,取值为0.25,在模型的训练过程中暂时舍弃一部分神经元,使用该模型时被舍弃的神经元恢复正常。Tensorflow中使用tf.layers.dropout()来防止过拟合,使用tf.layers.dense()完成全连接,用arg_max()取每行最大值的索引做为预测值。
根据搭建好卷积神经网络的计算图,利用Tensorflow的会话(Session)功能运行计算图,完成样本训练。
对模型的好坏评价,可以应用“均方误差”、“交叉熵”等方法,让损失函数最小。这里采用“交叉熵”函数来计算训练的损失,使用AdamOptimizer优化器对于损失进行优化,优化学习率为0.001。Tensorflow中采用tf.nn.softmax_cross_entropy_with_logits()进行交叉熵损失计算,使用tf.train.AdamOptimizer()优化损失函数。
“交叉熵”函数的公式为:
式中,y_代表实际值;y代表预测值。
模型训练过程需要不断进行迭代,使得损失尽可能的小,这样建立的卷积神经网络模型也就越好。本文进行了2,000轮的迭代之后得到卷积神经网络的模型。
将测试数据集应用到第3.4部得到的模型中,比较真实的值与模型预测值,查看预测结果的准确率,如果出现准确率比较低的情况,需要调整学习率,激活函数或者加入其他优化方法如滑动平均、正则化等对模型进行进一步的优化。文章经过以上应用模型之后,发现不同图像的准确率有所不同,如表1所示,其中青蛙识别的准确率最高,为79%,汽车的识别准确率为78%,猫和狗的识别准确率最低,分别为41%和53%,所有图像识别的平均准确率为65%。
另外,从每一类别图片被识别为其他错误类别的数量发现,飞机和鸟在识别中容易发生混淆,汽车和卡车识别中容易发生混淆,猫和狗容易容易识别中发生混淆,鹿和马识别中容易发生混淆。
表1 不同种类图片识别准确率
模型建立及训练的过程中可以对卷积核的个数、激活函数、学习率、损失函数、训练轮数不断调整,最后确定教好的模型。对于不同领域中的图片,可以使用不同的卷积神经网络算法,也可以对不同的神经网络算法进行改进,以更好的应用到相关研究领域中。另外可以进一步使用AlexNet等神经网络算法对图片进行识别,提高图片的分类效果。由于自身条件设备等的不足,论文图像识别的准确率还有待进一步提高,之后将会进行更深一步的研究。