基于keras的CNN图片分类模型的搭建与调参


更新一下这篇博客,因为最近在CNN调参方面取得了一些进展,顺便做一下总结。


我的项目目标是搭建一个可以分五类的卷积神经网络,然后我找了一些资料看了一些博客,发现keras搭建CNN,还是比较简单快捷的,模块化,易扩展,极简,让我最终选择了keras。本质上keras相对于python,就相当于python相对于c/c++。就是一个封装的一个关系。

然后讲讲我的模型吧。我的模型是由两层卷积层,两层池化层,两层全连接层组成。这个结构 应该算是最简单的卷积神经网络了。可调的参数也并不多。整个分类系统代码组成也很简单,主要就三部分,一个是数据读取处理部分,一个是模型训练部分,一个是模型测试部分。我分类的数据集是通过热成像仪拍摄得到的热成像图,然后经过简单处理之后得到的灰度图。原本这个模型是一个人脸识别系统,把其中摄像头拍摄部分去掉了。只保留图像分类部分的代码,就做成了我的系统了。基本思想还是很简单的。

但是在接触了代码之后,还是发现了很多坑。经过掉坑,爬坑的洗礼之后,写下这篇博客,记载下一些有价值的知识。

1. 数据读取

这部分代码开始我就没读懂 ,reshape函数不是将图片的大小改变的嘛?咋改成了四维的?
查了好多博客,都没说出个所以然。后来我想起手上还有三本TensorFlow的电子书,通过书终于发现了问题所在。

这段代码(来自《TensorFlow技术解析与实战》)表示keras分别以theano和TensorFlow为backend实现图像大小重置与存取的区别。同时我还明白了这个代码里面各个参数代表的意思。就比如TensorFlow的吧。

x_test=x_test.reshape(x_test.shape[0],img_rows,img_cols,1)

这个x_test.shape[0]表示总共有多少个照片,因为当时读进照片数据的时候,照片都被放在了list里面了,然后他的大小就是整个list就是照片的数目。然后img_rows,img_cols就是每张照片的大小。
.

2. 调参数

由于优化器和批归一化,对最终的结果产生了很大的影响,我将在下面的内容详细地解释一下这两者的优化原理。


要将一个模型的性能达到一个比较高的水准,必定需要调节相关的参数。作为一名小白。一开始我是一脸闷逼的。不知道该调哪些参数,不知道应该调到多大的数值才算合适。虽然现在的分类准确率还是没达到一个令人满意的程度,但是相较于开始已经提升了很多。先记下来一些吧。
我主要调整了两个部分。

  • (一)输入图像的大小。这个是我在数据读取部分改的。我将读入的图片长宽调整的更加接近。
  • (二)增加了dropout函数,dropout函数说白了就是在训练时将部分神经元暂停工作,提升模型的抗过拟合能力。我在每一层都加入了dropout函数,开始的两层都是比较小的概率(0.15),后面到了全连接层比较大(0.5)
  • (三)将模型的优化器由原来的Adagrad,改为adadelta。这一篇文章里面给出了比较详细的优化方法的总结:深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)这个地方,还有一个值得挖掘的地方就是模型的优化器,optimizor对最终结果影响原来这么大。我在代码中用到的优化器依次是Adagrad,adadelta,Adam,效果依次上升。

Adagrad:

Adagrad其实就是对学习率进行了一个约束,Adagrad其实就是对学习率进行了一个约束,Adagrad其实就是对学习率进行了一个约束,
nt=nt−1+g2tnt=nt−1+gt2n_t=n_{t-1}+g^{2}_t
Δθt=−ηnt+ϵ√∗gtΔθt=−ηnt+ϵ∗gt\Delta\theta_{t}=-\frac{\eta}{\sqrt{n_t+\epsilon}}*g_t
对对对gt从1到t进行一个递推形成一个约束项regularizer," role="presentation">gt从1到t进行一个递推形成一个约束项regularizer,gt从1到t进行一个递推形成一个约束项regularizer,g_t从1到t进行一个递推形成一个约束项regularizer,Δθt=−1∑tr=1(gr)2+ϵ,ϵ,用来保证分母非0Δθt=−1∑r=1t(gr)2+ϵ,ϵ,用来保证分母非0\Delta\theta_{t}=-\frac{1}{\sum_{r=1}^{t}{(g_r)^2+\epsilon}},\epsilon,用来保证分母非0
特点:
前期gt较小的时候,regularizer较大,能够放大梯度gt较小的时候,regularizer较大,能够放大梯度g_t较小的时候,regularizer较大,能够放大梯度
前期gt较大的时候,regularizer较小,能约束梯度gt较大的时候,regularizer较小,能约束梯度g_t较大的时候,regularizer较小,能约束梯度
适合处理稀疏梯度

Adadelta:

Adadelta是对Adagrad的扩展,最初的方案依然是对学习率进行自适应的约束,但是进行了计算上的简化。Adagrad会累加之前所有梯度的平方,而Adadelta只累加固定大小的项,并且不直接存储这些项,仅仅是近似计算对应的平均值。即:Adadelta是对Adagrad的扩展,最初的方案依然是对学习率进行自适应的约束,但是进行了计算上的简化。Adagrad会累加之前所有梯度的平方,而Adadelta只累加固定大小的项,并且不直接存储这些项,仅仅是近似计算对应的平均值。即:Adadelta是对Adagrad的扩展,最初的方案依然是对学习率进行自适应的约束,但是进行了计算上的简化。Adagrad会累加之前所有梯度的平方,而Adadelta只累加固定大小的项,并且不直接存储这些项,仅仅是近似计算对应的平均值。即:
nt=v∗nt−1+(1−v)∗g2tnt=v∗nt−1+(1−v)∗gt2n_t=v*n_{t-1}+(1-v)*g^{2}_{t}
Δθt=−ηnt+ϵ√∗gtΔθt=−ηnt+ϵ∗gt\Delta\theta_t=-\frac{\eta}{\sqrt{n_t+\epsilon}}*g_t
此处Adadelta其实还是依赖于全局学习率的,但是经过近似牛顿迭代法之后:Adadelta其实还是依赖于全局学习率的,但是经过近似牛顿迭代法之后:Adadelta其实还是依赖于全局学习率的,但是经过近似牛顿迭代法之后:
E|g2|t=ρ∗E|g2|t−1+(1−ρ)∗g2tE|g2|t=ρ∗E|g2|t−1+(1−ρ)∗gt2E|g^2|_t=\rho*E|g^2|_{t-1}+(1-\rho)*g^2_t
Δxt=−∑t−1r=1Δxr√E|g2|t+ϵ√Δxt=−∑r=1t−1ΔxrE|g2|t+ϵ\Delta x_t=-\frac{\sqrt{\sum^{t-1}_{r=1}{\Delta x_r}}}{\sqrt{E|g^2|_t+\epsilon}}
其中,E代表期望,可以看出Adadelta已经不用依赖于全局学习率了。其中,E代表期望,可以看出Adadelta已经不用依赖于全局学习率了。其中,E代表期望,可以看出Adadelta已经不用依赖于全局学习率了。
特点:
训练初中期,加速效果不错,很快
训练后期,反复在局部最小值附近抖动

Adam:

Adam(AdaptiveMomentEstimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点是经过偏置校正之后,每次迭代学习率都有一个确定的范围,使得参数比较平稳,公式如下:Adam(AdaptiveMomentEstimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点是经过偏置校正之后,每次迭代学习率都有一个确定的范围,使得参数比较平稳,公式如下:Adam(Adaptive Moment Estimation) 本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点是经过偏置校正之后,每次迭代学习率都有一个确定的范围,使得参数比较平稳,公式如下:
mt=μ∗mt−1+(1−μ)∗gtmt=μ∗mt−1+(1−μ)∗gtm_t=\mu*m_{t-1}+(1-\mu)*g_t
nt=v∗nt−1+(1−v)∗g2tnt=v∗nt−1+(1−v)∗gt2n_t=v*n_{t-1}+(1-v)*g^2_t
m^t=mt1−μtm^t=mt1−μt\hat{m}_t=\frac{m_t}{1-\mu^t}
n^t=nt1−vtn^t=nt1−vt\hat{n}_t=\frac{n_t}{1-v^t}
Δθt=−m^tn^t√+ϵ∗ηΔθt=−m^tn^t+ϵ∗η\Delta\theta_t=-\frac{\hat{m}_t}{\sqrt{\hat{n}_t}+\epsilon}*\eta
其中,mt,nt分别是对梯度的一阶矩估计和二阶矩估计,可以看作对期望E|gt|,E|g2t|的估计;m^t,n^t是对mt,nt的校正,这样可以近似为对期望的无偏估计。其中,mt,nt分别是对梯度的一阶矩估计和二阶矩估计,可以看作对期望E|gt|,E|gt2|的估计;m^t,n^t是对mt,nt的校正,这样可以近似为对期望的无偏估计。其中,m_t,n_t分别是对梯度的一阶矩估计和二阶矩估计,可以看作对期望E|g_t|,E|g^2_t|的估计;\hat{m}_t,\hat{n}_t是对m_t,n_t的校正,这样可以近似为对期望的无偏估计。
可以看出,直接对梯度的矩估计,对内存没有额外的要求,并且可以根据梯度进行动态调整,而−m^tn^t√+ϵ对学习率形成了一个动态约束,并且有明确的范围。可以看出,直接对梯度的矩估计,对内存没有额外的要求,并且可以根据梯度进行动态调整,而−m^tn^t+ϵ对学习率形成了一个动态约束,并且有明确的范围。可以看出,直接对梯度的矩估计,对内存没有额外的要求,并且可以根据梯度进行动态调整,而-\frac{\hat{m}_t}{\sqrt{\hat{n}_t}+\epsilon}对学习率形成了一个动态约束,并且有明确的范围。
特点:
结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的特点Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的特点Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的特点
对内存要求比较小对内存要求比较小对内存要求比较小
为不同参数计算不同的自适应学习率为不同参数计算不同的自适应学习率为不同参数计算不同的自适应学习率
适用于大多数非凸优化,适用于大数据集和高维空间适用于大多数非凸优化,适用于大数据集和高维空间适用于大多数非凸优化,适用于大数据集和高维空间


  • (四)Batch_normalization(批归一化处理)开始我没注意到有这个优化手段。后来看了些别人博客,于是我想着尝试一下这个BN,我在看的视频里面,也多次提及这个优化手段。但是在使用的时候,我就犯难了,到底应该把代码加在哪儿呢?各种百度不得其解,后来百度了一下终于明白了。CNN with BatchNormalization in Keras 94% 这个代码应用的也是keras实现的CNN,简洁明了,适合小白。

我在这再讲解一下批归一化的原理和作用。
批归一化也叫做批标准化,通俗来说就是对每一层神经网络进行标准化,输入数据进行标准化能让机器学习更加有效地学习。除此之外batchnormalizationbatchnormalizationbatch normalization还能有效控制坏的参数初始化,比如说ReluReluRelu这种激励函数最怕所有值都落在附属区间。


但是现在遇到的一个问题是训练的准确率还可以能够达到90%+,但是测试准确率只有70%+,因此下一步准备将这个过拟合问题解决。等我将各方面问题解决好,我就会将代码上传到我的GitHub上,供大家学习借鉴。

对了,这一篇知乎专栏是我看到写的比较好的调参博客《如何一步一步提高图像分类准确率?》-曹荣禹,推荐一下

写在最后关于CNN的学习,我开始了大约五六个月,当然这里面是有间断的,关于CNN的认识,现在好多还是停留在纸面上。没法真正完美地解决工程问题。还需要继续努力。以后有新技巧习得,再更!

基于keras的CNN图片分类模型的搭建以及参数调试相关推荐

  1. CV:基于Keras利用CNN主流架构之mini_XCEPTION训练性别分类模型hdf5并保存到指定文件夹下

    CV:基于Keras利用CNN主流架构之mini_XCEPTION训练性别分类模型hdf5并保存到指定文件夹下 目录 图示过程 核心代码 图示过程 核心代码 from keras.callbacks ...

  2. CV:基于Keras利用CNN主流架构之mini_XCEPTION训练情感分类模型hdf5并保存到指定文件夹下

    CV:基于Keras利用CNN主流架构之mini_XCEPTION训练情感分类模型hdf5并保存到指定文件夹下 目录 图示过程 核心代码 图示过程 核心代码 def mini_XCEPTION(inp ...

  3. 基于Keras预训练词向量模型的文本分类方法

    本文语料仍然是上篇所用的搜狗新闻语料,采用中文预训练词向量模型对词进行向量表示.上篇文章将文本分词之后,采用了TF-IDF的特征提取方式对文本进行向量化表示,所产生的文本表示矩阵是一个稀疏矩阵,本篇采 ...

  4. 【Deep Learning】基于 Keras 的猫狗分类识别

    基于 Keras 的猫狗分类识别 更新: 本文代码github连接:https://github.com/Sdamu/Keras_pratice    本篇主要实现利用 Keras 来实现 Kaggl ...

  5. Kaggle猫狗大战——基于Pytorch的CNN网络分类:数据获取、预处理、载入(1)

    Kaggle猫狗大战--基于Pytorch的CNN网络分类:数据获取.预处理.载入(1) 第一次写CSDN博客,之前一直是靠着CSDN学学代码,这次不得不亲自上场了,就想着将学习的过程都记录下来.新人 ...

  6. 基于Keras机器学习库的分类预测

    在前面的博文中,我们分享了<基于scikit-learn机器学习库的分类预测>,本文将分享Keras机器学习库的分类预测. 一旦你在Keras中选择好机器学习模型,就可以用它来预测新的数据 ...

  7. 基于卷积神经网络的句子分类模型【经典卷积分类附源码链接】

    https://www.toutiao.com/a6680124799831769603/ 基于卷积神经网络的句子分类模型 题目: Convolutional Neural Networks for ...

  8. 快速实践大规模轻量级图片分类模型:飞桨识图 PP-ShiTu

    快速实践大规模图片分类模型:飞桨识图 PP-ShiTu 飞桨识图PP-ShiTu是轻量级图像识别系统,集成了目标检测.特征学习.图像检索等模块,广泛适用于各类图像识别任务.CPU上0.2s即可完成在1 ...

  9. 基于MaixHub的小方舟分类模型学习

    基于MaixHub的小方舟分类模型学习 前言 一.材料准备 二.烧录固件 1.固件下载 2.烧录固件 三.制作数据集 1.收集需要训练的目标的照片 2.转换格式 3.照片分类 四.机器码获取 五.模型 ...

最新文章

  1. 如何用OneNote分享长微博
  2. Linux grep命令分析以及C语言版本的实现
  3. 别把机器学习和人工智能搞混了!
  4. 偶对称离散余弦变换 EDCT
  5. 想用最新追剧的影视图片作为手机壁纸桌面就到高图网
  6. 小米笔记本网卡驱动失效,无法联网
  7. 宝德银河麒麟系统打印机安装及共享方法(一)
  8. 《java语言程序设计》泽勒一致性问题
  9. lattice diamond 安装及获取license方法
  10. 【书单推荐】西方思想史上占有重要地位的100部思想名著
  11. PostgreSQL 中 sequence 的用法
  12. 医学遗传学词汇英语术语英文(Glossary) 3
  13. 服务器物理机如何实现系统快照,Lvm快照实现物理备份之自动化
  14. 2021年终总结--躺平的一年
  15. o.s.boot.SpringApplication : Application run failed错误
  16. 三国志战略版S5赛季事件战法简评
  17. 什么护眼灯对眼睛好?2022最具性价比的护眼灯推荐
  18. 读分布式服务框架原理与实践读后感
  19. Android SDK无法下载,ADT官网无法打开解决方法
  20. 塔望3W消费战略案丨聚焦川崎火锅料,回归赛道一梯队

热门文章

  1. 【测评】lonza培养基、原代细胞
  2. Echarts地图局部放大及返回实例
  3. m图像多重分形谱计算matlab仿真
  4. 初始Selenium
  5. 下腔静脉结扎模型 血栓动物模型 静脉血栓(DVT)模型
  6. minepy、treePlotter导包的问题
  7. java中的 的意思_java中 的意思是什么意思是什么意思是什么意思
  8. Android多媒体播放器源码解析(stagefright框架)
  9. 华文细隶_XM,华文魏碑 XM
  10. 收货地址中加入智能识别地址大幅改善下单体验