深度学习(5)-卷积神经网络

server/2025/2/27 22:47:03/

我们将深入理解卷积神经网络的原理,以及它为什么在计算机视觉任务上如此成功。我们先来看一个简单的卷积神经网络示例,它用干对 MNIST数字进行分类。这个任务在第2章用密集连接网络做过,当时的测试精度约为 97.8%。虽然这个卷积神经网络很简单,但其精度会超过第2章的密集连接模型。

代码 8-1给出了一个简单的卷积神经网络。它是 conv2D层和 MaxPooling2D 层的堆叠,你很快就会知道这些层的作用。我们将使用第7章介绍过的函数式 API来构建模型。

代码8-1 实例化一个小型卷积神经网络

from tensorflow import kerasfrom tensorflow.keras import layersinputs = keras.Input(shape=(28, 28, 1))x = layers.Conv2D(filters=32, kernel_size=3, activation="relu")(inputs)x = layers.MaxPooling2D(pool_size=2)(x)x = layers.Conv2D(filters=64, kernel_size=3, activation="relu")(x)x = layers.MaxPooling2D(pool_size=2)(x)x = layers.Conv2D(filters=128, kernel_size=3, activation="relu")(x)x = layers.Flatten()(x)outputs = layers.Dense(10, activation="softmax")(x)model = keras.Model(inputs=inputs, outputs=outputs)

卷积神经网络接收的输入张量的形状为(image height,image width,image channels)(不包括批量维度)。本例中,我们设置卷积神经网络处理大小为(28,28,1)的输入,这正是 MNIST 图像的格式。

我们来看一下这个卷积神经网络的架构,如代码 8-2所示。

代码 8-2 显示模型的概述信息

model.summary()

在这里插入图片描述

可以看到,每个 conv2D层和 MaxPooling2D层的输出都是一个形状为(height,width,channels)的3阶张量。(张量的阶数相同,形状不同)宽度和高度这两个维度的尺寸通常会随着模型加深而减小。通道数对应传入Conv2D层的第一个参数(32、64或 128)。在最后一个 conv2D层之后,我们得到了形状为(3,3,128)的输出,即通道数为 128的3x3特征图。下一步是将这个输出传入密集连接分类器中,即 Dense 层的堆叠,你已经很熟悉了。这些分类器可以处理1阶的向量,而当前输出是3阶张量。为了让二者匹配,我们先用 Flatten 层将三维输出展平为一维,然后再添加 Dense 层。最后,我们进行十类别分类,所以最后一层使用带有 10个输出的 softmax 激活函数。下面我们在 MNIST数字上训练这个卷积神经网络。我们将重复使用的MNIST 示例中的很多代码。

由于我们要做的是带有 softmax 输出的十类别分类,因此要使用分类交叉熵损失,而且由于标签是整数,因此要使用稀疏分类交叉熵损失sparse categorical crossentropy,如代码 8-3 所示。注意此处代码执行需要网络才能执行。

from tensorflow.keras.datasets import mnist(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") / 255test_images = test_images.reshape((10000, 28, 28, 1))test_images = test_images.astype("float32") / 255model.compile(optimizer="rmsprop",loss="sparse_categorical_crossentropy",metrics=["accuracy"])model.fit(train_images, train_labels, epochs=5, batch_size=64)

我们在测试数据上评估模型,如代码 8-4所示。

代码 8-4 评估卷积神经网络

密集连接模型的测试精度约为 97.8%,而这个简单的卷积神经网络的测试精度达到99.1%,错误率降低了约 60%(相对比例)。这相当不错!

但是,与密集连接模型相比,这个简单卷积神经网络的效果为什么这么好?要回答这个问题,我们来深入了解 Conv2D 层和 MaxPooling2D层的作用。

总结:在一定条件下,卷积神经网络在图像识别上精度优于密集链接模型。每个 conv2D层和 MaxPooling2D层的输出都是一个形状为(height,width,channels)的3阶张量。宽度和高度这两个维度的尺寸通常会随着模型加深而减小。而通道数会模型加深而增加。我的理解就是通过悬系,模型对于特征的理解越来越丰富。


http://www.ppmy.cn/server/171140.html

相关文章

【Python爬虫(67)】Python爬虫实战:探秘旅游网站数据宝藏

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发…

C语言二叉树学习笔记

C语言二叉树学习笔记 目录 树的基本概念二叉树的定义与类型二叉排序树(BST)二叉树的遍历二叉树的操作总结 树的基本概念 1. 什么是树? 树:一种非线性数据结构,由节点和边组成,模拟分层关系。核心术语&am…

OV-WATCH手表

硬件部分: 一、硬件选型 MCU选型 选择STM32F4411C1U6,因为它具备较大的ROM和RAM,能够运行FreeRTOS和VIGL。 显示屏 采用触摸显示屏,具体型号可在淘宝搜索。 电源部分 充电芯片:采用TP4056,用于3.7V锂电…

在Ubuntu系统上部署Dify(开源大语言模型应用开发平台)

在Ubuntu系统上部署Dify(开源大语言模型应用开发平台) 环境准备Dify部署接入本地模型(如Ollama)安装Ollama运行模型并接入Dify环境准备 系统要求 Ubuntu 20.04/22.04,建议CPU≥2核,内存≥4GB。安装Docker及Docker Compose:# 安装Docker sudo apt update sudo apt insta…

如何在系统之间实现通信?

在多台系统之间实现通信,需要根据具体场景(如实时性、数据量、安全性、网络环境)选择合适的通信协议和技术方案。以下是常见的通信方式及其实现方法,涵盖局域网、互联网、跨平台等场景: 一、通信协议选择 1. HTTP/REST API 适用场景:跨平台、请求-响应模式(如Web服务…

Protobuf

Protobuf(Protocol Buffers)是 Google 开发的一种语言中立、平台中立、可扩展的序列化数据格式,用于结构化数据的序列化和反序列化。它比传统的文本格式(如 JSON 或 XML)更高效,特别适合于需要处理大量数据…

大语言模型概念科普

大模型(Large Model)是指具有大规模参数和复杂计算结构的机器学习模型。 大语言模型(Large Language Model):通常是具有大规模参数和计算能力的自然语言处理模型,例如ChatGPT、deepseek。这些模型可以通过…

蓝桥备赛(二)- C++输入输出(上)

一、getchar 和 putchar getchar() 和 putchar() 是属于 C 语言的库函数 ,C是兼容 C 语言的,所以 C 中只要正确包 含头文件也可以正常使用这两个函数。 1.1 getchar() getchar - C Reference 函数原型如下: int getchar (void) ; 1 . getch…