LeNet5简介
LeNet-5模型是Yann Lecun教授在1998年提出的,成功应用于数字识别问题的卷积神经神经网络。在MNIST数据集上,达到了99.27%的正确率。
- 图像输入:28×28像素
- CONV1——卷积模板5×5×32,步长为1,全0填充,输出28×28×32图像
- Pool1——池化层模板是2×2,步长为2,全0填充,输出14×14×32图像
- CONV2——卷积模板5×5×64,步长为1,全0填充,输出14×14×64图像
- Pool2——池化模板大小为2×2,步长为2,全0填充,输出7×7×64图像
- FC1——全链接层1,输入为7×7×64=3136,展平之,向量维度1 ×3136,构造此全链接层的权重维度3136×512,FC1输出维度为1×512
- FC2——全链接层2,输入为1×512,权重维度为512×10,FC2输出维度1×10
网络搭建并训练之
编写网络搭建文件:mnist_cnn_inference.py
import tensorflow as tf
# 设定神经网络的参数
INPUT_NODE = 784
OUTPUT_NODE = 10
IMAGE_SIZE = 28
NUM_CHANNELS = 1
NUM_LABELS = 10
# 第一层卷积深度与尺寸
CONV1_DEEP = 32
CONV1_SIZE = 5
# 第二层卷积深度与尺寸
CONV2_DEEP = 64
CONV2_SIZE = 5
# 全连接层节点个数
FC_SIZE = 512
# 定义前向传播的过程,这里添加一个新参数train,用于区分训练和测试过程,这个过程中使用到dropout
# 方法,可以防止过拟合,且dropout只在训练中使用。
def inference(input_tensor, train, regularizer):
# 声明第一层神经网络的变量并完成前向传播过程
with tf.variable_scope('layer1-conv1'):
conv1_weights = tf.get_variable("conv1_weights", [CONV1_SIZE, CONV1_SIZE, NUM_CHANNELS, CONV1_DEEP],
initializer=tf.truncated_normal_initializer(stddev=0.1))
conv1_biases = tf.get_variable("conv1_biases", [CONV1_DEEP], initializer=tf.constant_initializer(0.0))
# 使用边长为5, 深度为32的过滤器, 过滤器的移动步长是1, 且使用全零填充。
conv1 = tf.nn.conv2d(input_tensor, conv1_weights, strides=[1, 1, 1, 1], padding='SAME')
relu1 = tf.nn.relu(tf.nn.bias_add(conv1, conv1_biases))
# 实现第二层池化层的前向传播过程
# 使用全零填充,移动的步长为2,这一层的输入是上一层的输出,也就是28*28*32
with tf.name_scope('layer2-pool1'):
pool1 = tf.nn.max_pool(relu1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
# 声明第三层的卷积变量并实现前向传播过程。这一层的输入为14*14*32的矩阵
with tf.variable_scope('layer3-conv2'):
conv2_weighs = tf.get_variable('conv2_weighs', [CONV2_SIZE, CONV2_SIZE, CONV1_DEEP, CONV2_DEEP],
initializer=tf.truncated_normal_initializer(stddev=0.1))
conv2_biases = tf.get_variable('conv2_biases', [CONV2_DEEP], initializer=tf.constant_initializer(0.0))
# 使用边长为5, 深度为64的过滤器, 步长为1, 且使用全零填充
conv2 = tf.nn.conv2d(pool1, conv2_weighs, strides=[1, 1, 1, 1], padding='SAME')
relu2 = tf.nn.relu(tf.nn.bias_add(conv2, conv2_biases))
# 实现第四层池化层的前向传播过程
# 这一层的输入是14*14*64的矩阵,输出是7*7*64的矩阵
with tf.name_scope('layer4-pool2'):
pool2 = tf.nn.max_pool(relu2, ksize=[1, 2, 2, 1], strides=[1