深度学习之CNN卷积神经网络

一.卷积神经网络

1. 导入资源包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sklearn
import tensorflow as tf
from tensorflow import keras

:from tensorflow import keras:从TensorFlow库中导入Keras模块,它是TensorFlow的一个高级API,用于构建和训练神经网络。Keras提供了一个简洁的接口,使得构建复杂的神经网络变得更加容易。

2.数据导入与数据观察

from sklearn.datasets import load_sample_image#由于图像的像素值通常在0255之间,这里将其缩放到[0, 1]的范围,以便于后续处理和可视化。
china = load_sample_image("china.jpg") / 255  
flower = load_sample_image("flower.jpg") / 255
plt.subplot(1,2,1)
plt.imshow(china)
plt.subplot(1,2,2)
plt.imshow(flower)

运行结果
在这里插入图片描述
:这段代码使用了Scikit-learn库来加载两个示例图像,并将它们调整为[0, 1]的灰度值范围,然后使用Matplotlib库将这两个图像分别显示在一个2x1的子图中。

2.1.打印出两个图像的维度

print("china.jpg的维度:",china.shape)
print("flower.jpg的维度:",flower.shape)

运行结果
在这里插入图片描述
:由于图像数据通常是一个NumPy数组,其形状表示为高度、宽度和通道数(如果图像有多个通道的话)。这里,china.shape将返回一个元组,表示图像的形状。

2.2.将两个图像数组组合成一个NumPy数组,并打印出形状。

images = np.array([china,flower])
images_shape = images.shape
print("数据集的维度:",images_shape)

运行结果
在这里插入图片描述
:images = np.array([china,flower]):这行代码将两个图像数组(china和flower)作为列表的元素,并使用NumPy的array函数将它们组合成一个多维数组。这个数组可能包含两个图像,每个图像是一个二维数组(高度 x 宽度)。

3.卷积层

u = 7 #卷积核的边长
s = 1 #滑动步长
p = 5 #输入特征图数目conv = keras.layers.Conv2D(filters = p, kernel_size = u, strides = s,padding = "SAME", activation="relu", input_shape=images_shape)image_after_conv = conv(images)
print("卷积后的张量大小:", image_after_conv.shape)#activation = "relu":指定激活函数为ReLU

运行结果
在这里插入图片描述
:这段代码定义了一个二维卷积层(Conv2D),并将这个卷积层应用于一个名为images的NumPy数组。代码中的参数u、s和p分别表示卷积核的边长、滑动步长和输入特征图的数量。

4.汇聚层

4.1.最大汇聚

pool_max = keras.layers.MaxPool2D(pool_size=2)
#这行代码将image_after_conv张量作为输入传递给最大汇聚层pool_max,并计算汇聚操作后的输出。
image_after_pool_max = pool_max(image_after_conv)
print("最大汇聚后的张量大小:",image_after_pool_max.shape)

运行结果
在这里插入图片描述
:这段代码定义了一个最大汇聚层(MaxPool2D),并将这个汇聚层应用于之前通过卷积层(Conv2D)处理过的图像张量(image_after_conv)。代码中的参数pool_size定义了汇聚操作的窗口大小。

4.2.平均汇聚

pool_avg = keras.layers.AvgPool2D(pool_size=2)
image_after_pool_avg = pool_avg(image_after_conv)
print("平均汇聚后的张量大小:",image_after_pool_avg.shape)

运行结果
在这里插入图片描述
:平均汇聚层通常用于减少特征图的大小,同时保留重要信息。通过将窗口内的值进行平均,平均汇聚层可以捕捉到图像中的关键特征。汇聚操作后,输出特征图的尺寸会减小,但每个元素都是通过计算窗口内所有元素的平均值得到的,因此保留了更多的上下文信息。

4.3.全局平均汇聚

pool_global_avg = keras.layers.GlobalAvgPool2D()
image_after_pool_global_avg = pool_global_avg(image_after_conv)
print("全局平均汇聚后的张量大小:",image_after_pool_global_avg.shape)

运行结果
在这里插入图片描述
:这段代码定义了一个全局平均汇聚层(GlobalAvgPool2D),并将这个汇聚层应用于之前通过卷积层(Conv2D)处理过的图像张量(image_after_conv)。全局平均汇聚层会在整个输入特征图上执行平均汇聚操作,这意味着它会将输入特征图的每个元素都除以特征图的总元素数,以计算每个特征的平均值。

5.搭建卷积神经网络进行手写数字识别

5.1.导入并对数据进行预处理

train_Data = pd.read_csv('mnist_train.csv',header = None) #训练数据
test_Data = pd.read_csv('mnist_test.csv',header = None)  #测试数据X, y = train_Data.iloc[:,1:].values/255, train_Data.iloc[:,0].values #数据归一化X_valid, X_train = X[:5000].reshape(5000,28,28) , X[5000:].reshape(55000,28,28) #验证集与训练集
y_valid, y_train = y[:5000], y[5000:]X_test,y_test = test_Data.iloc[:,1:].values.reshape(10000,28,28)/255, test_Data.iloc[:,0].values #测试集
print(X_train.shape)
print(X_valid.shape)
print(X_test.shape)

运行结果
在这里插入图片描述
:这段代码的输出将显示各个数据集的形状,即它们的样本数量和每个样本的特征维度。对于MNIST数据集,每个样本是一个28x28的图像,因此每个样本有784个特征(28*28)。

5.2.扩张为四维张量

X_train = X_train[..., np.newaxis]
X_valid = X_valid[...,np.newaxis]
X_test = X_test[...,np.newaxis]print(X_train.shape)
print(X_valid.shape)
print(X_test.shape)

运行结果
在这里插入图片描述
:将这些数据集的形状从(样本数量, 高度, 宽度)扩展为(样本数量, 高度, 宽度, 通道数)。这是为了匹配卷积神经网络(CNN)的输入要求,其中通道数通常是1(对于灰度图像)或3(对于RGB彩色图像)。

5.3.搭建卷积神经网络

#搭建模型
model_cnn_mnist = keras.models.Sequential([keras.layers.Conv2D(32, kernel_size=3, padding="same", activation="relu"),keras.layers.Conv2D(64, kernel_size=3, padding="same", activation="relu"),keras.layers.MaxPool2D(pool_size=2),keras.layers.Flatten(),keras.layers.Dropout(0.25),keras.layers.Dense(128, activation="relu"),keras.layers.Dropout(0.5),keras.layers.Dense(10, activation="softmax")
])#评估性能
model_cnn_mnist.compile(loss="sparse_categorical_crossentropy",optimizer="nadam",metrics=["accuracy"])
model_cnn_mnist.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid))

运行结果
在这里插入图片描述

第一层卷积层:使用32个大小的卷积核
第二层卷积层:使用64个大小的卷积核
第三层汇聚层:将所有特征映射的维度缩小至原先一半
第四层是平展层:将原先四维张量(55000,14,14,64)平展成两维张量(55000,),即将一个样本的所有参数项平展成一个维度
后续是全连接层

model_cnn_mnist.evaluate(X_test, y_test, batch_size=1)

运行结果
在这里插入图片描述
:使用model_cnn_mnist.evaluate方法来评估您的卷积神经网络(CNN)模型在MNIST测试集上的性能。这个方法将计算模型在测试数据上的损失和指标,这里是准确率。

model_cnn_mnist.summary()

运行结果
在这里插入图片描述
:打印出模型的结构

6.利用函数式API与子类API搭建复杂神经网络

6.1.残差层

class ResidualUnit(keras.layers.Layer):def __init__(self, filters, strides=1, activation="relu"):super().__init__()self.activation = keras.activations.get(activation)self.main_layers = [keras.layers.Conv2D(filters, 3, strides=strides, padding = "SAME", use_bias = False), keras.layers.BatchNormalization(),self.activation,keras.layers.Conv2D(filters, 3, strides=1, padding = "SAME", use_bias = False),keras.layers.BatchNormalization()]# 当滑动步长s = 1时,残差连接直接将输入与卷积结果相加,skip_layers为空,即实线连接self.skip_layers = [] # 当滑动步长s = 2时,残差连接无法直接将输入与卷积结果相加,需要对输入进行卷积处理,即虚线连接if strides > 1:self.skip_layers = [keras.layers.Conv2D(filters, 1, strides=strides, padding = "SAME", use_bias = False),keras.layers.BatchNormalization()]def call(self, inputs):Z = inputsfor layer in self.main_layers:Z = layer(Z)skip_Z = inputsfor layer in self.skip_layers:skip_Z = layer(skip_Z)return self.activation(Z + skip_Z)

:定义了一个名为ResidualUnit的类,它继承自keras.layers.Layer,用于创建残差单元(Residual Unit),这是深度学习中常用的一种网络结构,特别是在残差网络(ResNet)中。残差单元允许网络在深层中传播信息,通过跳跃连接(skip connections)来缓解梯度消失问题,从而使网络能够成功训练更深的层次。

6.2.搭建完整的ResNet-34神经网络

model = keras.models.Sequential()model.add(keras.layers.Conv2D(64, 7, strides=2, padding = "SAME", use_bias = False))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Activation("relu"))
model.add(keras.layers.MaxPool2D(pool_size=3, strides=2, padding="SAME"))prev_filters = 64
for filters in [64] * 3 + [128] * 4 + [256] * 6 + [512] * 3:strides = 1 if filters == prev_filters else 2   #在每次特征图数目扩展时,设置滑动步长为2model.add(ResidualUnit(filters, strides=strides))prev_filters = filtersmodel.add(keras.layers.GlobalAvgPool2D())
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(10, activation="softmax"))model.compile(loss="sparse_categorical_crossentropy",optimizer="sgd",metrics=["accuracy"])
model.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid))model.evaluate(X_test, y_test, batch_size=1)

运行结果
在这里插入图片描述
:使用了一个循环来添加多个残差单元。残差单元的数量和过滤器数量根据您提供的列表 [64] * 3 + [128] * 4 + [256] * 6 + [512] * 3 来确定。在每次特征图数目扩展时,即从64到128,从128到256,从256到512时,您将步长设置为2,以便在空间维度上进行下采样。

二.总结:前馈神经网络与卷积神经网络的区别

1.结构差异:

前馈神经网络:由输入层、一个或多个隐藏层以及输出层组成,每层之间的神经元完全连接。前馈网络通常用于处理非空间数据,如图像的像素值在输入时会被展平成一维向量。
卷积神经网络:由输入层、一个或多个卷积层、池化层、全连接层以及输出层组成。卷积层和池化层允许网络在处理数据时保留空间结构,因此非常适合处理图像和视频数据。

2.参数效率:

前馈神经网络:由于每层神经元之间的完全连接,前馈网络通常具有大量的参数,这使得网络在训练时更容易过拟合,尤其是在训练数据量有限的情况下。
卷积神经网络:通过权值共享和局部连接,卷积网络大大减少了参数的数量,这使得网络更加高效,并且能够在有限的数据上训练出更好的模型。

3.局部连接:

前馈神经网络:每一层的所有神经元都与上一层的所有神经元相连接。
卷积神经网络:卷积层中的神经元只与输入数据的一个局部区域连接,这反映了图像的局部性质。

4.平移不变性:

前馈神经网络:不具备平移不变性,即对输入数据的平移会改变网络的输出。
卷积神经网络:由于卷积操作的性质,卷积网络具有平移不变性,这意味着即使图像在空间上发生了平移,网络仍然能够识别出相同的模式。

5.池化操作:

前馈神经网络:不包含池化层,因此不会减少数据的空间维度。
卷积神经网络:通过池化层减少数据的维度,同时保留最重要的信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/18603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity之FGUI】白仙章Fairy GUI控件详解二

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:就业…

《征服数据结构》双向链表

摘要: 1,双链表的介绍 2,双链表的用途 3,双链表的节点插入和删除 1,双链表的介绍 前面我们讲过单链表,单链表的特点就是只能往后访问不能往前访问。单链表一般在面试中用的比较多,比如删除倒数第…

广东商标协会批复为世界酒中国菜的指导单位

广东商标协会批复荐酒师公司成为“世界酒中国菜”活动指导单位 一、批复背景与意义 广东商标协会正式批复荐酒师国际认证(广州)有限公司,成为备受瞩目的“世界酒中国菜”系列活动的指导单位。该活动旨在共建“一带一路”倡议、助力“乡村振兴…

Unity射击游戏开发教程:(28)敌人被摧毁时掉落的能量提升

在这篇文章中,我将介绍如何在敌人被摧毁时产生能量提升。 首先,有一个生成管理器,负责生成敌人和能量提升。我正在对其进行转换,以便当敌人被摧毁时,有可能会掉落能量。本文将仅介绍当敌人被摧毁时掉落的能量道具。我将介绍为电源添加一个平衡的生成系统。 Spawn Manager…

最简单的 UDP-RTP 协议解析程序

最简单的 UDP-RTP 协议解析程序 最简单的 UDP-RTP 协议解析程序原理源程序结果下载链接参考 最简单的 UDP-RTP 协议解析程序 本文介绍网络协议数据的处理程序。网络协议数据在视频播放器中的位置如下所示。 本文中的程序是一个 UDP/RTP 协议流媒体数据解析器。该程序可以分析 …

Sqli-labs-master靶场1-20通关教程

目录 SQL注入基本语句 Less-1(字符型-闭合 ) Less-2(数字型) Less-3(字符型-闭合 ) ) Less-4(字符型-闭合 ") ) Less-5(报错注入-闭合 ) Less-…

激光雷达测试板智能系统应用

在自动驾驶技术和机器人感知系统的迅猛发展中,激光雷达(Lidar)作为一种先进的测距技术,正逐渐成为这些系统不可或缺的组成部分。而在这一技术的实际应用前,对激光雷达进行精确的测试和校准是至关重要的一步。激光雷达测…

【原创】java+springboot+mysql日程管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

基于tensorflow的咖啡豆识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、前期工作 1. 设置GPU import tensorflow as tfgpus tf.config.list_physical_devices("GPU")if gpus:tf.config.experimental.set_memory_gr…

全球伦敦银收盘时间一致吗

跟伦敦金市场相似,伦敦银市场也是一个全球化的无形市场,无论来自世界上什么地方的投资者参与其中,都可以得到全天接近24个小时的连贯行情,只要精力足够,根本不用担心没有交易获利的机会。但由于交易平台始终有维护的需…

轻松实现PDF文件的在线浏览

福昕软件最近发布了一款名为Cloud API的产品,通过几行代码即可轻松实现PDF文件的在线浏览。先一睹为快吧。 简介 先看看产品官网:福昕 Cloud API Cloud API包括两个形态产品,一个是在线的PDF查看工具,叫PDF Embed API,另外一个…

git 学习(一)

一、版本控制 (一)介绍 版本迭代 每一次更新代码 都会出现新的版本如果我们需要之前的版本的文件 我们就得需要版本控制的文件 每一次更新的结果我们都保存下来 多人开发必须要用版本控制器 否则代价会很大 (二)主流的版本控制…

uniapp开发微信小程序:用户手机号授权获取全流程详解与实战示例

随着多端小程序研发工具的日益普及,诸如uniapp、Taro、Flutter等跨平台解决方案使得开发者能够高效地构建同时适配多个主流小程序平台(如微信、支付宝、百度、字节跳动等)的应用。尽管各平台间存在一定的差异性,但在获取用户手机号…

防火墙技术基础篇:基于Ensp配置防火墙NAT server(服务器映射)

配置防火墙NAT server(服务器映射) 什么是NAT Server (服务器映射) NAT(Network Address Translation,网络地址转换)是一种允许多个设备共享一个公共IP地址的技术。NAT Server,也称为服务器映射,是NAT技术中的一种应…

7 Series FPGAs Integrated Block for PCI Express IP核设计中的物理层控制核状态接口

物理层控制和状态允许用户应用程序根据数据吞吐量和电源需求来更改链路的宽度和速度。 1 Design Considerations for a Directed Link Change 在Directed Link Change(定向链接更改)期间需要注意的事项有: 链接更改操作(Link c…

C++STL---模拟实现string

我们这篇文章进行string的模拟实现。 为了防止标准库和我们自己写的string类发生命名冲突,我们将我们自己写的string类放在我们自己的命名空间中: 我们先来搭一个class string的框架: namespace CYF{ public://各种成员函数 priva…

基于单片机智能防触电装置的研究与设计

摘 要 : 针对潮湿天气下配电线路附近易发生触电事故等问题 , 对单片机的控制算法进行了研究 , 设 计 了 一 种 基 于 单片机的野外智能防触电装置。 首先建立了该装置的整体结构框架 , 再分别进行硬件设计和软件流程分析 &#xf…

IDEA升级web项目为maven项目乱码

今天将一个java web项目改造为maven项目。 首先&#xff0c;创建一个新的maven项目&#xff0c;将文件拷贝到新项目中。 其次&#xff0c;将旧项目的jar包&#xff0c;在maven的pom.xml做成依赖 接着&#xff0c;把没有maven坐标的jar包在编译的时候也包含进来 <build>…

实战教程:使用Go的net/http/fcgi包打造高性能Web应用

实战教程&#xff1a;使用Go的net/http/fcgi包打造高性能Web应用 简介理解FCGI协议FastCGI工作原理CGI与FastCGI对比其他接口对比 初步使用net/http/fcgi包设置和配置基础环境一个简单的FastCGI应用示例本地测试与调试 深入net/http/fcgi包的高级用法探索net/http/fcgi的主要功…

气膜建筑的运行保障:应对停电的解决方案—轻空间

气膜建筑作为一种现代化的建筑形式&#xff0c;以其独特的结构和多样的应用赢得了广泛关注。这种建筑依靠风机不断往内部吹气来维持其结构形态&#xff0c;那么如果遇到停电的情况&#xff0c;该如何确保其正常运行呢&#xff1f; 气膜建筑的供风系统 气膜建筑内部的气压维持依…