Pytorch深度学习-----神经网络之卷积层用法详解

news2024/9/23 3:14:43

系列文章目录

PyTorch深度学习——Anaconda和PyTorch安装
Pytorch深度学习-----数据模块Dataset类
Pytorch深度学习------TensorBoard的使用
Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Compose,RandomCrop)
Pytorch深度学习------torchvision中dataset数据集的使用(CIFAR10)
Pytorch深度学习-----DataLoader的用法
Pytorch深度学习-----神经网络的基本骨架-nn.Module的使用
Pytorch深度学习-----神经网络的卷积操作


文章目录

  • 系列文章目录
  • 一、卷积层是什么?
  • 二、torch.nn.Conv2d参数介绍
  • 三、卷积层操作实践
    • 1.自定义卷积,查看创建的卷积参数
    • 2.对比卷积前后的图片shape
    • 3.Tensorboard可视化显示效果


一、卷积层是什么?

卷积层是CNN(Convolutional Neural Networks)中的基本网络层,主要用于对图像进行特征提取操作。关于卷积操作实例也可参考上一篇文章-卷积操作。

官网对卷积的描述如下:
在这里插入图片描述
其中Conv1d就表示一维卷积,2d为后缀就表示二维卷积,下面主要以二维卷积Conv2d为例。

二、torch.nn.Conv2d参数介绍

附上官网对参数的解释:

Parameters:
in_channels (int) – Number of channels in the input image

out_channels (int) – Number of channels produced by the convolution

kernel_size (int or tuple) – Size of the convolving kernel

stride (int or tuple, optional) – Stride of the convolution. Default: 1

padding (int, tuple or str, optional) – Padding added to all four sides of the input. Default: 0

padding_mode (str, optional)'zeros', 'reflect', 'replicate' or 'circular'. Default: 'zeros'

dilation (int or tuple, optional) – Spacing between kernel elements. Default: 1

groups (int, optional) – Number of blocked connections from input channels to output channels. Default: 1

bias (bool, optional) – If True, adds a learnable bias to the output. Default: True

从上述可知,总共有9个参数,具体解释如下:
in_channels:表示输入的图片通道数目。
out_channels:表示输出的图片通道数目。
kernel_size:表示卷积核的大小,当卷积是正方形的时候,只需要一个整数边长即可,卷积不是正方形,要输入一个元组表示高和宽。
stride:表示每次卷积核移动的步长值。
padding:表示是否添加边界,一旦设置就是四周都添加。在原始的行列基础上,行增加2行,列增加2列。
dilation:表示控制卷积核之间的间距。
groups:表示控制输入和输出之间的连接。
bias:表示是否将一个 bias 增加到输出。
padding_mode:表示接收’zeros’, ‘reflect’, ‘replicate’ or ‘circular’. Default: ‘zeros’,默认是’zeros’,即默认在padding操作时,在外一圈是填充的0。
注意:常用的参数为:in_channels ,out_channels ,kernel_size ,stride ,padding,且kernel_size,stride,padding,dilation这几个可以使一个整数或一个元组,如果是元组的形式就是代表高度和宽度,如果是一个值就是代表高度和宽度是相等的。

三、卷积层操作实践

下面代码以CIFAR10数据集为例进行实践

1.自定义卷积,查看创建的卷积参数

import torch
import torchvision
from torch.utils.data import DataLoader

# 准备数据集
dataset = torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 加载数据集,每次从数据集中取64
dataloader = DataLoader(dataset,batch_size=64)
# 创建自己的神经网络类
class LGL(torch.nn.Module):
    def __init__(self):
        super().__init__()
        # 即输入通道设定为RGB3层,输出通道设定为6,卷积核大小为3,步长设定1,不进行填充
        self.conv2 = torch.nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

    def forward(self,x):
        return self.conv2(x)
print(LGL())  # 打印创建的卷积参数

在这里插入图片描述
从输出结果可知,输入通道为3,输出通道为6,卷积核结构为3×3,步长为1。

2.对比卷积前后的图片shape

import torch
import torchvision
from torch.utils.data import DataLoader

# 准备数据集
dataset = torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 加载数据集,每次从数据集中取64
dataloader = DataLoader(dataset,batch_size=64)
# 创建自己的神经网络类
class LGL(torch.nn.Module):
    def __init__(self):
        super(LGL,self).__init__()
        # 即输入通道设定为RGB3层,输出通道设定为6,卷积核大小为3,步长设定1,不进行填充
        self.conv2 = torch.nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

    def forward(self,x):
        return self.conv2(x)
# print(LGL())  # 打印创建的卷积参数
# 输出卷积前后的图片大小
for data in dataloader:
    img, target = data
    # 卷积前
    print(img.shape)
    # 卷积后
    outputs = LGL().conv2(img)
    print(outputs.shape)

在这里插入图片描述
torch.Size([64, 3, 32, 32]) 表示一次性读64张图片,原始图像为3通道,大小为3232
torch.Size([64, 6, 30, 30]) 表示一次性读64张图片,原始图像为6通道,大小为30
30
为什么大小会变成30*30?
有官网关于h和w的计算公式如下图所示:
在这里插入图片描述
得:
输入图像是32×32,即h=30,w=30,
卷积尺寸是3×3,即kernel_size=3
没有填充,即padding=0
控制卷积核之间的间距也没有,即dilation=0
步长为1,即stride=1
于是输出图像的尺寸为:32-3+1=30,也就是30×30

3.Tensorboard可视化显示效果

代码如下:

import torch
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# 准备数据集
dataset = torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 加载数据集,每次从数据集中取64
dataloader = DataLoader(dataset,batch_size=64)
# 创建自己的神经网络类
class LGL(torch.nn.Module):
    def __init__(self):
        super(LGL,self).__init__()
        # 即输入通道设定为RGB3层,输出通道设定为6,卷积核大小为3,步长设定1,不进行填充
        self.conv2 = torch.nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

    def forward(self,x):
        return self.conv2(x)
# print(LGL())  # 打印创建的卷积参数
# 输出卷积前后的图片大小
writer = SummaryWriter("logs")
step=0
for data in dataloader:
    img, target = data
    # 卷积前
    print(img.shape)
    writer.add_images("input",img,step)
    # 卷积后
    outputs = LGL().conv2(img)
    writer.add_images("output",outputs,step)
    step = step+1
    print(outputs.shape)
writer.close()

结果报错:
在这里插入图片描述
原因如下:
因为由前面可以知道,经过卷积后图片的通道变为了6,此时在Tensorboard可视化中无法显示通道为6的图片,所以需要进行reshape进行重新设定。
outputs = torch.reshape(outputs,(-1,3,30,30)) 将批次设定为-1,此时程序会自动匹配批次大小。
修改后代码如下:

import torch
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# 准备数据集
dataset = torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 加载数据集,每次从数据集中取64
dataloader = DataLoader(dataset,batch_size=64)
# 创建自己的神经网络类
class LGL(torch.nn.Module):
    def __init__(self):
        super(LGL,self).__init__()
        # 即输入通道设定为RGB3层,输出通道设定为6,卷积核大小为3,步长设定1,不进行填充
        self.conv2 = torch.nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

    def forward(self,x):
        return self.conv2(x)
# print(LGL())  # 打印创建的卷积参数
# 输出卷积前后的图片大小
writer = SummaryWriter("logs")
step=0
for data in dataloader:
    img, target = data
    # 卷积前
    print(img.shape)
    writer.add_images("input",img,step)
    # 卷积后
    outputs = LGL().conv2(img)
    outputs=outputs.reshape(-1,3,30,30)
    writer.add_images("output",outputs,step)
    step = step+1
    print(outputs.shape)
writer.close()

Tensorboard可视化显示效果如下:
在这里插入图片描述

声明:本篇文章未经许可,谢绝转载。

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

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

相关文章

交通运输安全大数据分析解决方案

当前运输市场竞争激烈,道路运输企业受传统经营观念影响,企业管理者安全意识淡薄,从业人员规范化、流程化的管理水平较低,导致制度规范在落实过程中未能有效监督与管理,执行过程中出现较严重的偏差,其营运车…

【C++入门到精通】C++入门 —— 类和对象(初始化列表、Static成员、友元、内部类、匿名对象)

目录 一、初始化列表 ⭕初始化列表概念 ⭕初始化列表的优点 ⭕使用场景 ⭕explicit关键字 二、Static成员 ⭕Static成员概念 🔴静态数据成员: 🔴静态函数成员: ⭕使用静态成员的优点 ⭕使用静态成员的注意事项 三、友…

国际化警告Fall back to translate ‘creator‘ key with ‘zn‘ locale.

发现是自己粗心写错了一个单词 这个需要改成zh

OC对象内存布局与isa指针

文章目录 一、Objective-C的本质二、一个objc对象如何进行内存布局?考虑父类的情况三、一个objc对象的isa指针指向什么?有什么作用四、objc对象的类方法和实例方法有什么本质区别和联系? 一、Objective-C的本质 Objc的底层实现是C\C代码&…

微信小程序tab加列表demo

一、效果 代码复制即可使用,记得把图标替换成个人工程项目图片。 微信小程序开发经常会遇到各种各样的页面组合,本demo为list列表与tab组合,代码如下: 二、json代码 {"usingComponents": {},"navigationStyle&q…

goctl template一定制化服务配置生成

官网介绍: 模板(Template)是数据驱动生成的基础,所有的代码(rest api、rpc、model、docker、kube)生成都会依赖模板, 默认情况下,模板生成器会选择内存中的模板进行生成&#xff0c…

easyui实用点

easyui实用点 1.下拉框(input框只能选不能手动输入编辑) data-options"editable:false"//不可编辑2.日期框,下拉框,文本框等class class"easyui-datebox"//不带时分秒 class"easyui-datetimebox"…

口碑+丨香港邮政联合极智嘉建立全港首个机器人邮包分拣系统

近日,香港邮政与全球仓储机器人引领者极智嘉(Geek)在其中央邮件中心联手建立全港首个机器人包裹分拣系统。该全新系统采用极智嘉分运结合解决方案,每小时可处理达1,000个邮包,助力香港邮政利用创新科技简化邮包分拣流程、提升工作效率&#x…

allwinner 全志RS485调试,GPIO状态与万用表测量不同

全志RS485调试 思路:UART驱动中已经将485流控功能加进去了,所以我们只需要根据硬件原理图配置一下485脚的GPIO就行了。 硬件原理图: 将UART3 UART4的RTS脚配置为485流控脚就行, RX和TX不需要配置,在pinctrol已经配置好…

热风梳C22.2 NO.3亚马逊加拿大审核标准

加拿大是目前亚马逊所有站点中,商业规模大、发展势头迅猛的站点之一。亚马逊加拿大站每月吸引近1600万访客。其优势在于在加拿大,目前平台的竞争较小,商家容易出单。既然加拿大站有这么多优势,那产品上架需要有哪些检测认证合规方…

[MAUI 项目实战] 手势控制音乐播放器: 手势交互

原理 定义一个拖拽物,和它拖拽的目标,拖拽物可以理解为一个平底锅(pan),拖拽目标是一个坑(pit),当拖拽物进入坑时,拖拽物就会被吸附在坑里。可以脑补一下下图&#xff1…

腾讯地图点标记加调用

先看效果 PHP代码 <?phpnamespace kds_addons\edata\controller;use think\addons\Controller; use think\Db;class Maps extends Controller {// 经纬度计算面积function calculate_area($points){$totalArea 0;$numPoints count($points);if ($numPoints > 2) {…

Qt、Qt Creator下载、安装

一、Qt、Qtcreator简介 Qt是一个跨平台应用开发框架。 Qt Creator是一个跨平台的集成开发环境&#xff08;IDE&#xff09;&#xff0c;集成了Qt所提供的功能&#xff0c;可以单独下载使用&#xff0c;也可以结合Qt组合使用。 二、下载 下载地址&#xff1a;https://downloa…

2023 ChinaJoy | 移远通信携手高通,共创数字娱乐新体验

当前&#xff0c; 5G、AI、大数据等智能创新技术正以惊人的速度蔓延至越来越多的领域&#xff0c;从智能家居、智能交通、智能医疗到智能制造&#xff0c;改变了我们的工作和生活方式。 而在数字娱乐领域&#xff0c;智能创新技术也展现出了巨大的潜力。作为全球领先的物联网整…

13.5.5 【Linux】其他相关文件

除了前一小节谈到的 /etc/securetty 会影响到 root 可登陆的安全终端机&#xff0c; /etc/nologin 会影响到一般使用者是否能够登陆的功能之外&#xff0c;我们也知道 PAM 相关的配置文件在 /etc/pam.d &#xff0c;说明文档在 /usr/share/doc/pam-&#xff08;版本&#xff09…

牛客网Verilog刷题——VL47

牛客网Verilog刷题——VL47 题目答案 题目 实现4bit位宽的格雷码计数器。 电路的接口如下图所示&#xff1a; 输入输出描述&#xff1a; 信号类型输入/输出位宽描述clkwireIntput1时钟信号rst_nwireIntput1异步复位信号&#xff0c;低电平有效gray_outregOutput4输出格雷码计数…

管理ceph集群

文章目录 ceph的常用命令查看集群状态查看pg的状态查看mon节点状态查看osd的通用命令查看osd的容量查看osd池写入文件测试查看池的属性查看文件映射过程 添加磁盘删除磁盘 ceph的常用命令 查看集群状态 ceph osd pool application enable pool-name rbd #将池启用rbd功能 ceph…

Java集合框架-List、Set、Map

一、Java集合框架概述&#xff1a; 1.1 Collection接口继承树 JDK提供的集合API位于java.util包内。 Map接口继承树 1.2 Collection接口方法 Collection 接口 Collection 接口是 List、Set 和 Queue 接口的父接口&#xff0c;该接口里定义的方法既可用于操作 Set 集合&#…

Matlab进阶绘图第24期—悬浮柱状图

悬浮柱状图是一种特殊的柱状图。 与常规柱状图相比&#xff0c;悬浮柱状图可以通过悬浮的矩形展示最小值到最大值的范围&#xff08;或其他范围表达&#xff09;&#xff0c;因此在多个领域得到应用。 本文使用自己制作的Floatingbar小工具进行悬浮柱状图的绘制&#xff0c;先…

【Linux】Linux项目自动化构建工具 make/Makefile

目录 1. Makefile 是如何工作的 2. 依赖关系与依赖方法 3. .PHONY 4. Makefile 的特殊符号 写在最后&#xff1a; 1. Makefile 是如何工作的 make 是一个命令。 Makefile 是一个文件&#xff0c;当前目录下的一个文件。 我们先来上手写一个简单的 Makefile 文件&#…