前言:
在全连接网络中,待优化的参数过多,全连接NN:每个神经元都与前后相邻层的每一个神经元相连接,输入为特征值,输出为预测的结果,因此参数个数数量庞大,网络参数的计算公式:
参数个数:
例如:对于一张28*28低像素的图片来说,输入节点为784,中间层有500个节点,输出层有10个节点,那么第一层参数为:784*500个w+500个b,第二层参数为,一共397510个优化的参数,数量庞大,不利于建模与计算。
待优化的参数过多会容易造成参数的过拟合。这就需要一个简化参数量的方法,在实际应用中,先对原始图像进行特征提取,将提取到的特征喂给全连接网络。
定义:
卷积就是特征提取的一种方法:
一般用一个正方形的卷积核,保证正方形的中心遍历图片上的每一个像素点,图片区域内,相对应的(每一个像素点的像素值)乘以(卷积核内相对应点的权重),求和之后在加上偏置。
原图5*5的图像,经过卷积核计算为:
输出图片边长=(输入图片边长-卷积核长+1)/步长。在上图中:得到(5-3+1)/1=3
另外为保证原始图片特征的最佳提取,边缘的数据更好的保留,可以在外边一层加入池化层padding,在全零填充中,输出图片的尺寸为:输入图片边长/步长;
在TensorFlow框架中,用参数padding=‘ SAME ’或padding=‘ VALID ’表示。
tf.nn.conv2d(输入描述,eg.[batch,5,5,1] #分辨率5*5,通道数为1
卷积核描述,eg.[3,3,1,16] #行列数:3*3,通道数为1,核个数为16,卷积图片操作之后,输出是16通道
核滑动步长,eg.[1,1,1,1] #行步长,列步长,固定第一个和第四个参数为1.
padding=' VALID ')
池化(Pooling)
池化用于减少特征数量,简化输入图片。常用的池化方法有:
- 最大值池化:提取图片纹理
- 均值池化:保留背景特征
在TensorFlow中计算池化:
pool=tf.nn.max_pool(输入描述,eg,[batch,28,28,6]
池化该描述(仅大小),eg.[1,2,2,1]
池化核滑动步长,eg.[1,2,2,1]
padding='SAME')
舍弃(Dropout)
在神经网络的训练过程中,将一部分神经元按照一定概率从神经网络中暂时舍弃。防止过拟合,这种舍弃仅仅是在训练过程中的舍弃,在使用时被舍弃的神经元恢复链接。
在TensorFlow中使用舍弃:
tf.nn.dropout(上层输出,暂时舍弃的概率)
if train: 输出=tf.nn.dropout(上层输出,暂时舍弃的概率)
总结
卷积神经网络:借助卷积核(kernel)提取特征后,送入全连接网络。
CNN模型的主要模块:
CNN模型的发展历史: