🛋️卷积神经网络与普通神经网络的区别在于,卷积神经网络包含了一个由卷积层和子采样层(池化层)构成的特征抽取器。由此可知,普通的网络只有分类之类的作用,例如SVN等。
在CNN的一个卷积层中,通常包含若干个特征图(featureMap),每个特征图由一些矩形排列的的神经元组成,同一特征图的神经元共享权值,这里共享的权值就是卷积核。卷积核一般以随机小数矩阵的形式初始化,在网络的训练过程中卷积核将学习得到合理的权值。共享权值(卷积核)带来的直接好处是减少网络各层之间的连接,同时又降低了过拟合的风险。子采样也叫做池化(pooling),通常有均值子采样(mean pooling)和最大值子采样(max pooling)两种形式。子采样可以看作一种特殊的卷积过程。卷积和子采样大大简化了模型复杂度,减少了模型的参数。
目录
1.2线性整流层(Rectified Linear Units Layer,ReLU Layer)
1.4全连接层(Fully-Connected Layer)
🛋️卷积层(Convolutional Layer),卷积神经网络中每个卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能仅仅提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。
🛋️线性整流层(Rectified Linear Units Layer,ReLU Layer),这一层激活函数使用线性整流f(x)=max(0,x)
🛋️池化层(Pooling Layer),通常在卷积层之后会得到维度很大的特征,将特征切成几个区域,取其最大值或平均值,得到新的、维度较小的特征。[降维]
🛋️全连接层(Fully-Connected Layer),把所有局部特征结合变成全局特征,用来计算最后每一类的得分。
- from calendar import c
- from tkinter import Y
- import numpy as np
- import matplotlib.pyplot as plt
- class Relu():
-
- def relu(self):
- y = np.array([])
- for i in range(len(self)):
- if self[i] > 0 :
- y = np.append(y,self[i])
- if self[i] < 0 :
- y = np.append(y,0)
- return y
-
- def plot_relu(self,low,up,pace):
- x = np.arange(low,up,pace)
- y = Relu.relu(x)
- plt.plot(x,y)
- plt.show()
-
- if __name__ =='__main__':
- Relu().plot_relu(-10,10,0.1)
激活函数为什么使用relu而不使用sigmoid?
和sigmoid函数需要计算指数和倒数相比,Relu函数其实就是一个max(0,x),计算代价小很多
回顾计算梯度的公式∇=σ′δx。其中σ′是sigmoid函数的导数。在使用反向传播算法进行梯度计算时,每经过一层sigmoid神经元,梯度上就要乘一个σ′。从下图可以得到,σ′函数最大值是1/4,因此,乘一个σ′会导致梯度越来越小,这对于深层神经网络的训练是个很大的问题。而Relu函数的导数是1,不会导致梯度越变越小。当然,激活函数(的导数)仅仅是导致梯度减小的一个因素,但在此方面,Relu的表现优于sigmoid,使用Relu激活函数可以训练更深的网络。
sigmoid函数图像
- import numpy as np
- import matplotlib.pyplot as plt
- def sigmoid(x):
-
- y = 1 / (1 + np.exp(-x))
- return y
- def plot_sigmoid():
- #定义参数:起点、终点、间距
- x = np.arange(-10,10,0.1)
- y = sigmoid(x)
- plt.plot(x,y)
- plt.show()
- if __name__ == '__main__':
- plot_sigmoid()
sigmoid导数图像
- import numpy as np
- from matplotlib import pyplot as plt
-
- def sigmoid(x):
- return 1/(1+np.exp(-x))
-
- def dsigmoid(x):
- return sigmoid(x)*(1-sigmoid(x))
-
- x = np.arange(-10,10,0.1) #x = np.linspace(-10,10,num=100)
- y = sigmoid(x)
- dy= dsigmoid(x)
-
- plt.subplot(1,2,1)
- plt.plot(x,y)
- plt.subplot(1,2,2)
- plt.plot(x,dy)
- plt.show()
通过对大脑的研究发现,大脑在工作的时候只有5%的神经元是被激活的,而采用sigmoid激活函数的人工神经网络中的神经元,其激活率大概是50%。有文献称人工神经网络为15%-30%的激活率是比较理想的。因为Relu函数在输入小于0时是完全不激活的,因此可以获得一个更低的激活率。
全连接神经网络之所以不太适合图像识别任务,主要有以下几个原因:
考虑输入一个10000*10000像素的图片,输入层便有10000*10000=个节点,假设第一个隐藏层有100个节点(这个数量并不多),那么仅仅这一个隐藏层就有(10000*10000+1)*100=个参数,这实在是太多了!我们看到图像只扩大一点,参数数量就会多很多,因此全连接神经网络的扩展性很差。
对于图像识别任务来说,每个像素和其周围像素的联系是比较紧密的,和离得远的像素的联系可能就很小了。如果一个神经元和上一层所有神经元相连,那么就相当于对于一个像素来说,图像的所有像素都同等看待,这不符合前面的假设,当我们完成每个连接权重的学习之后,最终可能会发现,有大量的权重,它们的值都是很小的(也就是这些连接其实无关紧要)。努力学习大量并不重要的权重,这样的学习非常低效
我们知道神经网络层数越多其表达能力越强,但是通过梯度下降方法训练深度全连接神经网络很困难,因为全连接神经网络的梯度很难传递超过3层,因此,我们很难(不可能)得到一个很深的全连接神经网络,也就限制了它的能力。
每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连,这样就减少了很多参数。
一组连接可以共享同一个权重,而不是每个连接有一个不同的权重,这样又减少了很多参数。
可以使用Pooling来减少每层的样本数,进一步减少参数数量,同时还可以提升模型的鲁棒性。
对于图像识别任务来说,卷积神经网络通过尽可能保留重要的参数,去掉大量不重要的参数,来达到更好的学习效果。
一个卷积神经网络由若干卷积层、Pooling层、全连接层组成,我们可以建构各种不同的卷积神经网络,它的常用架构模式为:
INPUT -> [[CONV]*N -> POOL]*M -> [FC]*K,也就是N个卷积层叠加,然后(可选)叠加一个Pooling层,重复这个结构M次,最后叠加K个全连接层。
上图展示的卷积神经网络:INPUT -> [CONV] -> [POOL] -> [CONV] -> [POOL] -> [FC] -> [FC]
按照上述模式可表示为: INPUT -> [[CONV]*1 -> POOL]*2 -> [FC]*2 也就是N=1,M=2,K=2.
🛋️从上图可以发现卷积神经网络的层结构和全连接神经网络的层架构有很大不同。全连接神经网络每层的神经元是按照一维排列的,也就是排成一条直线的样子;而卷积神经网络每层的神经元是按照三维排列的,也就是排成一个长方体的样子,有宽度、高度和深度。
🛋️上图中,输入层的宽度和高度对应于输入图像的宽度和高度,而它的深度为1。接着第一个卷积层对这幅图像进行了卷积操作,得到了3个Feature Map。这个里的‘3’实际上就是指这个卷积层包含3个Filter,也就是3套参数。每个Filter都可以把原始输入图像卷积得到一个Feature Map,3个Filter可以得到3个Feature Map。至于一个卷积层可以有多少个Filter,那是可以自由设定的,也就是说,卷积层的Filter个数也是一个超参数。我们可以把Feature Map看作是通过卷积变换提取到的图像特征,3个Filter就对原始图像提取出三组不同的特征,也就是得到了3个Feature Map,也称作3个通道(channel)。
🛋️在第一个卷积层之后,池化层对3个Feature Map做了下采样,得到了3个更小的Feature Map。接着就是第二个卷积层,它有5个Filter。每个Filter都把前面下采样之后的3个Feature Map卷积在一起,得到一个新的Feature Map,这样5个Filter就得到了5个Feature Map。接着是第二个池化层,继续对5个Feature Map进行下采样,得到了5个更小的Feature Map。
🛋️上图所示网络的最后两层是全连接层,第一层全连接层的每个神经元和上一层5个Feature Map中的每个神经元相连,第二个全连接层(也就是输出层)的每个神经元则和第一个全连接层的每个神经元相连,这样得到了整个网络的输出。
若将逻辑函数f表达式中所有的“·”变成“+”,“+”变成“·”,“0”变成“1”,“1”变成“0”,原变量变成反变量,反变量变成原变量,并保持原函数中的运算顺序不变 ,则所得到的新的函数为原函数f的反函数。这一规则称为反演规则。
某一时刻的输出是之前很多次输入乘以各自的衰减系数之后的叠加而形成某一点的输出,然后再把不同时刻的输出点放在一起,形成一个函数,这就是卷积。
轮廓是低频信号.
细节是高频信号.