一、卷积神经网络的概述




1、卷积神经网络普通神经网络非常相似,它们都由具有可学习的权重w和偏置常量(biases)的神经元组成。每个神经元都接收一些输入,并做一些点积计算,输出是每个分类的分数,普通神经网络里的一些计算技巧到这里依旧适用。普通神经网络把**输入层和隐含层进行“全连接(Full Connected)“**的设计。从计算的角度来讲,相对较小的图像从整幅图像中计算特征是可行的。但是,如果是更大的图像(如 96x96 的图像),要通过这种全联通网络的这种方法来学习整幅图像上的特征,将变得非常耗时。

2、卷积层解决这类问题一种简单方法是对隐藏单元和输入单元间连接加以限制:每个隐藏单元仅仅只能连接输入单元的一部分。卷积神经网络与普通神经网络的区别在于,卷积神经网络包含了一个由卷积层和子采样层构成的特征抽取器。在卷积神经网络的卷积层中,一个神经元只与部分邻层神经元连接。在CNN的一个卷积层中,通常包含若干个特征平面(featureMap),每个特征平面由一些矩形排列的的神经元组成,同一特征平面的神经元共享权值,这里共享的权值就是卷积核。卷积核一般以随机小数矩阵的形式初始化,在网络的训练过程中卷积核将学习得到合理的权值。共享权值(卷积核)带来的直接好处是减少网络各层之间的连接,同时又降低了过拟合的风险

子采样也叫做池化(pooling),通常有均值子采样(mean pooling)和最大值子采样(max pooling)两种形式。子采样可以看作一种特殊的卷积过程。卷积和子采样大大简化了模型复杂度,减少了模型的参数。卷积神经网络的基本结构如图所示:

卷积神经网络由三部分构成:第一部分是输入层,第二部分由n个卷积层和池化层的组合组成,第三部分由一个全连接的多层感知机分类器构成。

二、卷积神经网络的结构分析

(一)卷积神经网络的输入层——input layer

卷积神经网络默认输入是图像,可以把特定的性质编码入网络结构,使前馈函数更加有效率,并减少了大量参数。

虽然每个输出单元只是连接输入的一部分,但是值的计算方法是没有变的,都是权重和输入的点积然后加上偏置,这点与普通神经网络是一样的。


(二)卷积神经网络的卷积层——CONV layer

1、卷积操作(与数学中定义的卷积有所不同,卷积神经网络中将互相关操作成为卷积)

卷积操作看成是提取特征的方式,该方式与位置无关。这隐含的原理是:图像的一部分的统计特性与其他部分是一样的。味着在这一部分学习的特征也能用在另一部分上,对于这个图像上的所有位置,都能使用同样的学习特征。更直观一些,当从一个大尺寸图像中随机选取一小块,并且从这个小块样本中学习到了一些特征,这时可以把从这个小块样本中学习到的特征作为探测器,应用到这个图像的任意地方中去。

特别是,我们可以用从小块样本中所学习到的特征跟原本的大尺寸图像作卷积,从而对这个大尺寸图像上的任一位置获得一个不同特征的激活值。

如下图所示,展示了一个3×3的卷积核在5×5的图像上做卷积的过程每个卷积都是一种特征提取方式,就像一个筛子,将图像中符合条件(激活值越大越符合条件)的部分筛选出来



2、卷积神经网络中的一些基本概念


(1)、过滤器/卷积核: filter,定义用符号 f 来表示:

去检测图像的复杂边缘,过滤器filter中的数字可以对应深度学习的参数,如:w。


假设输入图像大小为:nn,过滤器大小为:ff,则输出图像大小为:(n-f+1)*(n-f+1)

(2)补零填充值: zero padding ,定义用符号 p 来表示:

valid卷积:无填充(no padding),假设输入图像大小为:n*n过滤器大小为:f*f输出图像大小为:(n-f+1)*(n-f+1)

same卷积:填充后输出图像大小与输入图像大小相同。假设**输入图像大小为:nn,过滤器大小为:ff,输出图像大小可表示 为:(n+2p-f+1)(n+2p-f+1),**由于输出大小与输入大小相同,输出大小也可表示为:nn,则得到下面的等式:

**n = n+2p-f+1,计算求得 p = (f-1)/2 。**即:当填充为 p = (f-1)/2时,会得到same卷积。

(3)步长:stride,定义用符号 s表示:


(4)多卷积核

只有1个卷积核的情况下,特征提取是不充分的。我们可以添加多个卷积核,比如32个卷积核,可以学习32种特征。在有多个卷积核时,如下图所示:

上图右,不同颜色表明不同的卷积核。每个卷积核都会将图像生成为另一幅图像。比如两个卷积核就可以将生成两幅图像,这两幅图像可以看做是一张图像的不同的通道。

下图展示了在四个通道上的卷积操作,有两个卷积核,生成两个通道。其中需要注意的是,四个通道上与卷积核的通道一 一对应,先将w1忽略,只看w0,那么在w0的某位置(i,j)处的值,是由四个通道上(i,j)处的卷积结果相加然后再取激活函数值得到的。

所以,在 上 图 由4个通道卷积得到2个通道 的过程中参数的数目为4×2×2×2个 ,其中 4表示4个通道
第一个2表示生成2个通道,最后的2×2表示卷积核大小。


结论:

输入图像大小为:nnnc,其中 nc 表示图像的通道数,过滤器维度为:ffnc,在无填充(no padding)以及步长s=1时,输出图像大小为:*(n-f+1)*(n-f+1)nc’ ,nc’表示:过滤器的个数

(三)卷积神经网络的ReLU激励层——ReLU layer





四)单层卷积网络举例:


(五)卷积神经网络的池化层——pooling layer

除了卷积层,在卷积神经网络里面通常也使用池化层来减少模型的大小,提高计算速度,同时提高所提取特征的鲁棒性。在通过卷积获得了特征 (features) 之后,下一步我们希望利用这些特征去做分类。理论上讲,人们可以用所有提取得到的特征去训练分类器,例如 softmax 分类器,但这样做面临计算量的挑战。例如:对于一个 96X96 像素的图像,假设已经学习得到了400个定义在8X8输入上的特征,每一个特征和图像卷积都会得到一个 (96 − 8 + 1) × (96 − 8 + 1) = 7921 维卷积特征,由于有 400 个特征,每个样例 (example) 都会得到一个 7921 × 400 = 3,168,400 维的卷积特征向量。学习一个拥有超过 3 百万特征输入的分类器十分不便,且容易出现过拟合 (over-fitting)。

   为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化(取决于计算池化的方法)。



池化(pool)即下采样(down samples),目的是为了减少特征图。池化操作对每个深度切片独立,**规模一般为 2*2,**相对于卷积层进行卷积运算,池化层进行的运算一般有以下几种:
1、 最大池化(Max Pooling):取4个点的最大值。这是最常用的池化方法。

最大值子采样的卷积核中各权重值中只有一个为1,其余均为0,卷积核中为1的位置对应inputX被卷积核覆盖部分值最大的位置。卷积核在原图inputX上的滑动步长为2。最大值子采样的效果是把原图缩减至原来的1/4,并保留每个2*2区域的最强输入。

2、 均值池化(Mean Pooling):取4个点的均值。

均值子采样的卷积核中每个权重都是0.25,卷积核在原图inputX上的滑动的步长为2。均值子采样的效果相当于把原图模糊缩减至原来的1/4。

(五)池化层的总结

1)最大池化层、效率很高,实际中经常使用。它有一组超参数过滤器大小 f 和步长 s ,但并没有参数需要学习,不用梯度下降,一旦确定 f 和 s 之后,它是一个固定的运算。

(2)池化操作将保存深度大小不变。如果池化层的输入单元大小不是二的整数倍,

一般采取边缘补零(zero-padding)的方式补成2的倍数,然后再池化

(六)卷积神经网络的全连接层(Fully-connected layer)


三、卷积神经网络训练算法及dropout正则化







四、数据增强(Data augmentation)

增加训练数据,则能够提升算法的准确率,因为这样可以避免过拟合,**而避免过拟合就可以增大网络结构。**当训练数据有限的时候,可以通过一些变换来从已有的训练数据集中生成一些新的数据,来扩大训练数据。数据增强的方法有:

1、水平翻转

2、随机裁剪

如原始图像大小为256256,随机裁剪出一些图像224224的图像。如下图,红色方框内为随机裁剪出的224*224的图片。AlexNet训练时,对左上、右上、左下、右下、中间做了5次裁剪,然后翻转,得到10张裁剪的图片。防止大网络过拟合(underubstantialoverfitting)。

3、fancy PCA


4、样本不均衡——Labelshuffle

样本不均衡即有些类别图像特别多,有些特别少。类别不平衡数据的处理:Labelshuffle,由海康威视提出。由于场景数据集不均匀的类别分布,给模型训练带来了困难。海康威视提出了Label Shuffling的类别平衡策略

在Class-Aware Sampling方法中,定义了2种列表,一是类别列表,一是每个类别的图像列表,对于80类的分类问题来说,就需要事先定义80个列表,很不方便。对此进行了改进,只需要原始的图像列表就可以完成同样的均匀采样任务。以图中的例子来说,步骤如下:(1)首先对原始的图像列表,按照标签顺序进行排序;(2)然后计算每个类别的样本数量,并得到样本最多的那个类别的样本数。根据这个最多的样本数,对每类随机都产生一个随机排列的列表;(3)然后用每个类别的列表中的数对各自类别的样本数求余,得到一个索引值,从该类的图像中提取图像,生成该类的图像随机列表;(4)然后把所有类别的随机列表连在一起,做个Random Shuffling,得到最后的图像列表,用这个列表进行训练。每个列表,到达最后一张图像的时候,然后再重新做一遍这些步骤,得到一个新的列表,接着训练。

Label Shuffling方法的优点在于,只需要原始图像列表,所有操作都是在内存中在线完成,非常易于实现。


import random

category=80

f=open(‘scene_train_20170904.txt’) #按照label从小到大排序
#f=open(‘scene_validation_20170908.txt’)
dicts={}
for line in f:
line=line.strip(’\n’)
image=line.split()[0]
label=int(line.split()[-1])
dicts[image]=label
dicts=sorted(dicts.items(),key=lambda item:item[1])
f.close()

counts={} #统计每一类label的数目
new_dicts=[]
for i in range(category):
counts[i]=0
for line in dicts:
line=list(line)
line.append(counts[line[1]])
#print line
counts[line[1]]+=1
new_dicts.append(line)
#print counts

#for line in new_dicts:

tab=[] #把原列表按照每一类分成各个block并形成新列表
origin_index=0
for i in range(category):
block = []
for j in range(counts[i]):
block.append(new_dicts[origin_index])
origin_index+=1
#print block
tab.append(block)
#print tab

nums=[] #找到数目最多的label类别
for key in counts:
nums.append(counts[key])
nums.sort(reverse=True)
#print nums

lists=[] #形成随机label序列
for i in range(nums[0]):
lists.append(i)
#print lists
all_index=[]
for i in range(category):
random.shuffle(lists)
#print lists
lists_res=[j%counts[i] for j in lists]
all_index.append(lists_res)
#print lists_res
#print all_index

#f=open(‘train_shuffle_labels.txt’,‘w’) #按照随机序列提取图像生成最后的标签
#f=open(‘val_shuffle_labels.txt’,‘w’)
f=open(‘train_shuffle_labels.lst’,‘w’)
#f=open(‘val_shuffle_labels.lst’,‘w’)
shuffle_labels=[]
index=0
for line in all_index:
for i in line:
shuffle_labels.append(tab[index][i])
index+=1
#print shuffle_labels
random.shuffle(shuffle_labels)
id=0
for line in shuffle_labels:
#print line
#f.write(line[0]+’ ‘+str(line[1]))
f.write(str(id)+’\t’+str(line[1])+’\t’+line[0])
f.write(’\n’)
id+=1
f.close()

五、其他数据增强的方法

平移变换;旋转/仿射变换;高斯噪声、模糊处理。

对颜色的数据增强:图像亮度、饱和度、对比度变化。

注意: 训练和测试要 协调一致

   (1) 在训练的时候,我们通常都需要做数据增强,在测试的时候,我们通常很少去做数据增强。这其中似乎有些不协调,因为你训练和测试之间有些不一致。实验发现,训练的最后几个迭代,移除数据增强,和传统一样测试,可以提升一点性能。(2) 如果训练的时候一直使用尺度和长宽比增强数据增强,在测试的时候也同样做这个变化,随机取32个裁剪图片来测试,也可以在最后的模型上提升一点性能。 就是多尺度的训练,多尺度的测试。(3)训练过程的中间结果,加入做测试,可以一定程度上降低过拟合。

深度学习(Deep Learning)——卷积神经网络 (Convolutional Neural Networks / CNN)相关推荐

  1. 深度学习之卷积神经网络(Convolutional Neural Networks, CNN)(二)

    前面我们说了CNN的一般层次结构, 每个层的作用及其参数的优缺点等内容.深度学习之卷积神经网络(Convolutional Neural Networks, CNN)_fenglepeng的博客-CS ...

  2. 深度学习之卷积神经网络(Convolutional Neural Networks, CNN)

    前面, 介绍了DNN及其参数求解的方法(深度学习之 BP 算法),我们知道DNN仍然存在很多的问题,其中最主要的就是BP求解可能造成的梯度消失和梯度爆炸.那么,人们又是怎么解决这个问题的呢?本节的卷积 ...

  3. 卷积神经网络, Convolutional Neural Networks , CNN

    1,简介 CNN是deep learning在图像处理领域的一个应用 由具有可学习的权重和偏置常量(biases)的神经元组成,是deeplearning在图像处理的一个应用 2,卷积层(Convol ...

  4. 卷积神经网络Convolutional Neural Networks深度解析I

    知识的广度来自知识的深度,学习如果不成体系那是多可怕的一件事儿,希望我们在未来的学习道路上坚守初心,不要给自己留下遗憾,以自己喜欢的方式生活,做自己喜欢做的事,宠爱自己,做一个独一无二的自己! 对于文 ...

  5. 《DeepLearning.ai》第十课:卷积神经网络(Convolutional Neural Networks)

    第十课:卷积神经网络(Convolutional Neural Networks) 1.1 计算机视觉(Computer vision) 通常如果处理大图用传统的神经网络需要特别大的输入,因此需要大量 ...

  6. 卷积神经网络(Convolutional Neural Network, CNN)

    卷积神经网络(Convolutional Neural Network, CNN) 目录 卷积神经网络(Convolutional Neural Network, CNN) 概述: 结构: 卷积层:

  7. 卷积神经网络Convolutional Neural Network (CNN)

    卷积神经网络 转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/41596663 自今年七月份以来,一直在实验室负责卷积神经网络(Convol ...

  8. 吴恩达 深度学习系列--卷积神经网络(Convolutional Neural Networks)-03(目标检测)

    目标检测 3.1 目标定位(Object localization) 3.1.1概念 3.1.2 监督学习任务定义目标标签y 3.2 特征点检测(Landmark detection) 3.3 基于滑 ...

  9. 机器学习 卷积神经网络 Convolutional Neural Network(CNN)

    Convolutional Neural Network(CNN)- 卷积神经网络 CNN专用在影像上的神经网络,目的是作影像辨识.影像分类,即通过输入的影像,输出影像中的内容. 对于CNN,有两种解 ...

最新文章

  1. 【Deep Learning】深度学习中的函数类型
  2. 好好学python·运算符和流程控制
  3. mysql vpformysql引擎_MySQL InnoDB引擎B+树索引简单整理说明
  4. UINavigationbar的背景修改方法集合
  5. 逆向推导https的设计过程
  6. vivo手机解锁工具_点燃解锁的多一份激情,vivo NEX双屏版解锁体验报告
  7. 【Flink】flink keyby 在 subtask 中分配不均的研究
  8. 【转】性能测试设计和LR原理的探讨
  9. yum使用总结(转)
  10. win11系统 JDK 环境变量配置失败
  11. Useful webs
  12. MySQL_where条件查询
  13. 轻量级web api_API接口管理,这15种开源工具助你管理API
  14. Ansys多核仿真报错解决办法
  15. 计算机概论在线阅读,计算机科学概论(Python版)
  16. VUE 保证输入框无法输入半角数字以外的字符
  17. Qt 出现空指针错误:The inferior stopped because it received a signal from the Operating System
  18. Java_B_Province测试次数
  19. python爬虫入门 之 移动端数据的爬取
  20. 静态树表查找算法及C语言实现,数据结构算法C语言实现(三十二)--- 9.1静态查找表...

热门文章

  1. 关于凯撒密码加密特征值,base64加密shellcode并分离绕过杀软
  2. Xilinx MIPI CSI-2 Receiver Subsystem IP详解
  3. Teleportation
  4. 20180828 手机助手后台唤醒和Doze模式下WiFi密集唤醒
  5. 2023桂林电子科技大学计算机考研信息汇总
  6. 网络工程、软件工程、计算机科学与技术、物联网专业,主要都学习什么内容?
  7. python基础模型_零基础python代码策略模型实战
  8. Call requires API level 16 (current min is 15):
  9. java获取音乐文件的信息_JAudiotagger读取/修改音乐文件的属性信息
  10. 蚂蚁集团重组支付宝高层,井贤栋辞去支付宝法人和董事长职位