直接进入主题,大名鼎鼎的LeNet诞生于1994年,是最早的深层卷积神经网络之一,并且推动了深度学习的发展。LeNet模型是由Yann LeCun所完成的,他一直认为直接将每个像素作为多层神经网络的输入是不能利用图像本身所含有的空间相关性,效率大打折扣。
LeNet5当时的特征有如下几点:
- 每一个卷积层包含三个部分:卷积、降采样和非线性激活函数
- 使用卷积提取空间特征
- 降采样的最大池化层
- 双曲正切(tanh)或S型(sigmoid)的激活函数
- MLP作为最后的分类器
LeNet的网络结构如上图所示,它的输入图像为32*32的灰度图像,后面有三个卷积层,一个全连接层和一个高斯连接层。下面简单介绍一下(网上也有很多介绍此模型的文章):
C1:
- 卷积核数目:6
- 卷积核尺寸:5x5
- 卷积核步长:1
- padding:SAME
S2:
- 采样尺寸:2x2
- 采样步长:2
- padding:SAME
C2:
- 卷积核数目:16
- 卷积核尺寸:5x5
- 卷积核步长:1
- padding:SAME
S4:
- 采样尺寸:2x2
- 采样步长:2
- padding:SAME
C5:
- 卷积核数目:120
- 卷积核尺寸:5x5
- 卷积核步长:1
- padding:SAME
F6:
- 全连接隐含节:84
- 激活函数:sigmoid
F7:
- 全连接隐含节:10
下面,我将LeNet模型的预测模块介绍一下,因为网上和《TensorFlow实战Google深度学习框架》书上都有了前向传播和训练部分的代码演示,所以,我只是简单介绍一下预测部分的代码,算是补充完整。
import time
import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# 加载mnist_inference.py和mnist_train.py中定义的常量和函数
import lenet_inference
import lenet_train
# 每10秒加载一次最新的模型,并在测试数据上测试最新模型的正确率
EVAL_INTERVAL_SECS = 10
def lenet_evaluate(mnist):
with tf.Graph().as_default() as g:
# 定义输入输出的格式
x = tf.placeholder(
tf.float32,
[mnist.validation.images.shape[0],
lenet_inference.IMAGE_SIZE,
lenet_inference.IMAGE_SIZE,
lenet_inference.NUM_CHANNELS
],
name="x-input"
)
y_ = tf.placeholder(
tf.float32,
[None, lenet_inference.OUTPUT_NODE],
name="y-output"
)
xs = mnist.validation.images
# 在这里不能使用tf.reshape()函数,不然会出错。
reshape_xs = np.reshape(xs, [xs.shape[0], lenet_inference.IMAGE_SIZE, lenet_inference.IMAGE_SIZE, lenet_inference.NUM_CHANNELS])
validate_feed = {
x: reshape_xs,
y_: mnist.validation.labels
}
y = lenet_inference.inference(x, None, None)
# 使用前向传播的结果计算正确率
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# 通过变量重命名的方式来加载模型,这样在前向传播的过程中就不需要调用求滑动平均的函数来获得平均值了。
variable_averages = tf.train.ExponentialMovingAverage(
lenet_train.MOVING_AVERAGE_DECAY
)
variables_to_restore = variable_averages.variables_to_restore()
saver = tf.train.Saver(variables_to_restore)
# 每隔10秒调用一次计算正确率的过程以检测训练过程中正确率的变化
while True:
with tf.Session() as sess:
# 加载模型
ckpt = tf.train.get_checkpoint_state(
lenet_train.MODEL_SAVE_PATH
)
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1]
accuracy_score = sess.run(accuracy, feed_dict=validate_feed)
print("After %s training step(s), validation accuracy = %g" % (global_step, accuracy_score))
else:
print("No checkpoint file found")
return
time.sleep(EVAL_INTERVAL_SECS)
def main(argv=None):
# 加载mnist数据
mnist = input_data.read_data_sets("D:/Project/DLearning/DL_TensorFlow/mnist_data", one_hot=True)
lenet_evaluate(mnist)
if __name__ == '__main__':
tf.app.run()
参考:
《TensorFlow实战Google深度学习框架》
https://blog.csdn.net/xjy104165/article/details/78218057
https://github.com/caicloud/tensorflow-tutorial/tree/master/Deep_Learning_with_TensorFlow/1.4.0/Chapter06/LeNet-5