项目已上传至 GitHub —— lenet-5
下载MNIST数据集
以下有两种下载方式,如果链接失效可以搜索网上的资源
下载之后将其放在 mnist/data/ 文件夹下,目录结构如下
mnist/
data/
train-images-idx3-ubyte.gz
train-labels-idx1-ubyte.gz
t10k-images-idx3-ubyte.gz
t10k-labels-idx1-ubyte.gz
代码结构
为了使代码有更好的可读性和扩展性,需要将之按功能分为不同的模块,并将可重用的代码抽象成库函数
所以可以把代码分成三个模块
- inference
- train
- evaluate
并且保存下来的模型需要单独放在 model 文件夹下
具体的文件夹目录如下
mnist/
data/
......
LeNet-5/
model/
......
inference.py
train.py
eval.py
完整代码
神经网络结构类似 LeNet-5,input -> conv -> maxpool -> conv -> maxpool -> fc -> fc -> output
使用的优化方法
- 滑动平均
- 正则化
- 指数衰减法
使用 ReLU 激活函数
每隔 1000 轮保存一次模型
首先是 inference.py ,这个库函数负责模型训练及测试的前向传播过程
import tensorflow as tf
# 定义神经网络相关参数
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
# 前向传播
def inference(input_tensor, train, regularizer):
# 声明第一层卷积层的变量并实现前向传播过程
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,深度为32的过滤器,过滤器步长为1,使用全0填充
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,步长为2,使用全0填充
with tf.variable_scope('layer2-pool1'):
pool1 = tf.nn.max_pool(
relu1, ksize=[