深度学习技术之卷积神经网络

深度学习技术

  • 卷积神经网络
    • 1. 导入需要的库
    • 2. 加载并显示两张图像
      • 2.1 加载图像
      • 2.2 创建子图
      • 2.3 打印图像形状
      • 2.4 打印合并后的图像数组的形状
    • 3. 卷积层
      • 3.1 定义变量
        • 3.1.1 卷积核的大小(u)
        • 3.1.2 滑动步长(s)
        • 3.1.3 输出特征图的数量(p)
      • 3.2 卷积层形式
      • 3.3 打印张量
    • 4. 池化层
      • 4.1 最大池化层
      • 4.2 全局平均池化层
      • 4.3 平均池化层
    • 5. 搭建卷积神经网络进行手写数字识别
      • 5.1 导入并对数据进行预处理
        • 5.1.1 读取数据并存储
        • 5.1.2 归一化
        • 5.1.3 分割验证集和训练集
        • 5.1.4 归一化
        • 5.1.5 打印形状
      • 5.2 搭建卷积神经网络
        • 5.2.1 定义一个卷积神经网络(CNN)
        • 5.2.2 重塑(reshape)
        • 5.2.3 编译和训练模型
        • 5.2.4 评估性能
    • 6. 利用函数式API与子类API搭建复杂神经网络
      • 6.1 残差层
        • 6.1.1 残差连接
      • 6.2 搭建完整的ResNet-34神经网络
        • 6.2.1 创建一个顺序模型
        • 6.2.2 向模型中添加层
        • 6.2.3 构建一个深度残差网络
        • 6.2.3 添加几层用于分类任务
        • 6.2.4 编译和训练模型
        • 6.2.5 评估性能

卷积神经网络

1. 导入需要的库

导入numpy、pandas,tensorflow、sklearn等库,以及导入matplotlib的pyplot模块。从sklearn库的datasets模块中导入load_iris函数,以及从sklearn库的model_selection模块中导入train_test_split函数。从TensorFlow库中导入Keras模块。

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

2. 加载并显示两张图像

2.1 加载图像

使用了sklearn.datasets.load_sample_image函数来加载两个预先定义的样本图像,并将图像的像素值从0-255的范围缩放到0-1的范围。

china = load_sample_image("china.jpg") / 255
flower = load_sample_image("flower.jpg") / 255

2.2 创建子图

在Matplotlib中创建了两个新的子图,三个数值分别代表行数、列数以及子图的位置。(从左到右,从上到下)。

plt.subplot(1,2,1)
plt.imshow(china)
plt.subplot(1,2,2)
plt.imshow(flower)

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

2.3 打印图像形状

打印出“china.jpg”图像的形状,即图像的高度、宽度和颜色通道数。

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

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

2.4 打印合并后的图像数组的形状

将两个图像合并为一个NumPy数组,其中第一个元素是“china.jpg”图像,第二个元素是“flower.jpg”图像,计算并存储了合并后的图像数组的形状,并打印出合并后的图像数组的形状,即数据集中图像的数量和每个图像的高度、宽度和颜色通道数。

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

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

3. 卷积层

3.1 定义变量

3.1.1 卷积核的大小(u)

u通常表示卷积核(也称为过滤器)的边长。在这里,u被设置为7,意味着卷积核是一个7x7的矩阵。

在图像处理中,卷积核用于检测图像中的特定模式或特征。卷积核的大小(u)决定了它可以检测的特征的大小。

u = 7 # 卷积核边长
3.1.2 滑动步长(s)

s通常表示卷积核的滑动步长(stride)。在这里,s被设置为1,这意味着在每一步,卷积核都会在输入图像上滑动一个像素。

滑动步长(s)决定了卷积核在图像上移动的步长。较小的滑动步长可以提高特征的分辨率,但会增加计算成本。

s = 1 # 滑动步长
3.1.3 输出特征图的数量(p)

p通常表示输出特征图的数量。在这里,p被设置为5,意味着卷积操作将生成5个不同的特征图。

输出特征图的数量(p)决定了卷积操作将生成多少个特征图。每个特征图都捕获了图像的不同方面或特征。

p = 5 # 输出特征图数目

3.2 卷积层形式

input_shape: 输入数据的形状,它是一个元组,代表输入特征图的尺寸加上通道数。

activation: 激活函数,这里使用的是 ReLU(修正线性单元)激活函数。

padding: padding 策略,“SAME” 表示使用边缘填充,使得输出特征图的尺寸与输入相同。

conv = keras.layers.Conv2D(filters = p, kernel_size = u, strides = s, padding="SAME", activation="relu", input_shape=images_shape)

3.3 打印张量

image_after_conv = conv(images)
print("卷积后的张量大小: ", image_after_conv.shape)

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

4. 池化层

4.1 最大池化层

最大池化(Max Pooling)是一种池化操作,它通过在局部区域中取最大值来减少数据的维度。

pool_max = keras.layers.MaxPool2D(pool_size=2)
image_after_pool_max = pool_max(image_after_conv)
print("最大汇聚后的张量大小: ",image_after_pool_max.shape)

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

4.2 全局平均池化层

全局平均池化(Global Average Pooling)是一种池化操作,它计算整个特征图的平均值,这通常用于卷积神经网络的末端,以减少特征图的空间维度到1x1,即每个特征图只保留一个平均值。这种方法可以用来减少参数数量并防止过拟合。

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

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

4.3 平均池化层

平均池化(Average Pooling)是一种池化操作,它计算每个局部区域内的平均值,并使用这些平均值来减少数据的维度。

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

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

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

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

5.1.1 读取数据并存储

从指定路径读取训练数据和测试数据,并将它们存储在 train_Data 和 test_Data 变量中。这些数据是以 CSV 格式存储的,并且指定了 header=None,这意味着 CSV 文件中没有标题行。

path = "E:/工坊/深度学习/"
train_Data = pd.read_csv(path+'train.csv', header = None) # 训练数据
test_Data = pd.read_csv(path+'test.csv', header = None) # 测试数据
5.1.2 归一化

对训练数据进行处理,将像素值归一化到 [0, 1] 范围内,并将图像数据与标签分离。

X, y = train_Data.iloc[:,1:].values/255, train_Data.iloc[:,0].values #数据归一化
5.1.3 分割验证集和训练集

X_valid 和 y_valid 分别存储验证集的图像数据和标签,而 X_train 和 y_train 存储训练集的图像数据和标签。reshape 函数用于将数据从一维数组转换为三维数组,其中每个图像是一个 28x28 的矩阵。打印出的形状信息可以帮助确认数据的维度是否正确。

X_valid, X_train = X[:5000].reshape(5000,28,28) , X[5000:].reshape(55000,28,28) #验证集与训练集
y_valid, y_train = y[:5000], y[5000:]
5.1.4 归一化

test_Data.iloc[:,1:] 表示您想要获取所有行的第二列到最后一列的数据,这些列包含图像的像素值。test_Data.iloc[:,0] 则表示您想要获取所有行的第一列数据,这列包含图像的标签。

X_test,y_test = test_Data.iloc[:,1:].values.reshape(10000,28,28)/255, test_Data.iloc[:,0].values #测试集
5.1.5 打印形状

打印 X_train、X_valid 和 X_test 变量的形状。这些变量分别代表训练数据、验证数据和测试数据。

print(X_train.shape)
print(X_valid.shape)
print(X_test.shape)

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

5.2 搭建卷积神经网络

5.2.1 定义一个卷积神经网络(CNN)

Flatten():这个层将3D输出张量(特征图)展平为1D特征向量,这是后续的全连接层所必需的。

Dropout(0.25):这个层在每次训练更新时随机地将输入单元的25%设置为0,这有助于防止过拟合。

Dense(128, activation=“relu”):这是一个有128个单元的全连接层,并使用ReLU激活函数。

Dropout(0.5):另一个具有更高丢弃率(0.5)的全连接层。

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")
])
5.2.2 重塑(reshape)

reshape 方法被用于改变数组的形状,而不改变其数据。

# 假设 X_train, X_valid, X_test 是您当前的图像数据
X_train = X_train.reshape(-1, 28, 28, 1)
X_valid = X_valid.reshape(-1, 28, 28, 1)
X_test = X_test.reshape(-1, 28, 28, 1)
5.2.3 编译和训练模型

compile 方法用于配置模型的学习过程。

fit 方法用于训练模型。

evaluate 方法用于评估模型的性能。

执行这些代码后,模型将经历编译、训练和评估的过程,将能够看到每个周期在验证集上的准确率,以及最终在测试集上的损失和准确率。

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))
model_cnn_mnist.evaluate(X_test, y_test, batch_size=1)

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

5.2.4 评估性能

evaluate:这是模型实例的方法,用于评估模型的性能。它计算模型在编译时指定的损失函数和指标(在这个案例中是准确率)。

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

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

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

6.1 残差层

6.1.1 残差连接

残差连接(Residual Connection)是深度学习中的一种常见网络架构,它允许在网络层之间直接添加输入到输出,这种连接可以帮助梯度在网络中顺畅传播,从而缓解了深层网络训练中的梯度消失和梯度爆炸问题。

ResidualUnit 类实现了一个残差单元,其中包含了主要的前向传播路径(main_layers)和一个跳跃连接(skip_layers)。

filters: 卷积层中的过滤器(卷积核)数量。

strides: 卷积层的步长,默认为1。当步长大于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)

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

6.2.1 创建一个顺序模型

模型中的层会依次堆叠。

model = keras.models.Sequential()
6.2.2 向模型中添加层

批量归一化层:有助于加速训练过程和稳定网络。

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")) # 添加ReLU激活函数
model.add(keras.layers.MaxPool2D(pool_size=3, strides=2, padding="SAME")) # 添加最大池化层
6.2.3 构建一个深度残差网络

构建一个深度残差网络,其中的残差单元允许模型在增加深度时仍然能够有效地训练。通过逐渐增加过滤器的数量,模型能够捕捉到更复杂的特征,同时通过步长的变化来调整特征图的尺寸。这种设计使得模型能够在不牺牲性能的情况下增加深度,这是残差网络的一个重要特性。

prev_filters = 64 # 初始化前一个块的过滤器数量为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 = filters
6.2.3 添加几层用于分类任务

model.add(keras.layers.GlobalAvgPool2D()): 这层会在每个特征图上计算全局平均池化,即将每个特征图的的所有值平均成一个单一的值。

model.add(keras.layers.Flatten()): 这层将上一个层的输出展平成一个一维向量。

model.add(keras.layers.Dense(10, activation=“softmax”)): 这是最后一个全连接层,它将一维的输入向量映射到一个长度为10的输出向量,每个元素对应一个类别。

activation="softmax"表示使用softmax激活函数,它会将输出向量转换为概率分布,每个元素都是相应类别的预测概率。

model.add(keras.layers.GlobalAvgPool2D())
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(10, activation="softmax"))
6.2.4 编译和训练模型

compile 方法用于配置模型的学习过程。

fit 方法用于训练模型。

model.compile(loss="sparse_categorical_crossentropy", optimizer="nadam", metrics=["accuracy"])
model.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid))

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

6.2.5 评估性能

evaluate:这是模型实例的方法,用于评估模型的性能。它计算模型在编译时指定的损失函数和指标(在这个案例中是准确率)。

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

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

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

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

相关文章

你了解 pom.xml 吗

你了解pomxml吗 springboot 是 java 利器&#xff0c;几乎每个写 java 的同学都会用&#xff0c;但是你了解 pom.xml 吗&#xff1f; 这篇干货查漏补缺。 首先我们创建个 springboot 项目 都选了默认设置&#xff1a; 我把这篇完整粘贴出来 pom.xml <?xml version&quo…

Linux 通过关键字查找文件

按文件名查找 find 路径 -name “文件名” 查找当前目录下的所有mk文件 find . -name "*.mk"按关键字查找 find 路径 -name “文件名” | xargs grep -n “关键字” 参数&#xff1a; xargs 是给命令传递参数的一个过滤器&#xff0c;也是组合多个命令的一个工具 -n…

【挑战全网】最全高德地图充电桩接入指南,流量必火!

分享《一套免费开源充电桩物联网系统&#xff0c;是可以立马拿去商用的&#xff01;》 一、和高德直接互联互通的优势&#xff1a; 1、高德官方直接互联互通&#xff0c;提供给合作商户独立发展自主权&#xff0c;不依赖任何第三方平台; 2、自己控制电站的上线、下线、修改电…

从0开始理解云原生架构

一、云原生发展历史 云原生概念最早起源于2013年&#xff0c;由 Matt Stine 首次提出“Cloud Native”这一术语&#xff0c;这个概念强调了应用需要充分利用云的优势&#xff0c;如弹性、可扩展性和服务化。2015年&#xff0c;Matt Stine出版了《迁移到云原生架构》一书&am…

ChatGPT官网5月14日凌晨1点发布会推出最新GPT4o大模型,贾维斯时刻要来了?

就在今天北京时间2024年5月14日凌晨1点中&#xff0c;OpenAI进行了发布会&#xff0c;这次发布会的内容炸裂&#xff0c;一起来看下吧&#xff01; GPT4o多模态大模型发布 首先公开的是GPT4o多模态大模型的发布&#xff0c;相较于GPT-4turbo速度更快&#xff0c;更便宜。我刚开…

水离子雾化壁炉与会所的氛围搭配

水离子雾化壁炉在会所的氛围搭配可以营造出舒适、现代和高雅的氛围&#xff0c;以下是一些搭配建议&#xff1a; 豪华会所装饰&#xff1a; 将水离子雾化壁炉作为会所豪华装饰的一部分&#xff0c;放置在会所的核心区域或休息区域。选择适合会所风格的壁炉款式&#xff0c;如…

echarts的柱状图使用

1. 柱状图&#xff08;柱体顶部使用外部图片 相关代码 <template><div class"out-bg"><div class"container" ref"warnChartRef"></div></div> </template><script> import * as echarts from echar…

短视频矩阵系统/源码----可视化剪辑技术独家开发

现阶段市面上大多矩阵软件都非常程序化且需要使用者具有较强的逻辑思维能力或剪辑经验&#xff0c;这使得一些个人、团队、企业在使用时无形中增加了学习成本&#xff0c;剪辑出来的效果大多不尽如人意&#xff0c;发出来的视频没有流量&#xff0c;根本达不到预期效果。 如何提…

59.基于SSM实现的网上花店系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;网上花店是在MySQL中建立数据表保存信息&#xff0c;运用SSMVue框架和Java语言编写。并按照软件设计开发流程进行设计实现充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SSM的网…

运营商二次放号查询接口如何对接

运营商二次放号查询接口又叫手机二次放号检测接口&#xff0c;指的是输入手机号和日期&#xff0c;查看在该日期之前是不是二次放号。那么运营商二次放号查询接口如何对接呢&#xff1f; 这边我找到了一家叫数脉API的公司&#xff0c;他们刚好有这个接口&#xff0c;首先注册账…

CSS的基础语法和常见的语法简单归纳

CSS CSS 是层叠样式表&#xff08;Cascading Style Sheets&#xff09;的缩写。它是一种用来控制网页样式和布局的标记语言。通过 CSS&#xff0c;可以定义网页中的元素&#xff08;如文字、图像、链接等&#xff09;的外观和排版方式&#xff0c;包括字体、颜色、大小、间距、…

产品推荐 | 基于 AMD Alveo V80 数据中心的FPGA加速器卡

1、产品概述 Alveo V80 卡采用强大的 AMD Versal™ XCV80 HBM 系列自适应 SoC&#xff0c;将高带宽存储器 (HBM2e) 和 800 Gb/s 高速网络封装到全高、 长外形尺寸的双插槽卡中&#xff0c;专为在本地服务器或云中部署而设计。 V80 加速器经过优化&#xff0c;可通过 AMD Vers…

运维别卷系列 - 云原生监控平台 之 06.prometheus pushgateway 实践

文章目录 [toc]Pushgateway 简介Pushgateway 部署创建 svc创建 deployment Pushgateway 测试删除 Pushgateway 上对应 lable 的数据 Pushgateway 简介 WHEN TO USE THE PUSHGATEWAY Pushgateway 是一种中介服务&#xff0c;允许您从无法抓取的作业中推送指标。 The Pushgateway…

基于Django实现的校园疫情监控平台

基于Django实现的校园疫情监控平台 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 系统功能实现 登录注册功能 用户在没有登录自己的用户名之前只能浏览本网站的首页&#xff0c;想要使用其他功能都会…

web系统日常运维命令和工具

一、前言 web系统日常运维命令和工具 二查看服务器资源使用情况 1、内存使用情况 free -h 2、cpu 使用情况 3、磁盘使用情况 df -h /home 4、查看文件日志 查看文件尾部持续输出 tail -n 1000 -f xxx.log 查找文件匹配内容 cat xxx.log | grep XXXXX 查看zip文件内…

Java数据类型:基本数据类型

Java是一种强类型语言&#xff0c;定义变量时&#xff0c;必须指定数据类型。 // 变量必须指定数据类型 private String username;初学者不免有个疑问&#xff1a;在实际编写代码的过程中&#xff0c;该如何选择数据类型呢&#xff1f; 回答这个问题之前&#xff0c;先来解决…

线性/非线性最小二乘 与 牛顿/高斯牛顿/LM 原理及算法

最小二乘分为线性最小二乘和非线性最小二乘 最小二乘目标函数都是min ||f(x)||2 若f(x) ax b&#xff0c;就是线性最小二乘&#xff1b;若f(x) ax2 b / ax2 bx 之类的&#xff0c;就是非线性最小二乘&#xff1b; 1. 求解线性最小二乘 【参考】 2. 求解非线性最小二乘…

[数据结构]红黑树的原理及其实现

文章目录 红黑树的特性红黑树的时间复杂度推导&#xff1a;结论红黑树与AVL树比较 红黑树的插入红黑树的节点定义调整策略思考情况2&#xff1a;思考情况3&#xff1a; 代码实现myBTRee.htest.cpp 红黑树的特性 红黑树最常用的平衡二叉搜索树。跟AVL树不同的是&#xff0c;红黑…

阻抗控制理解之逆动态控制律

具有六个自由度的二阶机械系统&#xff0c;其特征是给定的质量、阻尼和刚度&#xff0c;称为机械阻抗。 用于运动控制的加速度解决方法&#xff0c;它旨在通过逆动力学控制律在加速度水平上解耦和线性化非线性机器人动力学。在与环境存在交互作用的情况下&#xff0c;控制律 考…

代码托管(二)git(4)冲突解决

一、pull更新代码冲突 二、cherry-pick冲突 1、冲突演示 本地check out到当前分支&#xff0c;双击目标分支&#xff0c;选择需要cherry-pick的commit&#xff0c;右键选择cherry-pick。 &#xff08;1&#xff09;如果没有冲突&#xff0c;会自动add--》并自动commit&#…