深度学习笔记14:CNN经典论文研读之Le-Net5及其Tensorflow实现

      在前几次笔记中,笔者基本上将卷积神经网络的基本原理给讲完了。从本次笔记开始,笔者在深度学习笔记中会不定期的对 CNN 发展过程中的经典论文进行研读并推送研读笔记。今天笔者就和大家一起学习卷积神经网络和深度学习发展历史上具有奠基性的经典论文之一的关于 LeNet-5 网络一文。LeNet-5 是由具有卷积神经网络之父之美誉的 Yann LeCun 在1998年发表在 IEEE 上面的一篇 Gradient-based learning applied to document recognition 上提出来的,所以直接由 LeCun 大佬名字命名了。http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf

LeNet-5  网络结构

      该篇论文有 42 页,但关于 LeNet-5 网络的核心部分并没有那么多,我们直接定位第二章的B 小节进行阅读。LeNet-5 的网络结构如下:

640?wx_fmt=png       LeNet-5  共有 7 层,输入层不计入层数,每层都有一定的训练参数,其中三个卷积层的训练参数较多,每层都有多个滤波器,也叫特征图,每个滤波器都对上一层的输出提取不同的像素特征。所以  LeNet-5  的简略结构如下:

输入-卷积-池化-卷积-池化-卷积(全连接)-全连接-全连接(输出)

各层的结构和参数如下:

P2层是个池化层,其输入输出结构如下:

C3层是个卷积层,其输入输出结构如下:640?wx_fmt=pngP2 池化之后的特征图组合计算得到C3的滤波器个数。

P4层是个池化层,其输入输出结构如下:

C5层在论文中是个卷积层,但滤波器大小为 5 x 5,所以其本质上也是个全连接层。如果将5 x 5 x 16 拉成一个向量,它就是一个全连接层。其输入输出结构如下:

F6层是个全连接层,全连接的激活函数采用的是 tanh 函数,其输入输出结构如下:

F7层即输出层,也是个全连接层,其输入输出结构如下:

LeNet-5 的 Tensorflow 实现

      我们前面关于如何使用 Tensorflow 搭建卷积神经网络的过程可以定下实现 LeNet-5 的基本思路。如果在 python 中写的时候我们需要定义创建输入输出的占位符变量模块、初始化各层参数模块、创建前向传播模块、定义模型优化迭代模型,以及在最后设置输入数据。

      下面笔者用以上思路编写一个 LeNet-5 的简单实现代码。

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 initialize_parameters():
    W1 = tf.get_variable('W1', [5,5,1,6], initializer=tf.contrib.layers.xavier_initializer())
    b1 = tf.get_variable('b1', [6], initializer=tf.zeros_initializer())

    W2 = tf.get_variable('W2', [5,5,6,16], initializer=tf.contrib.layers.xavier_initializer())
    b2 = tf.get_variable('b2', [16], initializer=tf.zeros_initializer())

    W3 = tf.get_variable('W3', [5, 5, 16, 120], initializer=tf.contrib.layers.xavier_initializer())
    b3 = tf.get_variable('b3', [120], initializer=tf.zeros_initializer())

    W4 = tf.get_variable('W4', [120, 84], initializer=tf.contrib.layers.xavier_initializer())
    b4 = tf.get_variable('b4', [84], initializer=tf.zeros_initializer())

    W5 = tf.get_variable('W5', [84, 10], initializer=tf.contrib.layers.xavier_initializer())
    b5 = tf.get_variable('b5', [10], initializer=tf.zeros_initializer())

    para = {'W1': W1, 
            'b1': b1, 
            'W2': W2, 
            'b2': b2,     
            'W3': W3, 
            'b3': b3,       
            'W4': W4,    
            'b4': b4,       
            'W5': W5,      
            'b5': b5}    
    return para

      创建 LeNet-5 的前向计算:

def forward_propagation(X, para, dropout):

    X = tf.reshape(X, [-1, 28, 28, 1])
    X = tf.pad(X, [[0,0],[2,2],[2,2], [0,0]])

    c1 = tf.nn.conv2d(X, para['W1'], strides=[1, 1, 1, 1], padding='VALID') + para['b1']
    p2 = tf.nn.max_pool(c1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='VALID')
    c3 = tf.nn.conv2d(p2, para['W2'], strides=[1, 1, 1, 1], padding='VALID') + para['b2']
    p4 = tf.nn.max_pool(c3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='VALID')
    c5 = tf.nn.conv2d(p4, para['W3'], strides=[1, 1, 1, 1], padding='VALID') + para['b3']
    c5 = tf.contrib.layers.flatten(c5)
    f6 = tf.nn.tanh(tf.add(tf.matmul(c5, para['W4']), para['b4']))
    f7 = tf.nn.tanh(tf.add(tf.matmul(f6, para['W5']), para['b5']))
    f7 = tf.nn.dropout(f7, dropout)    
    return f7

      创建模型优化计算函数:

640?wx_fmt=png

最后传入 mnist 数据和相关超参数:

640?wx_fmt=png

注:本深度学习笔记系作者学习 Andrew NG 的 deeplearningai 五门课程所记笔记,其中代码为每门课的课后assignments作业整理而成。

参考资料:

https://www.coursera.org/learn/machine-learning

https://www.deeplearning.ai/

http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf

https://github.com/xiao-data/lenet/blob/master/lenet.py

往期精彩:


一个数据科学从业者的学习历程

640?
640?wx_fmt=jpeg
长按二维码.关注数据科学家养成记

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值