一,卷积神经网络简介
卷积神经网络提供了一种方法来特化神经网络,使其能够处理清楚的网络结构拓扑的数据,以及将这样的模型扩展到非常大的规模。这种方法在二维图像拓扑上是最成功的。
卷积神经网络的主要特征有:
- 稀疏连接:源于视觉的局部感受野。
- 权值共享
- 等变表示:平移等变性。
- 总结:稀疏连接和权值共享降低了参数量,使训练复杂度大大降低,并减轻了过拟合。同时权值共享还赋予了卷积网络对平移的容忍性,而池化层降采样进一步降低了输出餐数量,并赋予模型对轻度形变的容忍性,提高了模型的泛化能力。
卷积神经网络中的一个卷积层一般包括三级:
- 卷积级:利用卷积核加偏置进行仿射变换,提取feature map。
- 探测级:非线性激活函数,如Relu。
- 池化级:降采样,一般用最大池化,保留最显著的特征,并提升模型的畸变容忍能力。
卷积神经网络的参数只与卷积核的大小与数量有关,只要我们提供的卷积核数量足够多,能提取出各种方向的边或者各种形态的点,就可以让卷积层抽象出有效而丰富的高阶特征。
经典卷积网络:
- LeNet5
- AlexNet
- VGG
- GoogleInceptionNet
- ResNet
二,用TensorFlow实现简单的卷积网络
padding的填充方式有三种(假设输入图像宽为m,卷积核宽为k,步长为1):
- valid:无论怎样都不使用零填充的极端情况,并且卷积核只允许访问那些图像中能够完全包含整个核的位置。输出的宽度会变成m-k+1。
- same:只进行足够的零填充来保持输出与输入有相同的大小,这可能会导致边界像素的欠表示。
- full:进行足够的零填充,来保证每个像素在每个方向上正好被访问了k次,最终输出图像的宽度为m+k-1,一般不用。
但,零填充的最优数量处于valid和same padding之间的某个位置。
一些基础
- tf.nn.conv2d(x,filters,strides,padding)
①x=[图像数量(一般为-1代表样本数量不固定),长度,宽度,图像通道数]。
②filters=[长度,宽度,输入图像的通道数,卷积核数]
③strides = [批处理步长(一般为1),长度上的步长,宽度上的步长,卷积核数上的步长(一般为1)]
④padding=’same’或‘valid’,用来定义零填充的方式。 - tf.nn.max_pool(x,pool_kernel,strides,padding)
参数形式同conv2d。
tensorflow的实现
# 一般CNN的实现
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# 0,导入数据
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
print(mnist.train.images.shape,mnist.train.labels.shape)
sess = tf.InteractiveSession()
# 1,定义一些要重复使用的函数
def weighted_variable(shape):
initial = tf.truncated_normal(shape,stddev=0.1)
return tf.Variable(initial)
def bias_variable(shape):
initial = tf.constant(0.1,shape=shape)
return tf.Variable(initial)
def conv2d(x,filters):
return tf.nn.conv2d(x,filters,strides=[1,1,1,1],padding="SAME")
def max_pool_2x2(x):
return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
# 2,定义输