本篇文章提到的一些坑主要来自于学习《TensorFlow实战Google深度学习框架》一书第6.4章节中关于使用LeNet5做MNIST
一 LeNet-5简介
LeNet-5模型是Yann LeCun教授于1998年在论文Gradient-based learning applied to document recognition中提出的,它是第一个成功应用于数字识别问题的卷积神经网络。LeNet-5模型一共有7层,LeNet-5模型的结果框架图如下:
layer1:卷积层Conv1
接收输入层大小[32,32,1],经过尺寸为[5,5,6],步长为1的过滤器的无全0填充卷积运算,将得到[28,28,6]的卷积结果。
layer2:池化层Pool1
接收layer1,经过尺寸为[2,2],步长为2的过滤器进行最大值池化,得到[14,14,6]的池化结果。
layer3:卷积层Conv2
接收layer2,经过尺寸为[5,5,16],步长为1的过滤器的无全0填充卷积运算,将得到[10,10,16]的卷积结果。
layer4:池化层Pool2
接收layer3,经过尺寸为[2,2],步长为2的过滤器进行最大值池化,得到[5,5,16]的池化结果。
将[5,5,16]的结果转化成FC层可接收数据形式,即将[5,5,16]reshpe成[1,5*5*16]
layer5:全连接层FC1
接收layer4,将400个节点进行全连接,输出120个节点
layer6:全连接层FC2
接收layer5,将120个节点进行全连接,输出84个节点
layer7:全连接层SoftMax
接收layer5,将84个节点进行全连接,输出10个节点
二 书中示例代码
# -*- coding=utf-8 -*-
"""
LeNet网络结构代码
lenet_inference.py
"""
import tensorflow as tf
# 配置神经网络参数
INPUT_NODE = 784
OUTPUT_NODE = 10
# 配置图像数据参数
IMAGE_SIZE = 28
NUM_CHANNELS = 1
NUM_LABELS = 10
# 第一层卷积层尺寸和深度
CONV1_SIZE = 5
CONV1_DEEP = 32
# 第二层卷积层尺寸和深度
CONV2_SIZE = 5
CONV2_DEEP = 64
# 全连接层的节点个数
FC_SIZE = 512
def inference(input_tensor, train, regularizer):
# 定义第一层卷积层:输入28×28×1 输出28×28×32
with tf.variable_scope('layer1-conv1'):
conv1_weights = tf.get_variable('weight', [CONV1_SIZE, CONV1_SIZE, NUM_CHANNELS, CONV1_DEEP],
initializer=tf.truncated_normal_initializer(stddev=0.1))
conv1_biases = tf.get_variable('bias', [CONV1_DEEP], initializer=tf.constant_initializer(0.0))
# 使用5×5×32的过滤器,步长为1,全0填充
conv1 = tf.nn.conv2d(input_tensor, conv1_weights, strides=[1, 1, 1, 1], padding='SAME')
# 使用relu激活函数
relu1 = tf.nn.relu(tf.nn.bias_add(conv1, conv1_biases))
# 定义第二层池化层:输入28×28×32 输出14×14×32
with tf.name_scope('layer2-pool1'):
# ksize和strides首尾必须为1,ksize过滤器尺寸,strides步长
pool1 = tf.nn.max_pool(relu1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
# 定义第三层卷积层:输入14×14×32 输出14×14