原文链接:点击打开链接
摘要: 为了让文章不那么枯燥,我构建了一个精灵图鉴数据集(Pokedex)这都是一些受欢迎的精灵图。我们在已经准备好的图像数据集上,使用Keras库训练一个卷积神经网络(CNN)。
为了让文章不那么枯燥,我构建了一个精灵图鉴数据集(Pokedex)这都是一些受欢迎的精灵图。我们在已经准备好的图像数据集上,使用Keras库训练一个卷积神经网络(CNN)。
深度学习数据集
上图是来自我们的精灵图鉴深度学习数据集中的合成图样本。我的目标是使用Keras库和深度学习训练一个CNN,对Pokedex数据集中的图像进行识别和分类。Pokedex数据集包括:Bulbasaur (234 images);Charmander (238 images);Squirtle (223 images);Pikachu (234 images);Mewtwo (239 images)
训练图像包括以下组合:电视或电影的静态帧;交易卡;行动人物;玩具和小玩意儿;图纸和粉丝的艺术效果图。
在这种多样化的训练图像的情况下,实验结果证明,CNN模型的分类准确度高达97%!
CNN和Keras库的项目结构
该项目分为几个部分,目录结构如下:
如上图所示,共分为3个目录:
1.数据集:包含五个类,每个类都是一个子目录。
2.示例:包含用于测试卷积神经网络的图像。
3.pyimagesearch模块:包含我们的SmallerVGGNet模型类。
另外,根目录下有5个文件:
1.plot.png:训练脚本运行后,生成的训练/测试准确性和损耗图。
2.lb.pickle:LabelBinarizer序列化文件,在类名称查找机制中包含类索引。
3.pokedex.model:序列化Keras CNN模型文件(即“权重文件”)。
4.train.py:训练Keras CNN,绘制准确性/损耗函数,然后将卷积神经网络和类标签二进制文件序列化到磁盘。
5.classify.py:测试脚本。
Keras和CNN架构
我们今天使用的CNN架构,是由Simonyan和Zisserman在2014年的论文“用于大规模图像识别的强深度卷积网络”中介绍的VGGNet网络的简单版本,结构图如上图所示。该网络架构的特点是:
1.只使用3*3的卷积层堆叠在一起来增加深度。
2.使用最大池化来减小数组大小。
3.网络末端全连接层在softmax分类器之前。
假设你已经在系统上安装并配置了Keras。如果没有,请参照以下连接了解开发环境的配置教程:
2.设置Ubuntu 16.04 + CUDA + GPU,使用Python进行深度学习。
继续使用SmallerVGGNet——VGGNet的更小版本。在pyimagesearch模块中创建一个名为smallervggnet.py的新文件,并插入以下代码:
注意:在pyimagesearch中创建一个_init_.py文件,以便Python知道该目录是一个模块。如果你对_init_.py文件不熟悉或者不知道如何使用它来创建模块,你只需在原文的“下载”部分下载目录结构、源代码、数据集和示例图像。
现在定义SmallerVGGNet类:
该构建方法需要四个参数:
1.width:图像宽度。
2.height :图像高度。
3.depth :图像深度。
4.classes :数据集中类的数量(这将影响模型的最后一层),我们使用了5个Pokemon 类。
注意:我们使用的是深度为3、大小为96 * 96的输入图像。后边解释输入数组通过网络的空间维度时,请记住这一点。
由于我们使用的是TensorFlow后台,因此用“channels last”对输入数据进行排序;如果想用“channels last”,则可以用代码中的23-25行进行处理。
为模型添加层,下图为第一个CONV => RELU => POOL代码块:
卷积层有32个内核大小为3*3的滤波器,使用RELU激活函数,然后进行批量标准化。
池化层使用3 *3的池化,将空间维度从96 *96快速降低到32 * 32(输入图像的大小为96 * 96 * 3的来训练网络)。
如代码所示,在网络架构中使用Dropout。Dropout随机将节点从当前层断开,并连接到下一层。这个随机断开的过程有助于降低模型中的冗余——网络层中没有任何单个节点负责预测某个类、对象、边或角。
在使用另外一个池化层前,添加(CONV => RELU)* 2层:
在降低输入数组的空间维度前,将多个卷积层RELU层堆叠在一起可以学习更丰富的特征集。
请注意:将滤波器大小从32增加到64。随着网络的深入,输入数组的空间维度越小,滤波器学习到的内容更多;将最大池化层从3*3降低到2*2,以确保不会过快地降低空间维度。在这个过程中再次执行Dropout。
再添加一个(CONV => RELU)* 2 => POOL代码块:
我们已经将滤波器的大小增加到128。对25%的节点执行Droupout以减少过拟合。
最后,还有一组FC => RELU层和一个softmax分类器:
Dense(1024)使用具有校正的线性单位激活和批量归一化指定全连接层。
最后再执行一次Droupout——在训练期间我们Droupout了50%的节点。通常情况下,你会在全连接层在较低速