LeNet-5¶
Gradient-based learning applied to document recognition¶
LeNet-5 结构分析¶
\(输入-卷积-池化-卷积-池化-卷积(全连接)-全连接-全连接(输出)\)
各层网路结构和参数:
- 输入层
- 32 x 32 x 1
- C1 层
- 卷积层
- 输入: 32 x 32 x 1
- 滤波器大小: 5 x 5 x 1
- 滤波器个数: 6
- 输出: 28 x 28 x 6【TODO】
- 参数个数: 5 x 5 x 1 x 6 = 156
- P2 层
- 池化层
- 输入: 28 x 28 x 6
- 滤波器大小: 2 x 2
- 滤波器个数: 6
- 输出: 14 x 14 x 6
- 参数个数: 2 x 6 = 12【TODO】
- 平均池化
- C3 层
- 卷积层
- 输入: 14 x 14 x 6
- 滤波器大小: 5 x 5 x 6
- 滤波器个数: 16
- 输出: 10 x 10 x 16
- 参数个数: 5 x 5 x 6 x 16 = 2416
- P4 层
- 池化层
- 输入: 10 x 10 x 16
- 滤波器: 2 x 2
- 滤波器个数: 16
- 输出: 5 x 5 x 16
- 参数个数: 2 x 16 = 32
- 平均池化
- C5 层
- 论文中是个卷积层,但滤波器大小为 5 x 5,所以其本质上是个全连接层。如果将 5 x 5 x 16 拉成一个向量,它就是一个全连接层。
- 输入: 5 x 5 x 16
- 滤波器大小: 5 x 5 x 16
- 滤波器个数: 120
- 输出: 1 x 1 x 120
- 参数个数: 5 x 5 x 16 x 120 + 120 = 48120
- F6 层
- 全连接层
- 激活函数: \(tanh\)
- 输入: 120
- 输出: 84
- 参数个数: 120 x 84 + 84
- 全连接层
- F7 层
- 全连接层,输出层
- 输入: 84
- 输出: 10
- 参数个数: 84 x 10 + 10
LeNet-5 TensorFlow 实现¶
步骤:
- 定义创建输入、输出的占位符变量模块
- 初始化各层参数模块
- 创建前向传播模块
- 定义模型优化迭代模块
- 设置输入数据
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
def create_placeholder():
X = tf.placeholder(tf.float32, shape = (None, 28, 28))
Y = tf.placeholder(tf.float32, shape = (None, 10))
keep_prob = tf.placeholder(tf.float32)
return X, Y, keep_prob
def main():
mnist = input_data.read_data_sets("./data/", one_hot = True)
batch_size = 128
learning_rate = 0.001
display_step = 10
test_step = 5000
num_steps = 10000
dropout = 0.5
l2_lambda = 0.0001
lenet_model()
if __init__ == "__main__":
main()