5. 卷积神经网络(LeNet)

构造一个含单隐藏层的多层感知机模型来对Fashion-MNIST数据集中的图像进行分类(每张图像高和宽均是28像素,将图像中的像素逐行展开,得到长度为784的向量,并输入全连接层中),这种分类方法存在一定的局限性,包括:
(1) 图像在同一列邻近的像素在该向量中可能相距较远,它们构成的模式可能难以被模型识别。
(2) 对于大尺寸的输入图像,使用全连接层容易导致模型过大,带来过于复杂的模型和过高的存储开销。

假设输入是高和宽均为 1 , 000 1,000 1,000像素的彩色照片(含3个通道),即使全连接层输出个数仍是256,该层权重参数的形状也是 3 , 000 , 000 × 256 3,000,000\times 256 3,000,000×256,占用了约3 GB的内存或显存。

卷积层尝试解决上述两个问题:
一方面,卷积层保留输入形状,使图像的像素在高和宽两个方向上的相关性均可能被有效识别;
另一方面,卷积层通过滑动窗口将同一卷积核与不同位置的输入重复计算,从而避免参数尺寸过大。

卷积神经网络是含卷积层的网络。
本节将介绍一个早期用来识别手写数字图像的卷积神经网络:LeNet,其名字来源于LeNet论文的第一作者Yann LeCun。

LeNet展示了通过梯度下降训练卷积神经网络,可以达到当时手写数字识别最先进的结果。
这个奠基性的工作,第一次将卷积神经网络推上舞台,为世人所知。

5.1 LeNet模型

5.1.1 概念

LeNet分为卷积层块和全连接层块两个部分,分别介绍如下:

(1) 卷积层块
卷积层块中的基本单位是:卷积层后接最大池化层。
卷积层用来识别图像中的空间模式,如线条和物体局部;之后的最大池化层则用来降低卷积层对位置的敏感性。

卷积层块由上述两个基本单位重复堆叠构成:
每个卷积层都使用 5 × 5 5\times 5 5×5的窗口,并在输出上使用sigmoid激活函数。
第一个卷积层输出通道数为6,第二个卷积层输出通道数则增加到16。(这是因为第二个卷积层比第一个卷积层的输入的高和宽要小,所以增加输出通道使两个卷积层的参数尺寸类似。)
两个最大池化层的窗口形状均为 2 × 2 2\times 2 2×2,且步幅为2。(由于池化窗口与步幅形状相同,池化窗口在输入上每次滑动所覆盖的区域互不重叠。)

卷积层块的输出形状为(批量大小, 通道, 高, 宽)。

(2) 全连接层块
当卷积层块的输出传入全连接层块时,全连接层块会将小批量中每个样本变平(flatten)。
即,全连接层的输入形状将变成二维。其中,第一维是小批量中的样本,第二维是每个样本变平后的向量表示,且向量长度为通道、高和宽的乘积。

全连接层块含3个全连接层,输出个数分别为120、84和10。其中,10为输出的类别个数。

5.1.2 代码示例

import tensorflow as tf
print(tf.__version__)
2.0.0

通过Sequential类来实现LeNet模型:

"""
tf.keras.layers.Conv2D:filters: Integer, the dimensionality of the output space.input_shape:When using this layer as the first layer in a model, provide the keyword argument `input_shape` (tuple of integers, does not include the sample axis)e.g. `input_shape=(128, 128, 3)` for 128x128 RGB pictures in `data_format="channels_last"`."""net = tf.keras.models.Sequential([tf.keras.layers.Conv2D(filters=6, kernel_size=5, activation='sigmoid', input_shape=(28, 28, 1)),tf.keras.layers.MaxPool2D(pool_size=2, strides=2),tf.keras.layers.Conv2D(filters=16, kernel_size=5, activation='sigmoid'),tf.keras.layers.MaxPool2D(pool_size=2, strides=2),tf.keras.layers.Flatten(),tf.keras.layers.Dense(units=120, activation='sigmoid'),tf.keras.layers.Dense(units=84, activation='sigmoid'),tf.keras.layers.Dense(units=10, activation='sigmoid')
])

构造一个高和宽均为28的单通道数据样本,并逐层进行前向计算来查看每个层的输出形状:

# data_format="channels_last"
X = tf.random.uniform(shape=(1,28,28,1))for layer in net.layers:X = layer(X)print(layer.name, 'output shape: ', X.shape)

输出:

conv2d output shape:  (1, 24, 24, 6)
max_pooling2d output shape:  (1, 12, 12, 6)
conv2d_1 output shape:  (1, 8, 8, 16)
max_pooling2d_1 output shape:  (1, 4, 4, 16)
flatten output shape:  (1, 256)
dense output shape:  (1, 120)
dense_1 output shape:  (1, 84)
dense_2 output shape:  (1, 10)

由此可见,
卷积层块中,输入的高和宽在逐层减小(卷积层由于使用高和宽均为5的卷积核,从而将高和宽分别减小4)。
池化层将高和宽减半(窗口形状为 2 × 2 2\times 2 2×2且步幅为2),但通道数则从1增加到16。
全连接层逐层减少输出个数,直到变成图像的类别数10。

5.2 模型训练

5.2.1 数据集

使用Fashion-MNIST作为训练数据集。

fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()train_images = tf.reshape(train_images, shape=(train_images.shape[0], train_images.shape[1], train_images.shape[2], 1))
print(train_images.shape)test_images = tf.reshape(test_images, shape=(test_images.shape[0], test_images.shape[1], test_images.shape[2], 1))

输出:

(60000, 28, 28, 1)

5.2.2 训练

损失函数和训练算法,依然采用交叉熵损失函数(cross entropy)和小批量随机梯度下降(SGD):

"""
tf.keras.optimizers.SGD:momentum: Accelerates SGD in the relevant direction and dampens oscillations.nesterov: Whether to apply Nesterov momentum.
"""optimizer = tf.keras.optimizers.SGD(learning_rate=0.9, momentum=0.0, nesterov=False)net.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy',metrics=['accuracy'])
# 训练
net.fit(train_images, train_labels, epochs=5, validation_split=0.1)

输出:

net.fit(train_images, train_labels, epochs=5, validation_split=0.1)
net.fit(train_images, train_labels, epochs=5, validation_split=0.1)
Train on 54000 samples, validate on 6000 samples
Epoch 1/5
54000/54000 [==============================] - 15s 286us/sample - loss: 1.3557 - accuracy: 0.4590 - val_loss: 0.6590 - val_accuracy: 0.7437
Epoch 2/5
54000/54000 [==============================] - 15s 275us/sample - loss: 0.6410 - accuracy: 0.7432 - val_loss: 0.5498 - val_accuracy: 0.7857
Epoch 3/5
54000/54000 [==============================] - 16s 289us/sample - loss: 0.5494 - accuracy: 0.7829 - val_loss: 0.5215 - val_accuracy: 0.7867
Epoch 4/5
54000/54000 [==============================] - 15s 273us/sample - loss: 0.5168 - accuracy: 0.7999 - val_loss: 0.5084 - val_accuracy: 0.8082
Epoch 5/5
54000/54000 [==============================] - 14s 253us/sample - loss: 0.4798 - accuracy: 0.8135 - val_loss: 0.4520 - val_accuracy: 0.8265
<tensorflow.python.keras.callbacks.History at 0x13bc3bad0>
# 预测
net.evaluate(test_images, test_labels, verbose=2)

输出:

10000/1 - 1s - loss: 0.3569 - accuracy: 0.8158
[0.4777470575332642, 0.8158]
参考

《动手学深度学习》(TF2.0版)
LeCun, Y.; Bottou, L.; Bengio, Y. & Haffner, P. (1998). Gradient-based learning applied to document recognition.Proceedings of the IEEE. 86(11): 2278 - 2324.

(四)卷积神经网络 -- 5 LeNet相关推荐

  1. 全面深入理解卷积神经网络与LeNet 5 的结构

    全面深入理解卷积神经网络与LeNet 5 的结构 一.卷积神经网络的起源 1.与传统神经网络相比,卷积的优势何在 2.感受野机制 二.如何实现感受野? 1.什么叫卷积呢? 三.如何实现图像的卷积? 1 ...

  2. 卷积神经网络鼻祖LeNet网络分析

    卷积神经网络鼻祖LeNet网络分析 https://www.toutiao.com/a6634346529920385539/ 1998年,被成为是现代卷积神经网络的鼻祖LeNet,被Yann LeC ...

  3. [pytorch、学习] - 5.5 卷积神经网络(LeNet)

    参考 5.5 卷积神经网络(LeNet) 卷积层尝试解决两个问题: 卷积层保留输入形状,使图像的像素在高和宽两个方向上的相关性均可能被有效识别; 卷积层通过滑动窗口将同一卷积核和不同位置的输入重复计算 ...

  4. PyTorch实战福利从入门到精通之七——卷积神经网络(LeNet)

    卷积神经网络就是含卷积层的网络.介绍一个早期用来识别手写数字图像的卷积神经网络:LeNet [1].这个名字来源于LeNet论文的第一作者Yann LeCun.LeNet展示了通过梯度下降训练卷积神经 ...

  5. 【从零开始学习深度学习】25.卷积神经网络之LeNet模型介绍及其Pytorch实现【含完整代码】

    目录 1. LeNet模型介绍与实现 2. 输入为Fashion-MNIST时各层输出形状 3. 获取Fashion-MNIST数据和并使用LeNet模型进行训练 4.完整代码 之前我们对Fashio ...

  6. 【CNN】卷积神经网络(LeNet)是什么?如何实现LeNet?

    系列文章目录 第一章 深度学习 CNN中的卷积神经网络(LeNet) 目录 系列文章目录 文章目录 前言 一.卷积神经网络(LeNet)是什么? 二.LeNet的网络结构 三.实现LeNet模型 ​​ ...

  7. 卷积神经网络1——LeNet(LeNet-5)

    LeNet是最早的卷积神经网络. LeNet具有一个输入层,两个卷积层,两个池化层,三个全连接层.每个卷积快的基本单元是一个卷积层,一个sigmoid函数和平均汇聚层. 输入层:需要对28X28的图像 ...

  8. 深度卷积神经网络(AlexNet)与卷积神经网络(LeNet)的区别及其代码实现(可直接复制运行)

    AlexNet出现的背景 LeNet在小批量样本的处理中表现尚可,但当样本过于复杂时处理起来结果不尽如人意. AlexNet出现于2010年后,该模型对较大批量数据(特别是图片较多和所包含信息较多的情 ...

  9. 卷积神经网络之 - Lenet

    本文建议阅读时间 10 min 前言 Lenet 是一系列网络的合称,包括 Lenet1 - Lenet5,由 Yann LeCun 等人在 1990 年<Handwritten Digit R ...

  10. pytorch学习笔记(二十三):卷积神经网络(LeNet)

    LeNet 使用多层感知机构造一个含单隐藏层的多层感知机模型来对Fashion-MNIST数据集中的图像进行分类.每张图像高和宽均是28像素.我们将图像中的像素逐行展开,得到长度为784的向量,并输入 ...

最新文章

  1. head部分关于搜索引擎
  2. Smart Form中打印图标或符号
  3. 华字后面配什么字比较好_女孩叫华什么名字好听 华字和什么字搭配取名最好...
  4. 基于dde的vb和matlab,基于VB和DDE技术的组态王通信协议转换
  5. apache httpclient 工具类_使用HttpClient进行服务的远程调用
  6. 20145236 《Java程序设计》 第6周学习总结
  7. vue-cli 搭建的项目处理不同环境下请求不同域名的问题
  8. ASP.NET之通过JS向服务端(后台)发出请求(__doPostBack is undefined)
  9. [转载] Python中为什么len不是普通方法
  10. Coolite之数据源(store)分页,基于Sql2000存储过程(高效分页)
  11. SpringCloud 教程 | 第六篇: 分布式配置中心 (Spring Cloud Config)
  12. WIN8转WIN7的两三事
  13. 常用计算机储存设备有哪些,计算机的存储设备有哪些
  14. 【学习VINS-MONO环境配置、测试】
  15. python中扑克牌类设计_创建扑克牌类Python
  16. RequestResponse入门1(Request)
  17. win10家庭版设置远程桌面连接
  18. asr标注工具_传统ASR全流程【转载】
  19. 怎么把视频转换成音频
  20. 华为系统取名鸿蒙,华为自主操作系统为何取名鸿蒙?看完西游记就知道霸气在哪里!...

热门文章

  1. 幽幽婉婉,薄雾半掩:轻凝晨露沾眼帘
  2. [原][OE][官方例子]osgearth_annotation OE地球添加热点标签
  3. ros订阅相机深度信息_rosbag使用--记录深度相机数据
  4. 丝袜哥Swagger-knife4j在线文档
  5. 二叉树层次遍历后输出 c++
  6. 大白话讲解Mysql之悲观锁
  7. “亚马逊云科技创业加速器”首期聚焦AI,促进入营企业业务发展
  8. js常用插件(十二)之手写签名jsignature.js
  9. Spring体系学习笔记三_管窥设计模式
  10. AE角色骨骼IK绑定动画插件 BAO Bones Mac v1.5.6激活版