《python深度学习》第五章-1(cnn简介)读书笔记(代码片段)

Paul-Huang Paul-Huang     2022-12-11     700

关键词:

第五章 深度学习用于计算机视觉

5.1 卷积神经网络简介

5.1.1 卷积神经网络对 MNIST 分类

使用卷积神经网络对 MNIST 数字进行分类,在第 2 章用密集连接网络做过(当时的测试精度为 97.8%)。它是 Conv2D 层和 MaxPooling2D 层的堆叠。

  1. 实例化一个小型的卷积神经网络

    from keras import layers
    from keras import models
    
    model = models.Sequential()
    model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    

    卷积神经网络接收形状为 (image_height, image_width, image_channels)的输入张量(不包括批量维度)。第一层传入参数 input_shape=(28, 28, 1) 来完成此设置。

    >>> model.summary()
    _________________________________________________________________
    Layer (type) Output Shape Param #
    =================================================================
    conv2d_1 (Conv2D) (None, 26, 26, 32)                  320
    _________________________________________________________________
    max_pooling2d_1 (MaxPooling2D) (None, 13, 13, 32)     0
    _________________________________________________________________
    conv2d_2 (Conv2D) (None, 11, 11, 64)                  18496
    _________________________________________________________________
    max_pooling2d_2 (MaxPooling2D) (None, 5, 5, 64)       0
    _________________________________________________________________
    conv2d_3 (Conv2D) (None, 3, 3, 64)                    36928
    =================================================================
    Total params: 55,744
    Trainable params: 55,744
    Non-trainable params: 0
    

    每个 Conv2D 层和 MaxPooling2D 层的输出都是一个形状为 (height, width,channels) 的 3D 张量。通道数量由传入 Conv2D 层的第一个参数所控制(32 或 64)。

  2. 在卷积神经网络上添加分类器

    model.add(layers.Flatten())
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(10, activation='softmax'))
    

    在进入两个 Dense 层之前,形状 (3, 3, 64) 的输出被展平为形状 (576,) 的向量。

    >>> model.summary()
    _________________________________________________________________
    Layer (type) Output Shape Param #
    =================================================================
    conv2d_1 (Conv2D) (None, 26, 26, 32)                    320
    _________________________________________________________________
    max_pooling2d_1 (MaxPooling2D) (None, 13, 13, 32)       0
    _________________________________________________________________
    conv2d_2 (Conv2D) (None, 11, 11, 64)                    18496
    _________________________________________________________________
    max_pooling2d_2 (MaxPooling2D) (None, 5, 5, 64)         0
    _________________________________________________________________
    conv2d_3 (Conv2D) (None, 3, 3, 64)                      36928
    _________________________________________________________________
    flatten_1 (Flatten) (None, 576)                         0
    _________________________________________________________________
    dense_1 (Dense) (None, 64)                              36928
    _________________________________________________________________
    dense_2 (Dense) (None, 10)                              650
    =================================================================
    Total params: 93,322
    Trainable params: 93,322
    Non-trainable params: 0
    
  3. 在 MNIST 图像上训练卷积神经网络

    from keras.datasets import mnist
    from keras.utils import to_categorical
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    
    train_images = train_images.reshape((60000, 28, 28, 1))
    train_images = train_images.astype('float32') / 255
    
    test_images = test_images.reshape((10000, 28, 28, 1))
    test_images = test_images.astype('float32') / 255
    
    train_labels = to_categorical(train_labels)
    test_labels = to_categorical(test_labels)
    
    model.compile(optimizer='rmsprop',
    			  loss='categorical_crossentropy',
    			  metrics=['accuracy'])
    model.fit(train_images, train_labels, epochs=5, batch_size=64)
    

    在测试数据上对模型进行评估。

    >>> test_loss, test_acc = model.evaluate(test_images, test_labels)
    >>> test_acc
    0.9912999868392944
    
  4. 整体代码

    from tensorflow.keras.datasets import mnist
    from tensorflow.keras.utils import to_categorical
    from tensorflow.keras import layers
    from tensorflow.keras import models
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    
    train_images = train_images.reshape((60000, 28, 28, 1))
    train_images = train_images.astype('float32') / 255
    
    test_images = test_images.reshape((10000, 28, 28, 1))
    test_images = test_images.astype('float32') / 255
    
    train_labels = to_categorical(train_labels)
    test_labels = to_categorical(test_labels)
    
    model = models.Sequential()
    model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.Flatten())
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(10, activation='softmax'))
    
    model.compile(optimizer='rmsprop',
    			  loss='categorical_crossentropy',
    			  metrics=['accuracy'])
    model.fit(train_images, train_labels, epochs=5, batch_size=64)
    test_loss, test_acc = model.evaluate(test_images, test_labels)
    

    结果是:

    >>> test_acc
    0.99080000000000001
    

5.1.2 卷积运算

  1. D e n s e 层 \\colorredDense 层 Dense从输入特征空间中学到的是 全 局 模 式 \\colorred全局模式 ,而 卷 积 层 \\colorred卷积层 学到的是 局 部 模 式 \\colorred局部模式

  2. 卷积神经网络具有以下两个性质

    • 卷积神经网络学到的模式具有 平 移 不 变 性 ( t r a n s l a t i o n    i n v a r i a n t ) \\colorred平移不变性(translation\\;invariant) (translationinvariant)。这使得卷积神经网
      络在处理图像时可以高效利用数据
      (因为 视 觉 世 界 从 根 本 上 具 有 平 移 不 变 性 \\colorred视觉世界从根本上具有平移不变性 ),它只需要更少的训练样本就可以学到具有泛化能力的数据表示。
    • 卷积神经网络可以学到 模 式 的 空 间 层 次 结 构 ( s p a t i a l    h i e r a r c h i e s    o f    p a t t e r n s ) \\colorred模式的空间层次结构(spatial\\;hierarchies\\;of\\;patterns) (spatialhierarchiesofpatterns)。卷积神经网络可以有效地学习越来越复杂、越来越抽象的视觉概念(因为 视 觉 世 界 从 根 本 上 具 有 空 间 层 次 结 构 \\colorred视觉世界从根本上具有空间层次结构 )。
  3. 特 征 图 ( f e a t u r e    m a p ) \\colorred特征图(feature\\;map) (featuremap)

    • 定义: 深度轴的每个维度都是一个 特 征 \\colorred特征 (或 过 滤 器 \\colorred过滤器 ),而 2D 张量 output[:, :, n] 是这个过滤器在输入上的响应的二维空间 图 ( m a p ) \\colorred图(map) (map)
    • 应用
      • 输入卷积中的: 包含两个空间轴(高度宽度)和一个深度轴(也叫通道轴)的 3D 张量,其卷积也叫 特 征 图 ( f e a t u r e    m a p ) \\colorred特征图(feature\\;map) (featuremap)
      • 从卷积中输出的: 卷积运算从输入特征图中提取图块,并对所有这些图块应用相同的变换,生成 输 出 特 征 图 ( o u t p u t    f e a t u r e    m a p ) \\colorred输出特征图(output\\;feature\\;map) (outputfeaturemap)。该输出特征图仍是一个 3D 张量,具有宽度高度,其深度是输出深度是层的参数,每层代表代表 过 滤 器 ( f i l t e r ) \\colorred过滤器(filter) (filter)
  4. 卷积关键参数

    • 从 输 入 中 提 取 的 图 块 尺 寸 \\colorred从输入中提取的图块尺寸 :这些图块的大小通常是 3 × 3 3×3 3×3 5 × 5 5×5 5查看详情

      《python深度学习》第五章-3(预训练)读书笔记(代码片段)

      5.3 使用预训练的卷积神经网络预训练网络(pretrainednetwork):是一个之前已在大型数据集(通常是大规模图像分类任务)上训练好、保存好的网络\\colorred训练好、保存好的网络训练好、保存好的网络。预训... 查看详情

      《python深度学习》第五章-5(可视化过滤器)读书笔记(代码片段)

      5.4 卷积神经网络的可视化卷积神经网络学到的表示非常适合可视化,很大程度上是因为它们是视觉概念的表示\\colorred视觉概念的表示视觉概念的表示。接下来介绍3种可视化方法。事中\\colorblue事中事中:可视化卷积神... 查看详情

      《python深度学习》第五章-4(可视化中间激活层)读书笔记(代码片段)

      5.4 卷积神经网络的可视化卷积神经网络学到的表示非常适合可视化,很大程度上是因为它们是视觉概念的表示\\colorred视觉概念的表示视觉概念的表示。接下来介绍3种可视化方法。可视化卷积神经网络的中间输出(中间... 查看详情

      第五章学习小结

      ...,也学习了什么是结点的度(即结点的孩子个数),树的深度(即结点度的最大值),但还是主要学习了二叉树,比如二叉树的性质:性质1在二叉树的第i层上至多有2^(i-l)个结点(i>=1)。性质2深度为K的二叉树至多有2^k-1个结点... 查看详情

      第五章学习小结

      ...点树的度:结点度的最大值(结点的子树数为结点的度)深度:最大层次数森林:m课不相交树的集合课本上关于树只说明了定义和一些术语,重点内容在于二叉树部分二:二叉树二叉树的性质:深度为k的二叉树最多有2^k-1个结点... 查看详情

      第五章学习小结(代码片段)

      ...径和路径长度、祖先结点、子孙结点、结点的层次、树的深度(注意根结点深度为1,而不是0) 二叉树的定义(五种基本形态)  完美二叉树(满二叉树)、完全二叉树(编号为i的结点与满二叉树中编号为i的结点在... 查看详情

      ds第五章学习记录

      二叉树性质在二叉树的第l层上至多有2i-l个结点深度为K的二叉树至多有2k-1个结点 对任何一棵二叉树T,如果其终端结点数为n。度为2的结点数为n2则n。=n2+1。 (结点-1=边)具有n个结点的完全二叉树的深度为llog心+1  &... 查看详情

      unp学习第五章

      一、概述想要写一个完整的TCP客户-服务器程序例子,有下面功能的回射服务器1.客户从标准输入读一行文本,写到服务器上;2.服务器从网络输入读此行,并回射给客户;3.客户读此回射行并写到标准输出。此例子需要观察:正... 查看详情

      第五章学习小结

      ...:树、二叉树、完美二叉树、偏二叉树,节点关系,树的深度,叶节点等等的定义二,树(二叉树)的基本储存结构(1)用数组,适用于满二叉树(2)链式结构(3)数组加链表式:双亲孩子表示法(代码如下)tyepdefstructcNode ... 查看详情

      tensorflow实战google深度学习框架第五章5.2.1minister数字识别源代码(代码片段)

      1importos2importtab3importtensorflowastf45print"tensorflow5.2"67fromtensorflow.examples.tutorials.mnistimportinput_data89‘‘‘10mnist=input_data.read_data_sets("/asky/tensorflow/mnist_data",one_hot=True 查看详情

      第五章学习小结

      ...学习了树和二叉树的定义,对节点,根节点,叶子结点,深度,度等概念进行了初步的了解。5-4节了解了与二叉树相关的一些性质,其中引出了完全二叉树与满二叉树的概念,从这一节开始也正式开始考虑用存储结构去存储一棵... 查看详情

      第五章学习小结

      ...复杂。在这章我们接触到了更加多的新的术语,例如树的深度,树的结点、兄弟、子孙层次等,这些都需要我们清楚地理解出各自相对应的意思;之后也学习了对于树不同的遍历方法,例如中序遍历:是先遍历左子树再访问根结... 查看详情

      第五章学习小结

      ...树(分等级的分类方案都可由一个树结构来表示)2.度与深度:节点的度:该节点拥有几个子树,就为几         &nbs 查看详情

      深度学习卷积神经网络(cnn)简介(入门级好文)

      卷积神经网络CNN简介学习目标1.更复杂抽象的数据2.激活函数的选择2.1为什么需要非线性的激活函数2.2更多发展3.为什么需要卷积神经网络3.1感受野4.边缘检测学习目标目标了解线性网络以及多层网络模型缺陷知道为什么需要非线... 查看详情

      第五章学习小结

      ...次序不能颠倒。二叉树的第i层至多有2的i-1次方个结点;深度为k的二叉树至多有2^(k)-1个结点;二叉树中的最优树叫哈曼夫树,是一种带权路 查看详情

      神经网络和深度学习笔记-第五章深度神经网络学习过程中的梯度消失问题

      之前的章节,我们利用一个仅包含一层隐藏层的简单神经网络就在MNIST识别问题上获得了98%左右的准确率。我们于是本能会想到用更多的隐藏层,构建更复杂的神经网络将会为我们带来更好的结果。就如同在进行图像模式识别的... 查看详情

      第五章文件处理

      ...a=f.read()print(data)关闭f.close()#回收操作系统的资源delf#回收python资源,python回收机制自动处理,不用写print(f)流程分析:1:向操作系统发起系统调用2:操作系统打开 查看详情