【深度学习】卷积神经网络(CNN)的参数优化方法

卷积神经网络(CNN)的参数优化方法

著名: 本文是从 Michael Nielsen的电子书Neural Network and Deep Learning的深度学习那一章的卷积神经网络的参数优化方法的一些总结和摘录,并不是我自己的结论和做实验所得到的结果。我想Michael的实验结果更有说服力一些。本书在github上有中文翻译的版本,

前言

最近卷积神经网络(CNN)很火热,它在图像分类领域的卓越表现引起了大家的广泛关注。本文总结和摘录了Michael Nielsen的那本Neural Network and Deep Learning一书中关于深度学习一章中关于提高泛化能力的一些概述和实验结果。力争用数据给大家一个关于正则化,增加卷积层/全连接数,弃权技术,拓展训练集等参数优化方法的效果。

本文并不会介绍正则化,弃权(Dropout), 池化等方法的原理,只会介绍它们在实验中的应用或者起到的效果,更多的关于这些方法的解释请自行查询。

mnist数据集介绍

本文的实验是基于mnist数据集合的,mnist是一个从0到9的手写数字集合,共有60,000张训练图片,10,000张测试图片。每张图片大小是28*28大小。我们的实验就是构建一个神经网络来高精度的分类图片,也就是提高泛化能力。

卷积神经网络(CNN)的参数优化方法
提高泛化能力的方法

一般来说,提高泛化能力的方法主要有以下几个:

 

  • 正则化
  • 增加神经网络层数
  • 使用正确的代价函数
  • 使用好的权重初始化技术
  • 人为拓展训练集
  • 弃权技术

 

下面我们通过实验结果给这些参数优化理论一个直观的结果

1. 普通的全连接神经网络的效果

我们使用一个隐藏层,包含100个隐藏神经元,输入层是784,输出层是one-hot编码的形式,最后一层是Softmax层。训练过程采用对数似然代价函数,60次迭代,学习速率η=0.1,随机梯度下降的小批量数据大小为10,没有正则化。在测试集上得到的结果是97.8%,代码如下:

  
  1. >>> import network3
  2. >>> from network3 import Network
  3. >>> from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer
  4. >>> training_data, validation_data, test_data = network3.load_data_shared()
  5. >>> mini_batch_size = 10
  6. >>> net = Network([
  7. FullyConnectedLayer(n_in=784, n_out=100),
  8. SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
  9. >>> net.SGD(training_data, 60, mini_batch_size, 0.1,
  10. validation_data, test_data)

2.使用卷积神经网络 — 仅一个卷积层

输入层是卷积层,5*5的局部感受野,也就是一个5*5的卷积核,一共20个特征映射。最大池化层选用2*2的大小。后面是100个隐藏神经元的全连接层。结构如图所示

卷积神经网络(CNN)的参数优化方法
在这个架构中,我们把卷积层和chihua层看做是学习输入训练图像中的局部感受野,而后的全连接层则是一个更抽象层次的学习,从整个图像整合全局信息。也是60次迭代,批量数据大小是10,学习率是0.1.代码如下,

  
  1. >>> net = Network([
  2. ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
  3. filter_shape=(20, 1, 5, 5),
  4. poolsize=(2, 2)),
  5. FullyConnectedLayer(n_in=20*12*12, n_out=100),
  6. SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
  7. >>> net.SGD(training_data, 60, mini_batch_size, 0.1,
  8. validation_data, test_data)

经过三次运行取平均后,准确率是98.78%,这是相当大的改善。错误率降低了1/3,。卷积神经网络开始显现威力。

3.使用卷积神经网络 — 两个卷积层

我们接着插入第二个卷积-混合层,把它插入在之前的卷积-混合层和全连接层之间,同样的5*5的局部感受野,2*2的池化层。

  
  1. >>> net = Network([
  2. ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
  3. filter_shape=(20, 1, 5, 5),
  4. poolsize=(2, 2)),
  5. ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
  6. filter_shape=(40, 20, 5, 5),
  7. poolsize=(2, 2)),
  8. FullyConnectedLayer(n_in=40*4*4, n_out=100),
  9. SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
  10. >>> net.SGD(training_data, 60, mini_batch_size, 0.1,
  11. validation_data, test_data)

这一次,我们拥有了99.06%的准确率。

4.使用卷积神经网络 — 两个卷积层+线性修正单元(ReLU)+正则化

上面我们使用的Sigmod激活函数,现在我们换成线性修正激活函数ReLU
f(z)=max(0,z),我们选择60个迭代期,学习速率η=0.03, ,使用L2正则化,正则化参数λ=0.1,代码如下

  
  1. >>> from network3 import ReLU
  2. >>> net = Network([
  3. ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
  4. filter_shape=(20, 1, 5, 5),
  5. poolsize=(2, 2),
  6. activation_fn=ReLU),
  7. ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
  8. filter_shape=(40, 20, 5, 5),
  9. poolsize=(2, 2),
  10. activation_fn=ReLU),
  11. FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU),
  12. SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
  13. >>> net.SGD(training_data, 60, mini_batch_size, 0.03,
  14. validation_data, test_data, lmbda=0.1)

这一次,我们获得了99.23%的准确率,超过了S型激活函数的99.06%. ReLU的优势是max(0,z)中z取最大极限时不会饱和,不像是S函数,这有助于持续学习。

5.使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集

拓展训练集数据的一个简单方法是将每个训练图像由一个像素来代替,无论是上一个像素,下一个像素,或者左右的像素。其他的方法也有改变亮度,改变分辨率,图片旋转,扭曲,位移等。

我们把50,000幅图像人为拓展到250,000幅图像。使用第4节一样的网络,因为我们是在训练5倍的数据,所以减少了过拟合的风险。

  
  1. >>> expanded_training_data, _, _ = network3.load_data_shared(
  2. "../data/mnist_expanded.pkl.gz")
  3. >>> net = Network([
  4. ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
  5. filter_shape=(20, 1, 5, 5),
  6. poolsize=(2, 2),
  7. activation_fn=ReLU),
  8. ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
  9. filter_shape=(40, 20, 5, 5),
  10. poolsize=(2, 2),
  11. activation_fn=ReLU),
  12. FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU),
  13. SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
  14. >>> net.SGD(expanded_training_data, 60, mini_batch_size, 0.03,
  15. validation_data, test_data, lmbda=0.1)

这次的到了99.37的训练正确率。

6.使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集+继续插入额外的全连接层

继续上面的网络,我们拓展全连接层的规模,300个隐藏神经元和1000个神经元的额精度分别是99.46%和99.43%.
我们插入一个额外的全连接层

  
  1. >>> net = Network([
  2. ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
  3. filter_shape=(20, 1, 5, 5),
  4. poolsize=(2, 2),
  5. activation_fn=ReLU),
  6. ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
  7. filter_shape=(40, 20, 5, 5),
  8. poolsize=(2, 2),
  9. activation_fn=ReLU),
  10. FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU),
  11. FullyConnectedLayer(n_in=100, n_out=100, activation_fn=ReLU),
  12. SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
  13. >>> net.SGD(expanded_training_data, 60, mini_batch_size, 0.03,
  14. validation_data, test_data, lmbda=0.1)

这次取得了99.43%的精度。拓展后的网络并没有帮助太多。

7.使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+拓展数据集+继续插入额外的全连接层+弃权技术

弃权的基本思想就是在训练网络时随机的移除单独的激活值,使得模型对单独的依据丢失更为强劲,因此不太依赖于训练数据的特质。我们尝试应用弃权技术到最终的全连接层(不是在卷基层)。这里,减少了迭代期的数量为40个,全连接层使用1000个隐藏神经元,因为弃权技术会丢弃一些神经元。Dropout是一种非常有效有提高泛化能力,降低过拟合的方法!

  
  1. >>> net = Network([
  2. ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
  3. filter_shape=(20, 1, 5, 5),
  4. poolsize=(2, 2),
  5. activation_fn=ReLU),
  6. ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
  7. filter_shape=(40, 20, 5, 5),
  8. poolsize=(2, 2),
  9. activation_fn=ReLU),
  10. FullyConnectedLayer(
  11. n_in=40*4*4, n_out=1000, activation_fn=ReLU, p_dropout=0.5),
  12. FullyConnectedLayer(
  13. n_in=1000, n_out=1000, activation_fn=ReLU, p_dropout=0.5),
  14. SoftmaxLayer(n_in=1000, n_out=10, p_dropout=0.5)],
  15. mini_batch_size)
  16. >>> net.SGD(expanded_training_data, 40, mini_batch_size, 0.03,
  17. validation_data, test_data)

使用弃权技术,的到了99.60%的准确率。

8.使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集+继续插入额外的全连接层+弃权技术+组合网络

组合网络类似于随机森林或者adaboost的集成方法,创建几个神经网络,让他们投票来决定最好的分类。我们训练了5个不同的神经网络,每个都大到了99.60%的准去率,用这5个网络来进行投票表决一个图像的分类。

采用这个方法,达到了99.67%的准确率。

总结

卷积神经网络 的一些技巧总结如下:

1. 使用卷积层极大地减小了全连接层中的参数的数目,使学习的问题更容易

2. 使用更多强有力的规范化技术(尤其是弃权和卷积)来减小过度拟合,

3. 使用修正线性单元而不是S型神经元,来加速训练-依据经验,通常是3-5倍,

4. 使用GPU来计算

5. 利用充分大的数据集,避免过拟合

6. 使用正确的代价函数,避免学习减速

7. 使用好的权重初始化,避免因为神经元饱和引起的学习减速

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/167229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【不同请求方式在springboot中对应的注解】

GET 请求方法&#xff1a;用于获取资源。使用 GetMapping 注解来处理 GET 请求。 示例代码&#xff1a; RestController public class MyController {GetMapping("/resource")public ResponseEntity<String> getResource() {// 处理 GET 请求逻辑} }POST 请求方…

喜讯!云起无垠成为国家信息安全漏洞库(CNNVD)技术支撑单位

近日&#xff0c;云起无垠凭借其在漏洞挖掘、漏洞检测以及漏洞修复等领域的卓越表现&#xff0c;荣获“国家信息安全漏洞库&#xff08;CNNVD&#xff09;技术支撑单位等级证书&#xff08;三级&#xff09;”&#xff0c;正式成为CNNVD技术支撑单位。 中国国家信息安全漏洞库&…

MTK联发科MT6762/MT6763/MT6765安卓核心板参数规格比较

MT6762安卓核心板 MTK6762安卓核心板是一款工业级高性能、可运行 android9.0 操作系统的 4G智能模块。 CPU&#xff1a;4xCortex-A53 up to 2.0Ghz/4xCortex-A53 up to 1.5GhzGraphics&#xff1a;IMG GE8320 Up to 650MhzProcess&#xff1a;12nmMemory&#xff1a;1xLP3 9…

【正点原子STM32连载】 第六十章 串口IAP实验(Julia分形)实验 摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32F407最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html## 第六十…

CMake使用file(GLOB ...)需要注意的问题

文章目录 基本语法使用例子潜在的问题大型项目中推荐的用法 file(GLOB ...) 命令用于获取匹配指定模式的文件列表。在 CMake 中&#xff0c;file(GLOB ...) 命令的一种常见用法是用于收集源文件列表&#xff0c;例如 C 源文件&#xff08;.cpp&#xff09;和 C 源文件&#xff…

html页面加载json数据,在html中显示JSON数据的方法

html页面加载json数据,在html中显示JSON数据的方法 export const mixin {methods: {syntaxHighlight(json) {if (typeof json ! string) {json JSON.stringify(json, undefined, 2);}json json.replace(/&/g, &).replace(/</g, <).replace(/>/g, >);re…

实例分割12篇顶会论文及代码合集,含2023最新

同学们&#xff0c;你们觉得视觉经典四个任务中哪个最难&#xff1f;我个人觉得是实例分割。 因为它既具备语义分割的特点&#xff0c;需要做到像素层面上的分类&#xff0c;也具备目标检测的一部分特点&#xff0c;即需要定位出不同实例&#xff0c;即使它们是同一种类。 但…

LangChain的函数,工具和代理(一):OpenAI的函数调用

一、什么是函数调用功能 几个月前OpenAI官方发布了其API的函数调用功能(Function calling), 在 API 调用中&#xff0c;您可以描述函数&#xff0c;并让模型智能地选择输出包含调用一个或多个函数的参数的 JSON 对象。API函数“ChatCompletion” 虽然不会实际调用该函数&#…

C语言变量和常量

变量和常量 标识符 在计算机高级语言中&#xff0c;用来对变量、符号常量、函数、数组、类型等命名的有效字符序列统称为标识符&#xff08;identifier&#xff09;。 C语言规定标识符&#xff1a; 只能由字母&#xff0c;数字和下划线组成。不能以数字开头。字母区分大小写…

一站式企业快递管理平台使用教程

因公寄件在企业中重要性的提升&#xff0c;催生出了企业快递管理平台。为什么这么说呢&#xff1f; 随着经济和快递行业的发展&#xff0c;因公寄件在企业中成了一件“常事”&#xff0c;寄文件合同、发票、节假日慰问品、样品等等&#xff0c;这种情况之下&#xff0c;因公寄件…

Vue3 设置点击后滚动条移动到固定的位置

需求&#xff1a; 点击不通过按钮&#xff0c;显示红框中表单&#xff0c;且滚动条滚动到底部 &#xff08;显示红框中表单默认不显示&#xff09; <el-button click"onApprovalPass">不通过</el-button> <div class"item" v-if"app…

vue打包优化

vue.config.js文件中 module.exports defineConfig({ productionSourceMap: false,//去掉mapjs文件 });

pwn:[SWPUCTF 2021 新生赛]nc签到

题目 linux环境下显示为 配合题目的下载附件&#xff0c;发现过滤了一些&#xff0c;一旦输入这些会自动关闭程序 ls被过滤了&#xff0c;可以使用l\s cat和空格都被过滤了&#xff0c;cat可以换成c\at ,空格可以换成$IFS$9

<HarmonyOS第一课>1·运行Hello World【课后考核】

【习题】运行Hello World工程 判断题 1.DevEco Studio是开发HarmonyOS应用的一站式集成开发环境。 正确(True) 2.main_pages.json存放页面page路径配置信息。 正确(True) 单选题 1.在stage模型中&#xff0c;下列配置文件属于AppScope文件夹的是&#xff1f;&#xff08;…

Youtube0播放?运营教你需要的技巧、策略与工具!

对于有跨境意向的内容创作者或者品牌企业来说&#xff0c;YouTube是因其巨大的潜在受众群和商业价值成为最值得投入变现与营销计划的平台。 据统计&#xff0c;98% 的美国人每月访问 YouTube&#xff0c;近三分之二的人每天访问。但是&#xff0c;YouTube还远未达到过度饱和的…

酵母双杂交服务专题(一)

酵母双杂交系统是一种在酵母这种真核生物模型中执行的实验方法&#xff0c;用于探索活细胞内部蛋白质间的相互作用。这种技术能够敏感地捕捉蛋白质间的细微和短暂相互作用&#xff0c;通过检测报告基因的表达产物来实现。作为一种高度灵敏的技术&#xff0c;酵母双杂交系统被广…

Spring Cloud LoadBalancer 简单介绍与实战

前言 本文为SpringCloud的学习笔记&#xff0c;如有错误&#xff0c;希望各位高手能指出&#xff0c;主要介绍SpringCloudLoadBalancer的基本概念和实战 文章目录 前言什么是LoadBalancer负载均衡分类服务端负载均衡客户端负载均衡服务端负载均衡和客户端负载均衡的优缺点 常见…

评测|PolarDB MySQL 版 Serverless

评测&#xff5c;PolarDB MySQL 版 Serverless 目录 一、测试背景 1.1、云原生数据库 PolarDB Serverless新架构概念 1.2、Serverless资源弹性扩缩触发条件 二、PolarDB的Serverless能力与同类型产品进行对比 三、动态弹性升降资源的能力测试 3.1、测试资源 3.2、测试一…

ubuntu22.04在线安装redis,可选择版本

安装脚本7.0.5版本 在线安装脚本&#xff0c;默认版本号是7.0.5&#xff0c;可以根据需要选择需要的版本进行下载编译安装 sudo apt-get install gcc -y sudo apt-get install pkg-config -y sudo apt-get install build-essential -y#安装redis rm -rf ./tmp.log systemctl …