CNN | 03实现几何图形及颜色分类

2024-03-07 17:58

本文主要是介绍CNN | 03实现几何图形及颜色分类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3 实现几何图形及颜色分类

3.1 提出问题

在前两节我们学习了如何按颜色分类和按形状分类几何图形,现在我们自然地想到如果把颜色和图形结合起来,卷积神经网络能不能正确分类呢?

请看样本数据,如图18-26。

图18-26 样本数据

一共有3种形状及3种颜色,如表18-4所示。

表18-4 样本数据分类和数量

红色蓝色绿色
圆形600:100600:100600:100
矩形600:100600:100600:100
三角形600:100600:100600:100

表中列出了9种样本的训练集和测试集的样本数量比例,都是600:100,

3.2 用前馈神经网络解决问题

我们仍然先使用全连接网络来解决这个问题,搭建一个三层的网络如下:

ef dnn_model():num_output = 9max_epoch = 50batch_size = 16learning_rate = 0.01params = HyperParameters_4_2(learning_rate, max_epoch, batch_size,net_type=NetType.MultipleClassifier,init_method=InitialMethod.MSRA,optimizer_name=OptimizerName.Momentum)net = NeuralNet_4_2(params, "color_shape_dnn")f1 = FcLayer_2_0(784, 128, params)net.add_layer(f1, "f1")r1 = ActivationLayer(Relu())net.add_layer(r1, "relu1")f2 = FcLayer_2_0(f1.output_size, 64, params)net.add_layer(f2, "f2")r2 = ActivationLayer(Relu())net.add_layer(r2, "relu2")f3 = FcLayer_2_0(f2.output_size, num_output, params)net.add_layer(f3, "f3")s3 = ClassificationLayer(Softmax())net.add_layer(s3, "s3")return net

样本数据为3x28x28的彩色图,所以我们要把它转换成灰度图,然后再展开成1x784的向量,第一层用128个神经元,第二层用64个神经元,输出层用9个神经元接Softmax分类函数。

训练50个epoch后可以得到如下如图18-27所示的训练结果。

图18-27 训练过程中损失函数值和准确度的变化

......
epoch=49, total_iteration=15199
loss_train=0.003370, accuracy_train=1.000000
loss_valid=0.510589, accuracy_valid=0.883333
time used: 25.34346342086792
testing...
0.9011111111111111
load parameters
0.8988888888888888

在测试集上得到的准确度是89%,这已经超出笔者的预期了,本来猜测准确度会小于80%。有兴趣的读者可以再精调一下这个前馈神经网络网络,看看是否可以得到更高的准确度。

图18-28是部分测试集中的测试样本的预测结果。

图18-28 测试结果

绝大部分样本预测是正确的,但是第3行第2列的样本,应该是green-rect,被预测成green-circle;最后两行的两个green-tri也被预测错了形状,颜色并没有错。

3.3 用卷积神经网络解决问题

下面我们来看看卷积神经网络能不能完成这个工作。首先搭建网络模型如下:

def cnn_model():num_output = 9max_epoch = 20batch_size = 16learning_rate = 0.1params = HyperParameters_4_2(learning_rate, max_epoch, batch_size,net_type=NetType.MultipleClassifier,init_method=InitialMethod.MSRA,optimizer_name=OptimizerName.SGD)net = NeuralNet_4_2(params, "shape_color_cnn")c1 = ConvLayer((3,28,28), (8,3,3), (1,1), params)net.add_layer(c1, "c1")r1 = ActivationLayer(Relu())net.add_layer(r1, "relu1")p1 = PoolingLayer(c1.output_shape, (2,2), 2, PoolingTypes.MAX)net.add_layer(p1, "p1") c2 = ConvLayer(p1.output_shape, (16,3,3), (1,0), params)net.add_layer(c2, "c2")r2 = ActivationLayer(Relu())net.add_layer(r2, "relu2")p2 = PoolingLayer(c2.output_shape, (2,2), 2, PoolingTypes.MAX)net.add_layer(p2, "p2") params.learning_rate = 0.1f3 = FcLayer_2_0(p2.output_size, 32, params)net.add_layer(f3, "f3")bn3 = BnLayer(f3.output_size)net.add_layer(bn3, "bn3")r3 = ActivationLayer(Relu())net.add_layer(r3, "relu3")f4 = FcLayer_2_0(f3.output_size, num_output, params)net.add_layer(f4, "f4")s4 = ClassificationLayer(Softmax())net.add_layer(s4, "s4")return net

经过20个epoch的训练后,我们得到的结果如图18-29。

图18-29 训练过程中损失函数值和准确度的变化

以下是打印输出的最后几行:

......
epoch=19, total_iteration=6079
loss_train=0.005184, accuracy_train=1.000000
loss_valid=0.118708, accuracy_valid=0.957407
time used: 131.77996039390564
testing...
0.97
load parameters
0.97

可以看到我们在测试集上得到了97%的准确度,比DNN模型要高出很多,这也证明了卷积神经网络在图像识别上的能力。

图18-30是部分测试集中的测试样本的预测结果。

图18-30 测试结果

绝大部分样本预测是正确的,只有最后一行第4个样本,本来是green-triangle,被预测成green-circle。

代码位置

ch18, Level3_ColorAndShapeConvNet.py

思考和练习

  1. 我们使用了3x3的卷积核,如果用5x5的卷积核,但是在其它参数不变的情况下,其效果会不会更好?

这篇关于CNN | 03实现几何图形及颜色分类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/784349

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件