超干货|使用Keras和CNN构建分类器(内含代码和讲解)

本文介绍了一种使用Keras库和卷积神经网络(CNN)对精灵图鉴数据集(Pokedex)进行图像识别和分类的方法。数据集包括五种精灵的图片,经过训练的CNN模型准确率达到了97%。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:点击打开链接

摘要: 为了让文章不那么枯燥,我构建了一个精灵图鉴数据集(Pokedex)这都是一些受欢迎的精灵图。我们在已经准备好的图像数据集上,使用Keras库训练一个卷积神经网络(CNN)。

74cd6dbf236d26a199fb2f29dece5ae47a4e53cc

为了让文章不那么枯燥,我构建了一个精灵图鉴数据集(Pokedex)这都是一些受欢迎的精灵图。我们在已经准备好的图像数据集上,使用Keras库训练一个卷积神经网络(CNN)。

深度学习数据集

d87ab9910a11cc65ec1ab1be9ac003604eca1e91

上图是来自我们的精灵图鉴深度学习数据集中的合成图样本。我的目标是使用Keras库和深度学习训练一个CNN,对Pokedex数据集中的图像进行识别和分类。Pokedex数据集包括:Bulbasaur (234 images)Charmander (238 images)Squirtle (223 images)Pikachu (234 images)Mewtwo (239 images)

训练图像包括以下组合:电视或电影的静态帧;交易卡;行动人物;玩具和小玩意儿;图纸和粉丝的艺术效果图。

在这种多样化的训练图像的情况下,实验结果证明,CNN模型的分类准确度高达97

CNNKeras库的项目结构

该项目分为几个部分,目录结构如下:

8daf475569c1d60485da5982d5167731a115a188

如上图所示,共分为3个目录:

1.数据集:包含五个类,每个类都是一个子目录。

2.示例:包含用于测试卷积神经网络的图像。

3.pyimagesearch模块:包含我们的SmallerVGGNet模型类。

另外,根目录下有5个文件:

1.plot.png:训练脚本运行后,生成的训练/测试准确性和损耗图。

2.lb.pickleLabelBinarizer序列化文件,在类名称查找机制中包含类索引。

3.pokedex.model:序列化Keras CNN模型文件(即权重文件)。

4.train.py:训练Keras CNN,绘制准确性/损耗函数,然后将卷积神经网络和类标签二进制文件序列化到磁盘。

5.classify.py:测试脚本。

KerasCNN架构

b4e67c79263f79cede4100ec3140fc02a3606a6c

我们今天使用的CNN架构,是由SimonyanZisserman2014年的论文用于大规模图像识别的强深度卷积网络中介绍的VGGNet网络的简单版本,结构图如上图所示。该网络架构的特点是:

1.只使用3*3的卷积层堆叠在一起来增加深度。

2.使用最大池化来减小数组大小。

3.网络末端全连接层在softmax分类器之前。

假设你已经在系统上安装并配置了Keras。如果没有,请参照以下连接了解开发环境的配置教程:

1.配置Ubuntu,使用Python进行深度学习。

2.设置Ubuntu 16.04 + CUDA + GPU,使用Python进行深度学习。

3.配置macOS,使用Python进行深度学习。

继续使用SmallerVGGNet——VGGNet的更小版本。在pyimagesearch模块中创建一个名为smallervggnet.py的新文件,并插入以下代码:

177e8b4b3372389c5622639a99b2a9bbded4d884

注意:在pyimagesearch中创建一个_init_.py文件,以便Python知道该目录是一个模块。如果你对_init_.py文件不熟悉或者不知道如何使用它来创建模块,你只需在原文的下载部分下载目录结构、源代码、数据集和示例图像。

现在定义SmallerVGGNet类:

9323dd7a70f4278ceaf8eae398d478adb39fb5db

该构建方法需要四个参数:

1.width:图像宽度。

2.height :图像高度。

3.depth :图像深度。

4.classes :数据集中类的数量(这将影响模型的最后一层),我们使用了5Pokemon 类。

注意:我们使用的是深度为3、大小为96 * 96的输入图像。后边解释输入数组通过网络的空间维度时,请记住这一点。

由于我们使用的是TensorFlow后台,因此用“channels last”对输入数据进行排序;如果想用“channels last”,则可以用代码中的23-25行进行处理。

为模型添加层,下图为第一个CONV => RELU => POOL代码块:

40e8d6c6456c4088f69d8597393d4a27f289d66f

卷积层有32个内核大小为3*3的滤波器,使用RELU激活函数,然后进行批量标准化。

池化层使用3 *3的池化,将空间维度从96 *96快速降低到32 * 32(输入图像的大小为96 * 96 * 3的来训练网络)。

如代码所示,在网络架构中使用DropoutDropout随机将节点从当前层断开,并连接到下一层。这个随机断开的过程有助于降低模型中的冗余——网络层中没有任何单个节点负责预测某个类、对象、边或角。

在使用另外一个池化层前,添加(CONV => RELU* 2层:

50f5b7b22754baafa44f80a75d592e3d42dd4adc

在降低输入数组的空间维度前,将多个卷积层RELU层堆叠在一起可以学习更丰富的特征集。

请注意:将滤波器大小从32增加到64。随着网络的深入,输入数组的空间维度越小,滤波器学习到的内容更多;将最大池化层从3*3降低到2*2,以确保不会过快地降低空间维度。在这个过程中再次执行Dropout

再添加一个(CONV => RELU)* 2 => POOL代码块:

549c4da065012471ec6d340f84e6ef3d365fb74a

我们已经将滤波器的大小增加到128。对25%的节点执行Droupout以减少过拟合。

最后,还有一组FC => RELU层和一个softmax分类器:

230a5a56650cc255700f6e28aa868c4a8001b027

Dense1024使用具有校正的线性单位激活和批量归一化指定全连接层。

最后再执行一次Droupout——在训练期间我们Droupout50%的节点。通常情况下,你会在全连接层在较低速


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值