CNN
卷积神经网络的提出,解决了传统的基于SIFT类型特征提取算法的繁琐问题。原图像可以直接作为输入。
CNN与SIFT一样,对缩放、平移、旋转等畸变具有不变性,有很强泛化性。
* 卷积的权值共享,大幅减少神经网络参数量,防止过拟合(low bias; high var)
* 全连接层由于参数过多、梯度弥散,不利于多层训练
每个卷积会经过以下几个操作
* 图像经过多个不同的卷积核滤波,并加上bias提出局部特征,每个卷积核会映射出一个新的2D图像
* 将卷积核滤波输出进行非线性激活函数处理,如ReLU
* 对激活函数的输出进行池化(降采样),一般使用最大池化,即保留最显著特征,提高畸变容忍能力、
* 最后可以加上LRN(?),或者Batch Normalization
权值共享
假设图像是1000x1000,则输入为1,000,000x1
全连接层
每一个节点连接1000,000个像素,共1000,000个节点,参数量极大
局部连接
每一个节点与10x10的像素连接,共10x10x1000,000个参数,比全连接缩小10000倍
卷积操作
每一个节点参数一样,且仅仅与核有关系。10x10的卷积层,参数为100
Feather Map
每一个卷积核的输出成为一个Feather Map。通常,前面的卷积层提取简单特征,比如点、线,下一层提取更高阶特征,比如,几何图形,一层一层往下,组合成眼睛、鼻子等五官,最后组合成一张人脸,完成人脸匹配识别。
Tensorflow 实现简单的卷积神经网络
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
mnist = input_data.read_data_sets("../../mnist/", one_hot = True)
sess = tf.InteractiveSession()
Extracting ../../mnist/train-images-idx3-ubyte.gz
Extracting ../../mnist/train-labels-idx1-ubyte.gz
Extracting ../../mnist/t10k-images-idx3-ubyte.gz
Extracting ../../mnist/t10k-labels-idx1-ubyte.gz
定义初始化函数来简化多次参数的初始化
- 制造噪声来打破对称结构,如截断的正态分布,标准差0.1
- 因为使用ReLU,因此置偏置bias=0.1以避免死亡节点
def weight_variable(shape):
init_w = tf.truncated_normal(shape=shape, stddev=0.1)
return tf.Variable(init_w)
def bias_variable(shape):
init_b = tf.constant(0.1, shape=shape)
return init_b
定义卷积层、池化层函数简化多次卷积、池化操作
- tf.nn.conv2d是二维卷积函数,卷积参数W[row, col, channel, num_of_convs]
- tf.nn.max_pool是最大池化函数,strides设为横竖步长2,将图片所为原来的一半
- 步长strides[batch, height, width, channels],batch为图片样本,1代表不放过任何样本;channel=1代表不放过任何通道
# 图片大小不变
def