【深度学习】卷积神经网络(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.rhkb.cn/news/204408.html

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

相关文章

Android Studio导入项目一直显示正在下载Gradle项目

如题,问题图类似如下: (此图是解决以后截的,之前遇到问题没截图) 解决方法 先找到你正在下载的gradle的版本是哪个 然后在链接中 ​​​​​​Gradle Distributions 找到你所对于gradle的版本,下载对应…

王者荣耀小游戏

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt; package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.…

泛微E-Office SQL注入漏洞复现

0x01 产品简介 泛微E-Office是一款标准化的协同 OA 办公软件,泛微协同办公产品系列成员之一,实行通用化产品设计,充分贴合企业管理需求,本着简洁易用、高效智能的原则,为企业快速打造移动化、无纸化、数字化的办公平台。 0x02 漏…

配置和运行yolov5时报错ModuleNotFoundError: No module named ‘ultralytics.yolo‘的解决方法

yolov5的官方文件 链接:https://pan.baidu.com/s/1WNoTDvBGDrgTfUiHDSB6Gg?pwd8MXz 提取码:8MXz 在终端里面运行detect.py文件,报下面的错误 分析上面的错误,发现是在utils/general.py文件里的39行处报错了。因为找不到check_r…

mysql 性能排查

mysql 下常见遇到的问题有,mysql连接池耗尽,死锁、慢查、未提交的事务。等等我们可能需要看;我们想要查看的可能有 1.当前连接池连接了哪些客户端,进行了哪些操作 2.当前造成死锁的语句有哪些,是哪个客户端上的&#x…

C语言——一个数如果恰好等于它的因子之和,这个数就称为“完全数”。

一个数如果恰好等于它的因子之和,这个数就称为“完全数”。例如,6的因子是 1、2、3,而6123。因此6是一个完全数。编程找出 1000 之内的所有完全数。 #include <stdio.h> int main() {int i, j, sum;for (i 1; i < 1000; i) {sum 0; //这一步很重要&#xff0c;每…

Linux—进程状态

目录 一.前言 1.1.通过系统调用获取进程标示符 1.2.通过系统调用创建进程 二.进程状态 三.Z(zombie)-僵尸进程 四.僵尸进程危害 一.前言 学习进程的状态&#xff0c;我们首先了解一下进程的基本数据 1.1.通过系统调用获取进程标示符 由getpid&#xff08;&#xff09…

Leetcode—15.三数之和【中等】

2023每日刷题&#xff08;四十一&#xff09; Leetcode—15.三数之和 实现代码 class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int>> ans;int i, j, k;int s,…

jq——实现弹幕滚动(往左滚动+往右滚动)——基础积累

最近同事在写弹幕功能&#xff0c;下面记录以下代码&#xff1a; 1.html代码 <div id"scrollContainer"></div>2.引入jq <script src"./script/jquery-1.8.3.js" type"text/javascript"></script>3.jq代码——往左滚…

基于SSM的云鑫曦科技办公自动化管理系统设计与实现

基于SSM的云鑫曦科技办公自动化管理系统设计与实现 摘 要: 随着时代的发展&#xff0c;单位办公方式逐渐从传统的线下纸张办公转向了使用个人pc的线上办公&#xff0c;办公效率低下的传统纸质化办公时代的淘汰&#xff0c;转型到信息化办公时代&#xff0c;面对当今数据逐渐膨…

vscode 里怎么自动提示 webpack 配置项?

webpack 的配置项非常多&#xff0c;容易忘记&#xff0c;能自动提示很有用&#xff0c;就是在配置文件里面添加下面代码 // 下面这行用于 vscode 中智能化自动提示 webpack 配置项 /** type {import(webpack).Configuration} */

python 爬虫之 爬取网站信息并保存到文件

文章目录 前期准备探索该网页的HTML码的特点开始编写代码存入文件总的程序文件存储效果 前期准备 随便找个网站进行爬取&#xff0c;这里我选择的是(一个卖书的网站&#xff09; https://www.bookschina.com/24hour/62700000/ 我的目的是爬取这个网站的这个页面的书籍的名称以…

Vue3-VueRouter4路由语法解析

1.创建路由实例由createRouter实现 2.路由模式 1&#xff09;history模式使用createWebHistory()&#xff1a;地址栏不带# 2&#xff09;hash模式使用createWebHashHistory()&#xff1a;地址栏带# 3&#xff09;参数是基础路径&#xff0c;默认/ 括号里的就是设置路径的前…

【C++初阶】五、类和对象(日期类的完善、流运算符重载函数、const成员、“”取地址运算符重载)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】四、类和对象 &#xff08;构造函数、析构函数、拷贝构造函数、赋值运算符重载函数&#xff09;-CSDN博客 一 . 日期类的完善 此次日期类的成员函数&#xff0c;采用声明…

大模型训练为什么用A100不用4090

这是一个好问题。先说结论&#xff0c;大模型的训练用 4090 是不行的&#xff0c;但推理&#xff08;inference/serving&#xff09;用 4090 不仅可行&#xff0c;在性价比上还能比 H100 稍高。4090 如果极致优化&#xff0c;性价比甚至可以达到 H100 的 2 倍。 事实上&#x…

数据库中生成列的对比

简介 生成列&#xff08;虚拟列&#xff09;&#xff1a;在实际开发中&#xff0c;相对一个历史数据的表增加一个字段&#xff0c;增加下游报表&#xff0c;数据分析的可用性。常见的方法就是删表重建&#xff0c;或者使用ADD column 语法。如果是一个历史表&#xff0c;删…

【算法】一个简单的整数问题(树状数组、差分)

题目 给定长度为 N 的数列 A&#xff0c;然后输入 M 行操作指令。 第一类指令形如 C l r d&#xff0c;表示把数列中第 l∼r 个数都加 d。 第二类指令形如 Q x&#xff0c;表示询问数列中第 x 个数的值。 对于每个询问&#xff0c;输出一个整数表示答案。 输入格式 第一行…

STM32 ADC转换器、串口输出

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ADC是什么&#xff1f;二、STM32的ADC2.1 认识STM32 ADC2.2转换方式2.3 为什么要校准&#xff1f;2.4 采样时间计算2.5 触发方式2.6 多通道采集解决方案2.7…

平衡树 - splay

相比于之前的普通平衡树进行左旋右旋来比&#xff0c;splay的适用性更高&#xff0c;使用更广泛。 核心函数rotate、splay函数&#xff0c;其它的根据需要进行修改。 int n, m; struct Node {int s[2], p, v, cnt; // 左右儿子、父节点、值、出现数量int size, flag; // 子树大…

【视觉SLAM十四讲学习笔记】第三讲——四元数

专栏系列文章如下&#xff1a; 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 【视觉SLAM十四讲学习笔记】第三讲——Eigen库 【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧…