当前位置: 首页 > news >正文

PyTorch入门学习(八):神经网络-卷积层

目录

一、数据准备

二、创建卷积神经网络模型

三、可视化卷积前后的图像


一、数据准备

首先,需要准备一个数据集来演示卷积层的应用。在这个示例中,使用了CIFAR-10数据集,该数据集包含了10个不同类别的图像数据,用于分类任务。使用PyTorch的torchvision库来加载CIFAR-10数据集,并进行必要的数据转换。

import torch
import torchvision
from torch.utils.data import DataLoader# 数据集准备
dataset = torchvision.datasets.CIFAR10(root="D:\\Python_Project\\pytorch\\dataset2", train=False, transform=torchvision.transforms.ToTensor(), download=True)# 使用DataLoader加载数据集,每批次包含64张图像
dataLoader = DataLoader(dataset, batch_size=64)

二、创建卷积神经网络模型

接下来,创建一个简单的卷积神经网络模型,以演示卷积层的使用。这个模型包含一个卷积层,其中设置了输入通道数为3(因为CIFAR-10中的图像是彩色的,有3个通道),卷积核大小为3x3,输出通道数为6,步长为1,填充为0。

import torch.nn as nn
from torch.nn import Conv2dclass Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()# 卷积层self.conv1 = Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)def forward(self, x):x = self.conv1(x)return xtudui = Tudui()
print(tudui)

上述代码定义了一个Tudui类,该类继承了nn.Module,并在初始化方法中创建了一个卷积层。forward方法定义了数据在模型中的前向传播过程。

三、可视化卷积前后的图像

卷积层通常会改变图像的维度和特征。使用TensorBoard来可视化卷积前后的图像以更好地理解卷积操作。首先,导入SummaryWriter类,并创建一个SummaryWriter对象用于记录日志。

from torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter("logs")

然后,使用DataLoader遍历数据集,对每个批次的图像应用卷积操作,并将卷积前后的图像以及输入的图像写入TensorBoard。

step = 0
for data in dataLoader:imgs, targets = data# 卷积操作output = tudui(imgs)# 将输入图像写入TensorBoardwriter.add_images("input", imgs, step)# 由于TensorBoard不能直接显示具有多个通道的图像,我们需要重定义输出图像的大小output = torch.reshape(output, (-1, 3, 30, 30))# 将卷积后的图像写入TensorBoardwriter.add_images("output", output, step)step += 1writer.close()

在上述代码中,使用writer.add_images将输入和输出的图像写入TensorBoard,并使用torch.reshape来重定义输出图像的大小,以满足TensorBoard的显示要求。

运行上述代码后,将在TensorBoard中看到卷积前后的图像,有助于理解卷积操作对图像的影响。

完整代码如下:

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
#数据集准备
dataset = torchvision.datasets.CIFAR10("D:\\Python_Project\\pytorch\\dataset2",train=False,transform=torchvision.transforms.ToTensor(),download=True)
#使用dataloader加载数据集,批次数为64
dataLoader = DataLoader(dataset,batch_size=64)class Tudui(nn.Module):def __init__(self):super(Tudui,self).__init__()# 该神经网络调用conv2d进行一层卷积,输入通道为3层(彩色图像为3通道),卷积核大小为3*3,输出通道为6,设置步长为1,padding为0,不进行填充。self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)def forward(self,x):x = self.conv1(x)return xtudui = Tudui()
print(tudui)# 生成日志
writer = SummaryWriter("logs")step = 0
# 输出卷积前的图片大小和卷积后的图片大小
for data in dataLoader:imgs,targets = data# 卷积操作output = tudui(imgs)print(imgs.shape)print(output.shape)writer.add_images("input",imgs,step)"""注意:使用tensorboard输出时需要重新定义图片大小对于输入的图片集imgs来说,tensor.size([64,3,32,32]),即一批次为64张,一张图片为三个通道,大小为32*32对于经过卷积后输出的图片集output来说,tensor.size([64,6,30,30]),通道数变成了6,tensorboard不知道怎么显示通道数为6的图片,所以如果直接输出会报错解决方案:使用reshape方法对outputs进行重定义,把通道数改成3,如果不知道批次数大小,可以使用-1代替,程序会自动匹配批次大小。"""#重定义输出图片的大小output = torch.reshape(output,(-1,3,30,30))# 显示输出的图片writer.add_images("output",output,step)step = step + 1
writer.close()

参考资料:

视频教程:PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】

相关文章:

  • stable-diffusion-ui 下载和安装
  • EtherNet Ip工业RFID读写器与欧姆龙PLC 配置示例说明
  • 自动驾驶,从“宠儿”走进“淘汰赛”
  • linux入门---多线程的控制
  • HTML5和HTML的区别
  • 13.计算机视觉
  • Shopee买家通系统全自动化操作简单方便又快速
  • 解决恶意IP地址攻击:保卫网络安全的有效方法
  • 大数据-玩转数据-Python Sftp Mysql 数据
  • 支持CT、MR三维后处理的医学PACS源码
  • 【Luogu】 P5642 人造情感(emotion)
  • AUTOSAR汽车电子嵌入式编程精讲300篇-基于车联网的商用车载终端系统的研究与设计
  • 关于多个elementui的cascader级联组件页面滚动渲染样式导致卡顿问题
  • SQLSmith: Databend 如何利用随机化测试检测 Bug
  • MySQL 8 - 处理 NULL 值 - is null、=null、is not null、<> null 、!= null
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • docker容器内的网络抓包
  • Javascript设计模式学习之Observer(观察者)模式
  • java中具有继承关系的类及其对象初始化顺序
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • MySQL主从复制读写分离及奇怪的问题
  • Python socket服务器端、客户端传送信息
  • python3 使用 asyncio 代替线程
  • 初识MongoDB分片
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 排序算法之--选择排序
  • 前端js -- this指向总结。
  • 实习面试笔记
  • 手写一个CommonJS打包工具(一)
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 新手搭建网站的主要流程
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #AngularJS#$sce.trustAsResourceUrl
  • #define、const、typedef的差别
  • (WSI分类)WSI分类文献小综述 2024
  • (阿里云万网)-域名注册购买实名流程
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (十一)图像的罗伯特梯度锐化
  • (转)使用VMware vSphere标准交换机设置网络连接
  • ***监测系统的构建(chkrootkit )
  • .apk文件,IIS不支持下载解决
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET CLR基本术语
  • .Net中间语言BeforeFieldInit
  • @Import注解详解
  • @javax.ws.rs Webservice注解
  • @staticmethod和@classmethod的作用与区别
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [.NET]桃源网络硬盘 v7.4
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [ANT] 项目中应用ANT
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [C#]扩展方法