pytorch学习-10.卷积神经网络(基础篇)

 2.线性模型

3.梯度下降算法

4.反向传播(用pytorch算梯度)

5.用pytorch实现线性回归

6.logistic回归

7.处理多维特征的输入

8.加载数据集

9.多分类问题

10.卷积神经网络(基础篇)_哔哩哔哩_bilibili

10.1卷积神经网络

10.1.1 卷积神经网络工作流程:

        

  1. 输入数据:输入通常是图像等网格结构数据,通常经过归一化等预处理。
  2. 卷积层:通过卷积核在输入上滑动,提取局部特征,输出特征图,通常接ReLU等非线性激活函数。
  3. 池化层:对特征图进行下采样,减少尺寸,保留重要特征,常用最大池化或平均池化。
  4. 多层堆叠:卷积层和池化层交替堆叠,逐层提取更抽象的特征。
  5. 全连接层:将特征图展平为一维向量,通过全连接层(仅由线性层串行构成)进行分类。
  6. 输出层:根据任务输出结果,如分类任务通过Softmax输出概率分布。


10.2 卷积层(Convolutional Layer)

10.2.1 单通道卷积

        在单通道二维图像处理中,卷积操作涉及一个卷积核在图像上滑动,计算卷积核与图像局部区域的内积(仅数乘)。具体来说,假设有图像 I和卷积核 K,2D卷积操作可以表示为,如下图所示:

卷积层作用测试:

import torch
in_channels=5   # 输入通道数
out_channels=10  # 输出通道数
kernel_size=3    # 卷积核大小
batch_size=1     # 批大小
width=100        # 图像宽度
height=100       # 图像高度# 输入数据   批大小 ,输入通道数,图像宽度,图像高度
input=torch.randn(batch_size,in_channels,width,height)
#torch.randn函数会根据给定的形状生成一个服从标准正态分布(均值为0,标准差为1)的随机张量。# 卷积层   输入通道数,输出通道数,卷积核大小
#卷积层作用:对输入数据进行特征提取,提取出图像中有用的特征,并输出到下一层进行进一步处理。
conv_layer=torch.nn.Conv2d(in_channels,out_channels,kernel_size)# 卷积输出
output=conv_layer(input)print(f"输入数据尺寸:{input.shape}")
print(f"卷积层权重尺寸:{conv_layer.weight.shape}")
print(f"卷积输出尺寸:{output.shape}")

运行结果:

         卷积后的

H^{`}=H-K+1  

W^{`}=W-K+1

10.2.2 多通道卷积

        如图所示,是多通道卷积基本原理:图像分配一个多通道卷积核,图像的的每个通道分配到多通道卷积核的一个通道,而后每个通道根据单通道的计算方式计算,得到一个矩阵,一共可以得到多个矩阵,将这多个个矩阵求和,最终得到的结果就是多通道卷积的结果。下图为3通道和n通道卷积工作图:

注:图像通道数=卷积核通道数 

        若想要输出的通道数不止一个,可以增加m个同种类型的卷积核,依次进行卷积运算,将得到的m个单层通道的卷积结果罗列起来,就得到了m个通道的输出,过程如下图所示:

 10.2.3 卷积层常用参数:

        padding:

        当想要改变输出结果的width、height时,就需要padding,如下图所示,原输出为一个 3 x 3 的矩阵,若想要将其一个 5 x 5 的矩阵时,padding操作就是在输入图像周围进行填充,填充数值为0。

        测试代码:

import torchinput = [3,4,6,5,7,
2,4,6,8,2,
1,6,7,8,4,
9,7,4,6,2,
3,7,5,4,1]input=torch.Tensor(input).view(1,1,5,5)
#使用torch.Tensor(input)将这个列表转换为PyTorch的张量。
#view(1,1,5,5)将这个一维张量转换为一个四维张量,形状为1x1x5x5,
#即一个批次(batch size为1)输入通道(input channels为1)、5x5大小的图像。conv_layer=torch.nn.Conv2d(1,1,kernel_size=3,padding=1,bias=False)
#使用torch.nn.Conv2d创建一个二维卷积层。
#输入通道数为1,输出通道数为1。
#kernel_size=3表示卷积核的大小为3x3。
#padding=1表示在输入的每个维度上填充一层宽度为1的边界(用零填充),这样输出的大小与输入的大小相同。
#bias=False表示不使用偏置参数。kernel=torch.Tensor([1,2,3,4,5,6,7,8,9]).view(1,1,3,3)
# 定义了一个3x3的卷积核,其值为1到9。
# 使用view(1,1,3,3)将一维张量转换为四维张量,形状为1x1x3x3,符合Conv2d层的权重形状要求。
# 将这个卷积核赋值给卷积层的权重conv_layer.weight.data。conv_layer.weight.data=kerneloutput=conv_layer(input)
print(output)

        运行结果: 


         stride:

        stride就是卷积核窗口在遍历图像时,每走一步的步长。如下图所示,是stride=2时的卷积步骤:

       

         测试代码:

input = [3,4,6,5,7,
2,4,6,8,2,
1,6,7,8,4,
9,7,4,6,2,
3,7,5,4,1]input=torch.Tensor(input).view(1,1,5,5)
#使用torch.Tensor(input)将这个列表转换为PyTorch的张量。
#view(1,1,5,5)将这个一维张量转换为一个四维张量,形状为1x1x5x5,
#即一个批次(batch size为1)输入通道(input channels为1)、5x5大小的图像。conv_layer=torch.nn.Conv2d(1,1,kernel_size=3,stride=2,bias=False)
#使用torch.nn.Conv2d创建一个二维卷积层。
#输入通道数为1,输出通道数为1。
#kernel_size=3表示卷积核的大小为3x3。
#stride=2表示在输入的宽度和高度方向上,每隔2个元素移动一次。
#bias=False表示不使用偏置参数。kernel=torch.Tensor([1,2,3,4,5,6,7,8,9]).view(1,1,3,3)
# 定义了一个3x3的卷积核,其值为1到9。
# 使用view(1,1,3,3)将一维张量转换为四维张量,形状为1x1x3x3,符合Conv2d层的权重形状要求。
# 将这个卷积核赋值给卷积层的权重conv_layer.weight.data。conv_layer.weight.data=kerneloutput=conv_layer(input)
print(output)

         运行结果:


 10.3 最大池化层(Max Pooling Layer)

        最大池化通过在特征图的局部区域内取最大值来生成新的特征图。它在空间维度(高度和宽度)上进行操作,但不改变通道数。

        假设输入特征图的形状为 [H×W×C],其中 H 是高度,W 是宽度,C 是通道数。最大池化的操作过程如下:

  1. 划分窗口:将特征图划分为多个不重叠的局部区域(窗口)。窗口的大小(例如 2×2)和步幅(通常与窗口大小相同)是预先设定的参数。
  2. 取最大值:在每个局部窗口内,取所有元素的最大值。
  3. 生成输出特征图:将这些最大值组成新的特征图。输出特征图的形状为 [H′×W′×C],其中 H′ 和 W′ 是输出特征图的高度和宽度。

         测试代码:

import torchinput = [3,4,6,5,
2,4,6,8,
1,6,7,8,
9,7,4,6,
]input = torch.Tensor(input).view(1, 1, 4, 4)
maxpooling_layer = torch.nn.MaxPool2d(kernel_size=2)
#这里创建了一个最大池化层(MaxPool2d),kernel_size=2表示池化窗口的大小为2x2。
#最大池化层的作用是从输入的每个2x2区域中选择最大的值,
#以此来缩减特征图(feature map)的尺寸。output = maxpooling_layer(input)
print(output)

        运行结果: 

10.4 课上练习:

        课上代码:

import torch
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt#1.定义数据预处理
#1.1 重新定义transform
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))])#1.2 加载训练数据集
train_dataset = datasets.MNIST('../dataset/mnist',train=True,download=True,transform=transform)
#1.3 定义训练数据加载器
train_loader=DataLoader(train_dataset, batch_size=64, shuffle=True)#测试集
test_dataset = datasets.MNIST('../dataset/mnist',train=False,transform=transform)
test_loader=DataLoader(test_dataset, batch_size=64, shuffle=False)#2.定义网络结构
# 两个卷积层(conv1和conv2),分别用于提取图像特征。
# 一个池化层(pool),用于减少特征图的尺寸,保留重要信息。
# 一个全连接层(fc1),用于将提取的特征映射到10维的输出向量,对应于MNIST数据集中的10个数字类别。
class Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()#输入通道为1,输出通道为10,卷积核大小为5self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5)# 定义第一个卷积层,输入通道数为1(因为MNIST图像为灰度图),# 输出通道数为10(即提取10种特征),卷积核大小为5x5。# H*W的图像转换为10个H*W的特征图(H`=H-5+1, W`=W-5+1)。#输入通道为10,输出通道为20,卷积核大小为5self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5)# 定义第二个卷积层,输入通道数为10(来自conv1的输出),输出通道数为20(即提取20种特征),卷积核大小为5x5。# H*W的图像转换为10个H*W的特征图(H`=H-5+1, W`=W-5+1)。#池化层,池化核大小为2self.pool = torch.nn.MaxPool2d(2)# 定义一个最大池化层,池化核大小为2x2。# 池化层的主要作用是减少特征图的尺寸,同时保留重要信息。# 图像的尺寸减半H`=H/2, W`=W/2#全连接层,输入维度为320,输出维度为10self.fc1 = torch.nn.Linear(320, 10)# 定义一个全连接层,输入维度为320# (计算方法为20 * 4 * 4,因为经过两次卷积和池化后,输出的特征图尺寸为20x4x4),# 输出维度为10(对应于MNIST数据集中的10个数字类别)。def forward(self, x):batch_size = x.size(0)  #获取batch_sizex=F.relu(self.pool(self.conv1(x)))#图像10x28x28,经过第一个卷积层后,图像变为 10x24x24,经过池化层后,图像变为 10x12x12。#ReLU函数的作用是将输入小于0的部分归零,大于0的部分保持不变,有助于提高模型的训练效率。x=F.relu(self.pool(self.conv2(x)))#图像10x12x12,经过第二个卷积层后,图像变为 20x8x8,经过池化层后,图像变为 20x4x4。#展平特征图x=x.view(batch_size,-1)# -1 表示自动计算展平后的维度大小。# 对于第二个卷积层后的特征图,形状为 (batch_size, 20, 4, 4),# 展平后的形状为 (batch_size, 20 * 4 * 4),x=self.fc1(x)return xmodel = Net()
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)#3.定义损失函数和优化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)#4.训练与测试
#4.1定义训练函数
def train(epoch):running_loss = 0.0for i, data in enumerate(train_loader, 0):inputs, labels = datainputs, labels = inputs.to(device), labels.to(device)optimizer.zero_grad()#forward + backward + updateoutputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()if i % 300 == 299:  # print every 300 mini-batchesprint('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 300))running_loss = 0.0#4.2定义测试函数
preRate_list = []
def Net_test():correct = 0total = 0with torch.no_grad():for data in test_loader:inputs, targets = datainputs, targets = inputs.to(device), targets.to(device)outputs = model(inputs)_, predicted = torch.max(outputs.data, dim=1)total += targets.size(0)correct += (predicted == targets).sum().item()preRate_list.append(100 * correct / total)print('Accuracy of the network test images: %d %% [ %d / %d ]' % (100 * correct / total, correct, total))#4.3开始训练与测试
for epoch in range(10):train(epoch)Net_test()#5.绘制准确率与轮数的关系图
epoch_list=list(range(len(preRate_list)))
plt.plot(epoch_list,preRate_list)
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.title('Accuracy vs Epoch')
plt.show()

        运行结果:

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

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

相关文章

ARMv8 创建1、2、3级页表代码与注释

对下面的地址空间创建3级页表 // level 1 table, 4 entries: // 0000 0000 - 3FFF FFFF, 1GB block, DDR // 4000 0000 - 7FFF FFFF, 1GB block, DDR // 8000 0000 - BFFF FFFF, 1GB block, DDR // C000 0000 - FFFF FFFF, point to level2 tabel // // level 2 table, 512 en…

DeepSeek-R1满血版:硅基流动API或本地部署

大家好! 想在手机上部署 DeepSeek-R1 满血版(671B)?我来手把手教你最靠谱的两种方式!满血版模型参数高达 671 亿,手机本地运行几乎不可能,但通过「云服务 手机 App」的组合,你一样能在手机上丝…

React 各颜色转换方法、颜色值换算工具HEX、RGB/RGBA、HSL/HSLA、HSV、CMYK

📖 简介 基于 React Tailwind CSS 构建的专业颜色转换工具,支持多种颜色格式的实时转换。无论是设计师、开发者,都能在这个工具中找到所需的颜色转换功能。 ✨ 核心功能 🎯 多格式颜色转换 HEX 格式: 支持 3 位缩写 (#000, #…

开关电源抄板学习

一、实物 输入220V,输出12V5A 二、拍照并使用PS矫正 用卡尺测量下PCB的尺寸,在PS中作为画布。 用相机拍下照片,导入到PS中,用拉伸工具对图片进行矫正处理,并拉伸到和画布一样大小。 三、打开嘉立创EDA,导…

大数据在UI前端的应用探索:基于用户行为分析的产品优化策略

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 一、引言:用户行为分析重构产品优化的技术逻辑 在数字化产品体验竞争日益激烈的今…

优化 WebSocket 实现单例连接用于打印【待测试 】

class PrinterWebSocket { constructor(url) { if (PrinterWebSocket.instance) { return PrinterWebSocket.instance; } this.url url; this.socket null; this.queue []; // 打印任务队列 this.isConnecting false; this.retry…

Spring Cloud Alibaba/Spring Boot整合华为云存储实例(REST API方式)

一个小作业,初次尝试华为云存储,一点分享 原项目采用Spring Cloud Alibaba微服务技术、Spring Boot框架技术、VueJS前端框架开发技术,nacos注册中心,数据库为mysql 下面看一下没有运用云存储的原项目(可跳过&#xf…

Petalinux工程如何离线编译

目录 一.下载离线包 1.1 共享状态缓存包:sstate-cache 1.1.1 进入官网打开Petalinux工具网页 1.1.2 找到相应的Petalinux版本 1.1.3 根据平台下载 1.2 下载downloads源码包 1.3 open_components源码包 二.解压 2.1 sstate-cache 2.2 downloads源码包 2.3…

w446数字化农家乐管理平台的设计与实现

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

AWS WebRTC:通过shell分析viewer端日志文件

在并发过程中,每个viewer会产生一个对应的日志文件,日志文件名为: viewer_channel_index_20250626_030943_145.logviewer端日志比master端日志文件数量多,比例大概是5:1,有1个master就会有5个viewer,每个viewer对应一个日志文件。 我要统计的是从启动viewer到出第一帧视…

时间转换——借助时间模块time

两种时间戳类型 例如s11704879917000 1、13位的时间戳:单位(毫秒) (1)毫秒变成秒,1s1000ms,s1/1000(秒) (2)加载时间 times time.localtime(…

LabVIEW MathScript薄板热流模拟

热流模拟是热设计关键环节,传统工具精准但开发周期长,本 VI 利用 LabVIEW 优势,面向工程师快速验证需求,在初步方案迭代、教学演示等场景更具效率,为热分析提供轻量化替代路径,后续可结合专业工具&#xff…

为什么大语言模型训练和推理中越来越多地使用 bfloat16?

随着大语言模型(LLM)的参数规模从几十亿(B)飙升到千亿(T)级别,模型的训练与推理效率变得尤为关键。为了在保证精度的同时节省显存、加快运算,混合精度训练(Mixed Precisi…

暴力破解漏洞与命令执行漏洞

在当今的互联网世界中,网络安全威胁无处不在。对于Java后端开发者而言,了解常见的Web漏洞及其防护措施至关重要。本文将探讨两种常见的安全漏洞:暴力破解漏洞(Brute Force)和命令执行漏洞(Command Injectio…

HDFS Java API 开发指南:从基础操作到高级应用

HDFS (Hadoop Distributed File System) 作为大数据生态的核心存储系统,提供了分布式、高容错、高吞吐量的数据存储能力。通过 Java API 操作 HDFS 是开发大数据应用的基础技能。本文将基于你的笔记,详细解析 HDFS Java API 的使用方法,并提供…

区块链技术核心组件及应用架构的全面解析

区块链技术是一套融合密码学、分布式系统与经济激励的复合型技术体系,以下是其核心组件及应用架构的全面解析:一、区块链核心技术栈 1. 分布式账本技术(DLT) 核心原理:多节点共同维护不可篡改的数据链数据结构&#xf…

golang 协程 如何中断和恢复

Go语言通知协程退出(取消)的几种方式 - 知乎 GoLang之goroutine底层系列二(goroutine的创建、让出、恢复)_golang goroutine-CSDN博客 在 Go 语言中,协程(也称为 goroutine)是通过 go 关键字启动的轻量级线程。由于 goroutine 的调度是由 Go…

ARMv8 创建3级页表示例

最近在研究arm v8页表创建过程,顺带做了一个如下形式的页表, // level 1 table, 4 entries: // 0000 0000 - 3FFF FFFF, 1GB block, DDR // 4000 0000 - 7FFF FFFF, 1GB block, DDR // 8000 0000 - BFFF FFFF, 1GB block, DDR // C000 0000 - FFFF FFFF…

迁港战平 精神可胜国足

迁港战平可胜国足 江苏省城市足球联赛第6轮,宿迁队主场迎战连云港队。比赛中,宿迁队由张栋和高驰各入一球,连云港队则凭借穆家鑫与李团杰的进球连扳两城。最终双方以2比2握手言和。 第38分钟,张栋角球进攻中无人盯防推射破门&…

408第三季part2 - 计算机网络 - ip分布首部格式与分片

理解 好好看一下这个图 每行是4B,首部也不一定是20B,还有可选字段,可以变的更大 然后我们先看一下概念 然后这个生存时间每路过一个路由器就会扣1滴血 比如一开始是13,经过r1r2r3到B会变成10 但如果是2,经过第二个路…