前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TensorFlow 实战卷积神经网络之 LeNet

TensorFlow 实战卷积神经网络之 LeNet

作者头像
磐创AI
发布2018-04-24 18:24:06
8800
发布2018-04-24 18:24:06
举报

作者 | fendouai

编辑 | 磐石

出品 | 磐创AI技术团队

【磐创AI导读】:前几篇文章中我们介绍了一些机器学习、深度学习入门资源项目合集,本篇则是对继五大卷积神经网络原理介绍之后的实战延续,同样来自fendouai老师。喜欢我们文章的小伙伴,欢迎大家点击上方蓝字关注我们的公众号:磐创AI。另外您对我们的文章有任何的意见或是文章中的不足之处,欢迎在文末留言。

LeNet

项目简介

1994 年深度学习三巨头之一的 Yan LeCun 提出了 LeNet 神经网络,这是最早的卷积神经网络。1998 年 Yan LeCun 在论文 “Gradient-Based Learning Applied to Document Recognition” 中将这种卷积神经网络命名为 “LeNet-5”。LeNet-5 表明更好的模式识别系统可以建立在自动的学习上,更少的依赖手动设计的启发式模型。以字符识别为例,LeNet 表明手动选择的特征可以被更先进的直接在像素操作的学习机器取代。最早期的时候认为原始的数据非常多样并且丰富让模式识别被不能完全依靠手工建立一个准确的模式识别系统。所以,大部分的模式识别系统建立在自动学习技术和手工选择算法的结合。模式识别系统包含两个分开主要的模块,如图所示:

第一个模块,称为特征提取器,转换输入的数据,使他们可以被低维度的向量或者短字符表示。这样有两个好处:可以更加容易的匹配或者对比;虽然会进行转化和扭曲并不会改变输入的相对不变性。特征提取器包含大部分的前置知识,并且是针对任务的特定知识。它主要专注于模型设计方面的努力,因为它经常是完全手工设计的。另一方面,这个分类器通常用于普遍的目的,并且可以训练。这个过程的一个主要的问题是识别的准确率很大决定于设计者选择合适参数的能力。很不幸的是,这样使它成为一个让人畏惧的任务,因为这个任务必须为每一个新问题重新做一遍。

历史上,需要合适的特征提取器的需求来自分类器的学习技术受限于比较容易分类的低维度空间。在过去的十年中,有三个事实改变了这个观点。第一,可以获得很便宜的高速算数计算单元允许使用更多的蛮力计算而不是算法优化。第二,对于有巨大市场和广泛兴趣的问题可以获得大数据库,比如说手写数字识别,让设计者可以依赖更多的真实数据,更少使用手动调整的特征提取器来建立识别系统。第三,也是最重要的事实就是可以获得高性能机器学习技术从而可以处理高维度输入,并且可以在输入大量数据集的时候生成复杂的决策函数。

Gradient-Based Learning Applied to Document Recognition http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=726791

论文下载链接:

http://www.tensorflownews.com/wp-content/uploads/2018/04/00726791.pdf

Architecture of LeNet-5 (Convolutional Neural Networks) for digit recognition

数据处理

同卷积神经网络中的 MNIST 数据集处理方法。

TensorFlow 卷积神经网络手写数字识别数据集介绍:

TensorFlow 卷积神经网络手写数字识别数据集介绍

模型实现

经典的卷积神经网络,TensorFlow 官方已经实现,并且封装在了 tensorflow 库中,以下内容截取自 TensorFlow 官方 Github。

models/research/slim/nets/lenet.py https://github.com/tensorflow/models/blob/master/research/slim/nets/lenet.py

代码语言:javascript
复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import tensorflow as tf

slim = tf.contrib.slim


def lenet(images, num_classes=10, is_training=False,
          dropout_keep_prob=0.5,
          prediction_fn=slim.softmax,
          scope='LeNet'):
  end_points = {}
  with tf.variable_scope(scope, 'LeNet', [images]):
    net = end_points['conv1'] = slim.conv2d(images, 32, [5, 5], scope='conv1')
    net = end_points['pool1'] = slim.max_pool2d(net, [2, 2], 2, scope='pool1')
    net = end_points['conv2'] = slim.conv2d(net, 64, [5, 5], scope='conv2')
    net = end_points['pool2'] = slim.max_pool2d(net, [2, 2], 2, scope='pool2')
    net = slim.flatten(net)
    end_points['Flatten'] = net

    net = end_points['fc3'] = slim.fully_connected(net, 1024, scope='fc3')
    if not num_classes:
      return net, end_points
    net = end_points['dropout3'] = slim.dropout(
        net, dropout_keep_prob, is_training=is_training, scope='dropout3')
    logits = end_points['Logits'] = slim.fully_connected(
        net, num_classes, activation_fn=None, scope='fc4')

  end_points['Predictions'] = prediction_fn(logits, scope='Predictions')

  return logits, end_points
lenet.default_image_size = 28


def lenet_arg_scope(weight_decay=0.0):
  """Defines the default lenet argument scope.
  Args:
    weight_decay: The weight decay to use for regularizing the model.
  Returns:
    An `arg_scope` to use for the inception v3 model.
  """
  with slim.arg_scope(
      [slim.conv2d, slim.fully_connected],
      weights_regularizer=slim.l2_regularizer(weight_decay),
      weights_initializer=tf.truncated_normal_initializer(stddev=0.1),
      activation_fn=tf.nn.relu) as sc:
    return sc
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磐创AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ?
  • LeNet
    • 项目简介
      • 数据处理
        • 模型实现
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档