1 卷积神经网络简介
卷积神经网络(Convolutional Neural Network, CNN)由LeCun在上世纪90年代提出。
LeCun Y., Bottou L., Bengio Y., and Haffner P., Gradient-based learning applied to document recognition, Proceedings of the IEEE, pp. 1-7, 1998.
卷积核和特征图:
如果我们用6个卷积核,就能获得6个特征图(feature map)。你也可以把产生的6个特征图看成一个新的“图像”,其height, width, channel数目分别是28,28,6。
2 基本操作
2.1 卷积层
卷积层:特征提取
可以将图像卷积看成全连接网络的权值共享(weight sharing)
p
1
=
w
1
∗
x
1
+
w
2
∗
x
2
+
w
3
∗
x
4
+
w
4
∗
x
5
+
b
1
p
2
=
w
1
∗
x
2
+
w
2
∗
x
3
+
w
3
∗
x
5
+
w
4
∗
x
6
+
b
2
p
3
=
w
1
∗
x
4
+
w
2
∗
x
5
+
w
3
∗
x
7
+
w
4
∗
x
8
+
b
3
p
4
=
w
1
∗
x
5
+
w
2
∗
x
6
+
w
3
∗
x
8
+
w
4
∗
x
9
+
b
4
\begin{array}{l} p_1 = w_1 * x_1 + w_2 * x_2 + w_3 * x_4 + w_4 * x_5 + b_1 \\ p_2 = w_1 * x_2 + w_2 * x_3 + w_3 * x_5 + w_4 * x_6 + b_2 \\ p_3 = w_1 * x_4 + w_2 * x_5 + w_3 * x_7 + w_4 * x_8 + b_3 \\ p_4 = w_1 * x_5 + w_2 * x_6 + w_3 * x_8 + w_4 * x_9 + b_4 \end{array}
p1=w1∗x1+w2∗x2+w3∗x4+w4∗x5+b1p2=w1∗x2+w2∗x3+w3∗x5+w4∗x6+b2p3=w1∗x4+w2∗x5+w3∗x7+w4∗x8+b3p4=w1∗x5+w2∗x6+w3∗x8+w4∗x9+b4
上一页中的卷积操作,等价于如下权值共享网络:
参数个数计算:
第1层(convolutional layer): (55+1)6=156
第2层(subsampling layer): 0
第3层(convolutional layer): (556+1)16=2416
第4层(subsampling layer): 0
第5层(fully connected layer): (55*16+1)*120=48120
第6层(fully connected layer): (120+1)*84=10164
第7层(fully connected layer): (84+1)*10=850
参数总数:61,706
2.2 ReLU 激活层
加入非线性因素,将卷积层输出结果做非线性映射。
ReLU 函数:
- 对于输入负值,输出全为0;
- 正值原样输出。
2.3 池化层
提取重要的特征信息。
将输入图像进行缩小,减少像素信息,保留重要信息。
取最大值、平均值等。
2.4 单层卷积神经网络
卷积、激活函数、池化组合在一起。
2.5 全连接层
全连接层在整个卷积神经网络中起到“分类器”的作用,即通过卷积、池化等深度网络后,再经过全连接层对结果进行识别分类。
2.6 卷积神经网络流程
3 代码分析
1.引入头文件,加载数据
将数据读入数据集 独热编码
2.封装函数,方便网络搭建多处调用
(1)构建权重
w
w
w,产生随机变量
(2)构建偏置
b
b
b
(3)卷积层准备:卷积函数实现
(4)卷积层 激活函数
x
x
x与0作比较
(5)池化层:小一倍数据 特征图
3.特征标签的占位符
4.开始网络搭建 CNN构建
1)卷积层 ,创建patch=5*5卷积核
构建
w
,
b
w, b
w,b
([卷积核大小5 5,输入数据的维度1(灰度处理),输出的高度32])
(2)第一层卷积层,调用函数
(3)激活relu
(4)池化
2)第二层卷积
和第一层差不多,注意几个点
构建w\b 上一层的输出是这一层的输入,这一层的输出2的次方
第一层卷积层(上一层池化的结果,这一层的w)
3)全连层
据拍平、提纯、分类
(1)第一层全连层:前馈神经网络 输入:第二次池化结果 7764 假设神经元1024个
(2)第二层全连层:分类器
上层输出1024是这层输入,总的分类数为这层输出
5.构建损失函数
6.优化器
"""
卷积神经网络:手写数字模型
"""
import tensorflow as tf
# 加载数据
from tensorflow.examples.tutorials.mnist import input_data
# 将数据读入数据集 独热编码
input_data.read_data_sets('MNIST_data/',one_hot=True)
input_size=28*28
# 分类
num_class=10
# 创建函数:构建权重w,产生随机变量
def weight_variable(shape):
"""
构建权重w,产生随机变量
:param shape:
:return:
"""
w=tf.random_normal(shape=shape,stddev=0.01)
return tf.Variable(w)
def bias_variable(shape):
"""
构建偏置b
:param shape:
:return:
"""
b=tf.constant(0.01,shape=shape)
return tf.Variable(b)
def con2d(x,w):
"""
卷积层准备:卷积函数实现
:param x: 图像矩阵信息
:param w: 卷积核的值
:return: conv2d
"""
# strides:卷积步长[上、右、下、左]
return tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='SAME')
def relu_con(x):
"""
卷积层 激活x与0作比较
:param x:
:return:
"""
return tf.nn.relu(x)
def max_pool_con2x2(x):
"""
池化层:小一倍数据 特征图
:param x: 图片的矩阵信息
:return:
value,
ksize,
strides,【上、右、下、左】右、下两个单位
padding,
data_format="NHWC",
name=None,
input=None
"""
return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
# 网络搭建
# 1.特征标签的占位符
# # 1.占位符---输入层 x:数据输入到图中进行计算 y:识别的数字,有几个类别输入几个数字
xs= tf.placeholder(tf.float32,shape=[None,input_size]) #64列不知道几行
ys = tf.placeholder(tf.float32,shape=[None,num_class])#10类不知道多少个
# 将xs灰度处理:拍平变成一维[-1任意一张图片,28,28矩阵大小,1深度]
# 将该数据放到卷积层操作
x_image=tf.reshape(xs,[-1,28,28,1])
# CNN构建
# 第一层:卷积层 创建patch=5*5卷积核
# ([卷积核大小5 5,输入数据的维度1(灰度处理),输出的高度32])
# 构建w\b
w_conv1=weight_variable([5,5,1,32])
b_conv1=bias_variable([32])
# 第一层卷积层
conv1 = con2d(x_image,w_conv1)
# 激活relu
h_conv1=relu_con(conv1+b_conv1)
# 池化
h_pool1=max_pool_con2x2(h_conv1)
# 第二层=====
# 第二层:卷积层 创建patch=5*5卷积核
# ([卷积核大小5 5,输入数据的维度1(灰度处理),输出的高度32])
# 构建w\b 上一层的输出是这一层的输入,这一层的输出2的次方
w_conv2=weight_variable([5,5,32,64])# 14*14*32
b_conv2=bias_variable([64])
# 第一层卷积层(上一层池化的结果,这一层的w)
conv2 = con2d(h_pool1,w_conv2)
# 激活relu
h_conv2=relu_con(conv2+b_conv2)
# 池化
h_pool2=max_pool_con2x2(h_conv2)
# 全连层 数据拍平、提纯、分类
# 不再做卷积了
# 全连接第一层:前馈神经网络 输入:第二次池化结果 7*7*64 假设神经元1024个
w_fc1=weight_variable([7*7*64,1024])
b_fc1=bias_variable([1024])
# 输出矩阵 几行不管 列:7*7*64
h_pool2_flat=tf.reshape(h_pool2,[-1,7*7*64])
# 前馈神经网络wx+b
h_fc1=tf.matmul(h_pool2_flat,w_fc1)+b_fc1
# 激活
h_flc1=relu_con(h_fc1)
# 第二层全连层:分类
w_fc2=weight_variable([1024,num_class])
b_fc2=bias_variable([num_class])
# 计算并激活
# 前馈神经网络wx+b
h_fc2=tf.matmul(h_flc1,w_fc2)+b_fc2
# 激活---分类 返回每种情况的概率
predict=h_flc2=tf.nn.softmax(h_fc2)
# 构建损失函数
# 优化器