Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >CNN卷积神经网络模型搭建

CNN卷积神经网络模型搭建

作者头像
用户5521279
发布于 2019-07-10 06:18:38
发布于 2019-07-10 06:18:38
1.6K00
代码可运行
举报
文章被收录于专栏:搜狗测试搜狗测试
运行总次数:0
代码可运行

前言

前段时间尝试使用深度学习来识别评测过程中的图片,以减少人力成本。目前是在深度学习框架Keras(后端使用TensorFlow)下搭建了一个CNN卷积神经网络模型,下面就如何搭建一个最简单的数字图像识别模型做下介绍。

模型的建立

(1) 卷积层(convolution layer):至于什么是卷积大家可以自己去找资料看看,这里重点讲讲Convolution2D()函数。根据keras官方文档描述,2D代表这是一个2维卷积,其功能为对2维输入进行滑窗卷积计算。我们的数字图像尺寸为28*28,拥有长、宽两维,所以在这里我们使用2维卷积函数计算卷积。所谓的滑窗计算,其实就是利用卷积核逐个像素、顺序进行计算,如下图:

上图选择了最简单的均值卷积核,3x3大小,我们用这个卷积核作为掩模对前面4x4大小的图像逐个像素作卷积运算。首先我们将卷积核中心对准图像第一个像素,在这里就是像素值为237的那个像素。卷积核覆盖的区域(掩模之称即由此来),其下所有像素取均值然后相加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
C(1) = 0 * 0.5 + 0 * 0.5 + 0 * 0.5 + 0 * 0.5 + 237 * 0.5 + 203 * 0.5 + 0 * 0.5 + 123 * 0.5 + 112 * 0.5

结果直接替换卷积核中心覆盖的像素值,接着是第二个像素、然后第三个,从左至右,由上到下……以此类推,卷积核逐个覆盖所有像素。整个操作过程就像一个滑动的窗口逐个滑过所有像素,最终生成一副尺寸相同但已经过卷积处理的图像。上图我们采用的是均值卷积核,实际效果就是将图像变模糊了。显然,卷积核覆盖图像边界像素时,会有部分区域越界,越界的部分我们以0填充,如上图。对于此种情况,还有一种处理方法,就是丢掉边界像素,从覆盖区域不越界的像素开始计算。像上图,如果采用丢掉边界像素的方法,3x3的卷积核就应该从第2行第2列的像素(值为112)开始,到第3行第3列结束,最终我们会得到一个2x2的图像。这种处理方式会丢掉图像的边界特征;而第一种方式则保留了图像的边界特征。在我们建立的模型中,卷积层采用哪种方式处理图像边界,卷积核尺寸有多大等参数都可以通过Convolution2D()函数来指定:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#第一个卷积层,4个卷积核,每个卷积核大小5*51表示输入的图片的通道,灰度图为1通道。
model.add(Conv2D(4, (5, 5), border_mode='valid',input_shape=(1, 28, 28), data_format='channels_first'))

第一个卷积层包含4个卷积核,每个卷积核大小为5x5,border_mode值为“same”意味着我们采用保留边界特征的方式滑窗,而值“valid”则指定丢掉边界像素(数字图像边缘是没用的,所以用vaild)。根据keras开发文档的说明,当我们将卷积层作为网络的第一层时,我们还应指定input_shape参数,显式地告知输入数据的形状,对我们的程序来说,input_shape的值为(1, 28, 28),代表28x28的灰度图。

PS:“channels_first”或“channels_last”之一,代表图像的通道维的位置。该参数是Keras 1.x中的image_dim_ordering,“channels_last”对应原本的“tf”,“channels_first”对应原本的“th”。以128x128的RGB图像为例,“channels_first”应将数据组织为(3,128,128),而“channels_last”应将数据组织为(128,128,3)。该参数的默认值是~/.keras/keras.json中设置的值,若从未设置过,则为“channels_last”。

(2) 激活函数层:这里讲一下最简单的relu(Rectified Linear Units,修正线性单元)函数,它的数学形式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ƒ(x) = max(0, x)

这个函数非常简单,其输出一目了然,小于0的输入,输出全部为0,大于0的则输入与输出相等。该函数的优点是收敛速度快,除了它,keras库还支持其它几种激活函数,如下:

  • softplus
  • softsign
  • tanh
  • sigmoid
  • hard_sigmoid
  • linear

它们的函数式、优缺点网络上有很多资料,大家自己去查。对于不同的需求,我们可以选择不同的激活函数,这也是模型训练可调整的一部分,运用之妙,存乎一心,请自忖之。另外再交代一句,其实激活函数层按照我们前文所讲,其属于人工神经元的一部分,所以我们亦可以在构造层对象时通过传递activation参数设置,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.add(Convolution2D(4, (5, 5), border_mode='valid',input_shape=(1, 28, 28), data_format='channels_first'))
model.add(Activation('tanh'))

#通过传递activation参数设置,与上两行代码的作用相同
model.add(Convolution2D(4, (5, 5), border_mode='valid',input_shape=(1, 28, 28), data_format='channels_first'), activation='tanh')

(3) 池化层(pooling layer):池化层存在的目的是缩小输入的特征图,简化网络计算复杂度;同时进行特征压缩,突出主要特征。我们通过调用MaxPooling2D()函数建立了池化层,这个函数采用了最大值池化法,这个方法选取覆盖区域的最大值作为区域主要特征组成新的缩小后的特征图:

显然,池化层与卷积层覆盖区域的方法不同,前者按照池化尺寸逐块覆盖特征图,卷积层则是逐个像素滑动覆盖。对于我们输入的28x28特征图来说,经过2x2池化后,图像变为14x14大小。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.add(MaxPooling2D(pool_size=(2, 2)))

(4)Dropout层:随机断开一定百分比的输入神经元链接,以防止过拟合。那么什么是过拟合呢?一句话解释就是训练数据预测准确率很高,测试数据预测准确率很低,用图形表示就是拟合曲线较尖,不平滑。导致这种现象的原因是模型的参数很多,但训练样本太少,导致模型拟合过度。为了解决这个问题,Dropout层将有意识的随机减少模型参数,让模型变得简单,而越简单的模型越不容易产生过拟合。代码中Dropout()函数只有一个输入参数——指定抛弃比率,范围为0~1之间的浮点数,其实就是百分比。这个参数亦是一个可调参数,我们可以根据训练结果调整它以达到更好的模型成熟度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#本样例没有使用到,详见官方文档
keras.layers.core.Dropout(rate, noise_shape=None, seed=None)

(5)Flatten层:截止到Flatten层之前,在网络中流动的数据还是多维的(对于我们的程序就是2维的),经过多次的卷积、池化、Dropout之后,到了这里就可以进入全连接层做最后的处理了。全连接层要求输入的数据必须是一维的,因此,我们必须把输入数据“压扁”成一维后才能进入全连接层,Flatten层的作用即在于此。该层的作用如此纯粹,因此反映到代码上我们看到它不需要任何输入参数。

(6)全连接层(dense layer):全连接层的作用就是用于分类或回归,对于我们来说就是分类。keras将全连接层定义为Dense层,其含义就是这里的神经元连接非常“稠密”。我们通过Dense()函数定义全连接层。这个函数的一个必填参数就是神经元个数,其实就是指定该层有多少个输出。在我们的代码中,第一个全连接层(#14 Dense层)指定了512个神经元,也就是保留了512个特征输出到下一层。这个参数可以根据实际训练情况进行调整,依然是没有可参考的调整标准,自调之。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#全连接层,先将前一层输出的二维特征图flatten为一维的。
#Dense就是隐藏层。16就是上一层输出的特征图个数。4是根据每个卷积层计算出来的:(28-5+1)得到24,(24-3+1)/2得到11,(11-3+1)/2得到4
#全连接有128个神经元节点,初始化方式为normal
model.add(Flatten())
model.add(Dense(128, init='normal'))
model.add(Activation('tanh'))

(7)分类层:全连接层最终的目的就是完成我们的分类要求:0到9,模型构建代码的最后两行完成此项工作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Softmax分类,输出是10类别
model.add(Dense(10, init='normal'))
model.add(Activation('softmax'))
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 搜狗测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
卷积神经网络究竟做了什么?
神经学习的一种主要方式就是卷积神经网络(CNN),有许多种方法去描述CNN到底做了什么,一般通过图像分类例子通过数学的或直观的方法来介绍如何训练和使用CNN。
轻吻晴雯
2018/04/19
2.5K0
卷积神经网络究竟做了什么?
keras doc 6 卷积层Convolutional
本文摘自 http://keras-cn.readthedocs.io/en/latest/layers/convolutional_layer/
CreateAMind
2018/07/25
1.6K0
keras doc 6 卷积层Convolutional
【连载12】带你看懂最早的卷积神经网络LeNet-5
LeNet 诞生于 1994 年,是最早的卷积神经网络之一,并且推动了深度学习领域的发展
lujohn3li
2020/03/03
6970
深度学习算法中的卷积神经网络(Convolutional Neural Networks)
深度学习是近年来兴起的一种机器学习方法,它通过模拟人脑神经网络的结构和功能,实现对大规模数据进行高效处理和学习。卷积神经网络(Convolutional Neural Networks,简称CNN)是深度学习中最重要和最常用的算法之一,它在图像识别、计算机视觉和自然语言处理等领域取得了巨大的成功。
大盘鸡拌面
2023/09/19
5300
【连载13】详解CNN五大经典模型之一AlexNet
AlexNet在ILSVRC-2012的比赛中获得top5错误率15.3%的突破(第二名为26.2%),其原理来源于2012年Alex的论文《ImageNet Classification with Deep Convolutional Neural Networks》,这篇论文是深度学习火爆发展的一个里程碑和分水岭,加上硬件技术的发展,深度学习还会继续火下去。
lujohn3li
2020/03/03
7550
keras教程:卷积神经网络(CNNs)终极入门指南
本篇教程将会手把手教你使用keras搭建卷积神经网络(CNNs)。为了使你能够更快地搭建属于自己的模型,这里并不涉及有关CNNs的原理及数学公式,感兴趣的同学可以查阅《吊炸天的CNNs,这是我见过最详尽的图解!》 写在程序之前: 为了学习得更快,一些背景知识需要你了解 • 最常见的CNNs架构 上述模式,是一个最为常见的卷积网络架构模式。 如果上述链条理解起来比较吃力,你可以到这里恶补下基础知识。我们后面的代码,都是遵循上述模式来编写的。 • MNIST 数据集 在MN
AI传送门
2018/06/21
1.4K1
深度学习(六)keras常用函数学习 2018最新win10 安装tensorflow1.4(GPU/CPU)+cuda8.0+cudnn8.0-v6 + keras 安装CUDA失败 导入ten
原文链接:https://www.cnblogs.com/DOMLX/p/9769301.html
徐飞机
2018/10/11
2.2K0
教程 | 从基本概念到实现,全卷积网络实现更简洁的图像识别
选自 Medium 机器之心编译 参与:蒋思源、晏奇、黄小天 众所周知,图像就是像素值的集合,而这个观点可以帮助计算机科学家和研究者们构建一个和人类大脑相似并能实现特殊功能的神经网络。有时候,这种神经
机器之心
2018/05/07
9750
教程 | 从基本概念到实现,全卷积网络实现更简洁的图像识别
自制人脸数据,利用keras库训练人脸识别模型
机器学习最本质的地方就是基于海量数据统计的学习,说白了,机器学习其实就是在模拟人类儿童的学习行为。举一个简单的例子,成年人并没有主动教孩子学习语言,但随着孩子慢慢长大,自然而然就学会了说话。那么孩子们是怎么学会的呢?很简单,在人类出生之前,有了听觉开始,就开始不断听到各种声音。人类的大脑会自动组织、分类这些不同的声音,形成自己的认识。随着时间的推移,大脑接收到的声音数据越来越多。最终,大脑利用一种我们目前尚未知晓的机制建立了一个成熟、可靠的声音分类模型,于是孩子们学会了说话。机器学习也是如此,要想识别出这张人脸属于谁,我们同样需要大量的本人和其他人的人脸数据,然后将这些数据输入Tensorflow这样的深度学习(深度学习指的是深度神经网络学习,乃机器学习分支之一)框架,利用深度学习框架建立属于我们自己的人脸分类模型。只要数据量足够,分类准确率就能提高到足以满足我们需求的级别。
机器学习AI算法工程
2019/10/29
3.4K0
自制人脸数据,利用keras库训练人脸识别模型
越来越卷,教你使用Python实现卷积神经网络(CNN)
https://blog.csdn.net/weixin_44510615/article/details/117409037
润森
2022/09/22
2.7K0
越来越卷,教你使用Python实现卷积神经网络(CNN)
基于卷积神经网络的图像情感分析模型,Python实现
图片情感分析,重点是颜色特征的提取,将每一个像素点的颜色特征转换成一个值,最终效果是把一个图片转换成一个二维矩阵,矩阵中每一个值都代表该像素点的颜色特征。概括来说就是将每个像素点的RGB值转换为HSV,然后对HSV三个值进行加权求和,得出一个值来表示颜色特征,RGB值转换为HSV有标准公式,对HSV三个值进行加权求和时权值的选择参考自一篇对服装图像进行分类的论文。具体过程如下:
机器学习AI算法工程
2019/10/28
1.7K0
基于卷积神经网络的图像情感分析模型,Python实现
卷积神经网络学习路线(六)| 经典网络回顾之LeNet
开篇的这张图代表ILSVRC历年的Top-5错误率,我会按照以上经典网络出现的时间顺序对他们进行介绍,同时穿插一些其他的经典CNN网络。
BBuf
2019/12/23
6700
Deep learning基于theano的keras学习笔记(3)-网络层
1.3 Dropout层 为输入数据施加Dropout。Dropout将在训练过程中每次更新参数时随机断开一定百分比(p)的输入神经元连接,Dropout层用于防止过拟合。
李智
2018/08/03
1.2K0
使用CNN卷积神经网络模型训练mnist数据集
卷积操作就是卷积核(kernal)跟输入数据每个值相乘再加起来得到的一个值作为输出
yichen
2021/03/10
1.1K0
带你一文搞懂CNN以及图像识别(Python)
卷积神经网络(Convolution Neural Networks,CNN)是一类包含卷积计算的前馈神经网络,是基于图像任务的平移不变性(图像识别的对象在不同位置有相同的含义)设计的,擅长应用于图像处理等任务。在图像处理中,图像数据具有非常高的维数(高维的RGB矩阵表示),因此训练一个标准的前馈网络来识别图像将需要成千上万的输入神经元,除了显而易见的高计算量,还可能导致许多与神经网络中的维数灾难相关的问题。
JOYCE_Leo16
2024/03/19
1.1K0
带你一文搞懂CNN以及图像识别(Python)
快乐学AI系列——计算机视觉(4.篇外)什么是“卷积神经网络”
卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习算法,常用于计算机视觉领域的图像分类、目标检测和图像分割任务中。它的核心思想是通过卷积运算从原始数据中提取特征,然后将这些特征传递给全连接层进行分类或回归。
MATRIX.矩阵之芯
2023/04/05
4050
快乐学AI系列——计算机视觉(4.篇外)什么是“卷积神经网络”
卷积神经网络VGG16这么简单,为什么没人能说清?
很多人想入门做深度学习,但往往翻遍网络看完一篇又一篇所谓的“入门教程”,paper,包括很多深度学习框架官方给出的案例,给人的感觉真的是从入门到放弃。写教程的作者有很多都是技术大神,但写出的东西真的是把原本简简单单的理论说得晦涩难懂,模凌两可。比如说VGG16,都是摆上从论文里截过来的下面这张图:
机器学习AI算法工程
2019/10/28
2.4K0
卷积神经网络VGG16这么简单,为什么没人能说清?
Python人工智能 | 十八.Keras搭建卷积神经网络及CNN原理详解
从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章详细讲解了Keras实现分类学习,以MNIST数字图片为例进行讲解。本篇文章详细讲解了卷积神经网络CNN原理,并通过Keras编写CNN实现了MNIST分类学习案例。基础性文章,希望对您有所帮助!
Eastmount
2022/11/25
1.5K0
对比学习用 Keras 搭建 CNN RNN 等常用神经网络
参考: 各模型完整代码 周莫烦的教学网站 这个网站上有很多机器学习相关的教学视频,推荐上去学习学习。 Keras 是一个兼容 Theano 和 Tensorflow 的神经网络高级包, 用他来组件一个神经网络更加快速, 几条语句就搞定了. 而且广泛的兼容性能使 Keras 在 Windows 和 MacOS 或者 Linux 上运行无阻碍. 今天来对比学习一下用 Keras 搭建下面几个常用神经网络: 回归 RNN回归 分类 CNN分类 RNN分类 自编码分类 它们的步骤差不多是一样的: [导入模块
杨熹
2018/04/02
1.7K0
对比学习用 Keras 搭建 CNN RNN 等常用神经网络
手把手搭建一个【卷积神经网络】
本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,来对10种常见的物体进行识别分类;使用到CIFAR10数据集,它包含10 类,即:“飞机”,“汽车”,“鸟”,“猫”,“鹿”, “狗”,“青蛙”,“马”,“船”,“卡车” ;共 60000 张彩色图片;通过搭建和训练卷积神经网络模型,对图像进行分类,能识别出图像是“汽车”,或“鸟”,还是其它。
一颗小树x
2021/05/12
1.4K0
手把手搭建一个【卷积神经网络】
推荐阅读
相关推荐
卷积神经网络究竟做了什么?
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验