神经网络 torch.nn---Convolution Layers

torch.nn — PyTorch 2.3 documentation

torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io)

torch.nn和torch.nn.functional的区别

  • torch.nn是对torch.nn.functional的一个封装,让使用torch.nn.functional里面的包的时候更加方便

  • torch.nn包含了torch.nn.functional,打个比方,torch.nn.functional相当于开车的时候齿轮的运转,torch.nn相当于把车里的齿轮都封装好了,为我们提供一个方向盘

  • 如果只是简单应用,会torch.nn就好了。但要细致了解卷积操作,需要深入了解torch.nn.functional

  • 打开torch.nn.functional的官方文档,可以看到许多跟卷积相关的操作:torch.nn.functional — PyTorch 2.3 documentation

torch.nn中Convolution Layers 卷积层

  1. 一维卷积层 torch.nn.Conv1d
  2. 二维卷积层 torch.nn.Conv2d
  3. 三维卷积层 torch.nn.Conv3d

一维卷积层 torch.nn.Conv1d

class torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

一维卷积层,输入的尺度是(N, C_in,L),输出尺度( N,C_out,L_out)的计算方式:

说明

  • bigotimes: 表示相关系数计算
  • stride: 控制相关系数的计算步长
  • dilation: 用于控制内核点之间的距离,详细描述在这里
  • groups: 控制输入和输出之间的连接, group=1,输出是所有的输入的卷积;group=2,此时相当于有并排的两个卷积层,每个卷积层计算输入通道的一半,并且产生的输出是输出通道的一半,随后将这两个输出连接起来。

Parameters:

  • in_channels(int) – 输入信号的通道
  • out_channels(int) – 卷积产生的通道
  • kerner_size(int or tuple) - 卷积核的尺寸
  • stride(int or tupleoptional) - 卷积步长
  • padding (int or tupleoptional)- 输入的每一条边补充0的层数
  • dilation(int or tuple, `optional``) – 卷积核元素之间的间距
  • groups(intoptional) – 从输入通道到输出通道的阻塞连接数
  • bias(booloptional) - 如果bias=True,添加偏置

shape:
输入: (N,C_in,L_in)
输出: (N,C_out,L_out)
输入输出的计算方式:

变量:
weight(tensor) - 卷积的权重,大小是(out_channelsin_channelskernel_size)
bias(tensor) - 卷积的偏置系数,大小是(out_channel

二维卷积层

1、torch.nn.functional.conv2d 

torch.nn.functional.conv2d(inputweightbias=Nonestride=1padding=0dilation=1groups=1)

对几个输入平面组成的输入信号应用2D卷积。

参数:

  • input: 输入,数据类型为tensor,形状尺寸规定为:(minibatch, 几个通道(in_channels), 高, 宽)

  • weight: 权重。更专业地来说可以叫卷积核,形状尺寸规定为:(输出的通道(out_channel), in_channels/groups(groups一般取1), 高kH, 宽kW)

  • bias: 偏置。可选偏置张量 (out_channels) 

  • strids: 步幅。卷积核的步长,可以是单个数字或一个元组 (sh x sw)

  • padding: 填充。默认为1 - padding – 输入上隐含零填充。可以是单个数字或元组。

  • 默认值:0 - groups – 将输入分成组,in_channels应该被组数除尽

举例讲解参数strids

输入一个5×5的图像,其中的数字代表在每个像素中的颜色显示。卷积核设置为3×3的大小。

  • strids参数的输入格式是单个数或者形式为 (sH,sW) 的元组,可以理解成:比如输入单个数:strids=1,每次卷积核在图像中向上下或左右移1位;如果输入strids=(2,3),那么每次卷积核在图像中左右移动(横向移动)时,是移动2位,在图像中上下移动(纵向移动)时,是移动3位。
  • 本例设置strids=1

第一次移位:

  • 基于上述的假设,在做卷积的过程中,需要将卷积核将图像的前三行和前三列进行匹配:

  • 在匹配过后,进行卷积计算对应位相乘然后相加,即

  • 上面的得出的10可以赋值给矩阵,然后作为一个输出

 之后卷积核可以在图像中进行一个移位,可以向旁边走1位或2位,如下图(向右走2位)。具体走多少位由strids参数决定,比如strids=2,那就是走2位。本例设置stride=1。

第二次移位:

  • 向右移动一位,进行卷积计算:

以此类推,走完整个图像,最后输出的矩阵如下图。这个矩阵是卷积后的输出

举例讲解参数padding

padding的作用是在输入图像的左右两边进行填充,padding的值决定填充的大小有多大,它的输入形式为一个整数或者一个元组 ( padH, padW ),其中,padH=高padW=宽默认padding=0,即不进行填充。

  • 仍输入上述的5×5的图像,并设置padding=1,那么输入图像将会变成下图,即图像的上下左右都会拓展一个像素,然后这些空的地方像素(里面填充的数据)都默认为0。

  • 按上面的顺序进行卷积计算,第一次移位时在左上角3×3的位置,卷积计算公式变为:

  • 以此类推,完成后面的卷积计算,并输出矩阵

程序代码
import torch
import torch.nn.functional as F

input = torch.tensor([[1, 2, 0, 3, 1],
                      [0, 1, 2, 3, 1],
                      [1, 2, 1, 0, 0],
                      [5, 2, 3, 1, 1],
                      [2, 1, 0, 1, 1]])

kernel = torch.tensor([[1, 2, 1],
                       [0, 1, 0],
                       [2, 1, 0]])

input = torch.reshape(input, (1, 1, 5, 5))
kernel = torch.reshape(kernel, (1, 1, 3, 3))

print(input.shape)
print(kernel.shape)

output = F.conv2d(input, kernel, stride=1)
print(output)

# Stride=2
output2 = F.conv2d(input, kernel, stride=2)
print(output2)

#  padding=1
output3 = F.conv2d(input, kernel, stride=1, padding=1)
print(output3)

运行结果

2、torch.nn.Conv2d

class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

Parameters:

  • in_channels(int) – 输入信号的通道。输入图像的通道数,彩色图像一般为3(RGB三通道)
  • out_channels(int) – 卷积产生的通道。产生的输出的通道数
  • kerner_size(int or tuple) - 卷积核的尺寸。一个数或者元组,定义卷积大小。如kernel_size=3,即定义了一个大小为3×3的卷积核;kernel_size=(1,2),即定义了一个大小为1×2的卷积核。
  • stride(int or tupleoptional) - 卷积步长。 默认为1,卷积核横向、纵向的步幅大小
  • padding(int or tupleoptional) - 默认为0,对图像边缘进行填充的范围
  • dilation(int or tupleoptional) – 卷积核元素之间的间距。默认为1,定义在卷积过程中,它的核之间的距离。这个我们称之为空洞卷积,但不常用。
  • groups(intoptional) – 从输入通道到输出通道的阻塞连接数。默认为1。分组卷积,一般都设置为1,很少有改动
  • bias(booloptional) - 默认为True。偏置,常年设置为True。代表卷积后的结果是否加减一个常数。

 二维卷积层, 输入的尺度是(N, C_in,H,W),输出尺度(N,C_out,H_out,W_out)

关于卷积操作,官方文档的解释如下:

图像输入输出尺寸转化计算公式

参数说明:

  • N: 图像的batch_size

  • C: 图像的通道数

  • H: 图像的高

  • W: 图像的宽

计算过程

shape:
input: (N,C_in,H_in,W_in)
output: (N,C_out,H_out,W_out)or(C_out,H_out,W_out)

看论文的时候,有些比如像padding这样的参数不知道,就可以用这条公式去进行推导

变量:
weight(tensor) - 卷积的权重,大小是(out_channelsin_channels,kernel_size)
bias(tensor) - 卷积的偏置系数,大小是(out_channel

参数kernel_size的说明
  • kernel_size主要是用来设置卷积核大小尺寸的,给定模型一个kernel_size,模型就可以据此生成相应尺寸的卷积核。

  • 卷积核中的参数从图像数据分布中采样计算得到的。

  • 卷积核中的参数会通过训练不断进行调整。

参数out_channel的说明
  • 如果输入图像in_channel=1,并且只有一个卷积核,那么对于卷积后产生的输出,其out_channel也为1
  • 如果输入图像in_channel=2,此时有两个卷积核,那么在卷积后将会输出两个矩阵,把这两个矩阵当作一个输出,此时out_channel=2
程序代码

使用CIFAR中的图像数据,对Conv2d进行讲解

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import Dataset, DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10(root='./dataset', train=False, transform=torchvision.transforms.ToTensor(),
                                       download=True)
dataloader = DataLoader(dataset, batch_size=64)

class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 3, stride=1, padding=0)

    def forward(self, x):
        x = self.conv1(x)
        return x

tudui = Tudui()
print(tudui)

writer = SummaryWriter('./logs')
step = 0
for data in dataloader:
    imgs, targets = data
    outputs = tudui(imgs)
    print(imgs.shape) # torch.Size([64, 3, 32, 32])
    print(outputs.shape) # torch.Size([64, 6, 30, 30])
    writer.add_images("input", imgs, step)
    # torch.Size([64, 6, 30, 30])   ->> [64, 3, 32, 32]
    output = torch.reshape(outputs, [-1, 3, 30, 30])#由于第一个值不知道是多少,所以写-1,它会根据后面的值去计算
    writer.add_images("output", output, step)
    step += 1

writer.close()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Promed Bioscience—高纯度胶原蛋白

Promed Bioscience——高纯度胶原蛋白供应商 专于研发,忠于质量,创新驱动 AXXORA 作为Enzo life sciences公司的子公司,是欧美最大的生命科学研究信息、服务、销售电子一站式服务平台之一,AXXORA精选欧洲四十多家优秀的生命科学研…

2.Rust自动生成文件解析

目录 一、生成目录解析二、生成文件解析2.1 Cargo.toml2.2 main函数解析 一、生成目录解析 先使用cargo clean命令删除所有生成的文件,下图显示了目录结构和 main.rs文件 使用cargo new testrust时自动创建出名为testrust的Rust项目。内部主要包含一个src的源码文…

问题:歌剧序曲是用什么曲式写成? #学习方法#其他#经验分享

问题:歌剧序曲是用什么曲式写成? A、贝多芬 B、海顿 C、肖邦 D、莫扎特 参考答案如图所示

AI重塑搜索和浏览器,360打造AIPC轻量化方案

6月6日,360AI新品发布会暨开发者沟通会在京举办,360集团发布全新360AI搜索、360AI浏览器,360集团创始人周鸿祎在现场使用360AI搜索为2024年高考语文作文押题。同时,“360AI甄选”平台及会员体系“360AI大会员”正式上线&#xff0…

S3Dlib | 太炫酷!所有3D图形它都可以绘制...

前言 一、「s3dlib」-Python中王炸3D绘图神器 二、可视化学习圈子是干什么的? 三、系统学习可视化 四、猜你喜欢 前言 我们的数据可视化课程已经上线啦!!目前课程的主要方向是 科研、统计、地理相关的学术性图形绘制方法,后续…

【论文速读】| BIOCODER:一个具有上下文实用知识的生物信息学代码生成基准测试

本次分享论文:BIOCODER: A Benchmark for Bioinformatics Code Generation with Contextual Pragmatic Knowledge 基本信息 原文作者:Xiangru Tang, Bill Qian, Rick Gao, Jiakang Chen, Xinyun Chen, Mark Gerstein 作者单位:耶鲁大学, Go…

【SpringBoot + Vue 尚庭公寓实战】租期管理接口实现(四)

【SpringBoot Vue 尚庭公寓实战】租期管理接口实现(四) 文章目录 【SpringBoot Vue 尚庭公寓实战】租期管理接口实现(四)1、查询全部租期列表2、保存或更新租期信息3、根据ID删除租期 租期管理共有三个接口,分别是 保…

HDFS的块汇报和块放置策略--从一次HDFS写文件故障开始(WIP)

文章目录 前言事故分析:代码解析BlockReport的调度和时机哪些Block会进行FBR或者IBRIBR所选定的BlockFBR所选定的Block 块放置策略详解之在上层寻找机器为文件添加块的基本流程块放置策略:选择机器为每个副本逐个寻找机器在指定范围内随机寻找简单看一下…

如何学习使用淘宝API?淘宝API运营场景

学习使用淘宝API涉及对其功能、分类、调用方法及实际应用的综合理解。下面按部分详细解释如何系统地学习和掌握淘宝API的使用: 淘宝API接口入门 了解淘宝开放平台:淘宝开放平台为开发者提供了一个可以与淘宝数据进行交互的平台,涵盖了丰富的A…

在当前页面拿到抽屉弹窗页面中从后端返回的值 #Vue3 #两个.vue页面之间传值问题

在当前页面拿到抽屉弹窗页面中从后端返回的值 #Vue3 #两个.vue页面之间传值问题 *解决方法一: 将抽屉弹窗里从后端返回得到的值缓存在浏览器中,在当前页面中从浏览器中获取该值。 (原理其实就是借助第三个盒子来传递一下值,太小学…

C#操作MySQL从入门到精通(12)——对查询结果进行计算

前言 我们有时候需要对查询到的数据进行一些计算,比如将两个列的数据拼接在一起,比如将两个列的数据进行相乘,Mysql中是支持这种操作的,下面我来详细介绍: 本篇文章测试使用的数据库如下: 1、将两个列的数据进行拼接 我们将姓名和年龄这两个列的数据进行拼接,如下:…

变压器绕线完成之后要做的事

1 调整感量:测主绕组电感量,通过磨气隙或垫气隙,测得感量没错以后,用胶带封装磁芯 2 测验同名端是否正确:两绕组首尾相连,测试连接后的总感量,是否比感量大的那个绕组还大。如果是,…

Apple开发者应用商店(AppStore)描述文件及ADHOC描述文件生成

创建AD HOC描述文件 1.选中Profiles,然后点击加号创建 2.创建已注册设备可安装描述文件 3.选择要注册的id 4.选择证书 5.选择设备 6.输入文件名,点击生成 7.生成成功,点击下载

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:大型机械智能预警系统

三一重工股份有限公司,是由三一集团创建于1994年,通过打破国人传统的“技术恐惧症”坚持自主创新迅速崛起。2011年7月,三一重工以215.84亿美元的市值荣登英国《金融时报》全球市值500强,是迄今唯一上榜的中国机械企业。2012年1月&…

Qsemaphore

Qsemaphore 实现 给while循环阻塞延时 基本思路就是: whlie循环里面 通过m_bthreadFlag&m_bStatus这两个标志位,判断是否进入while循环,再根据40行的acquire()来阻塞循环,因为定时器的槽函数…

YOLOv5车流量监测系统研究

一. YOLOv5算法详解 YOLOv5网络架构 上图展示了YOLOv5目标检测算法的整体框图。对于一个目标检测算法而言,我们通常可以将其划分为4个通用的模块,具体包括:输入端、基准网络、Neck网络与Head输出端,对应于上图中的4个红色模块。Y…

探索加密货币:打造Web3项目与企业的新篇章

本文来源香港Web3媒体:Techub News 在数字化浪潮席卷全球的今天,加密货币及Web3项目和企业正成为引领创新的重要力量。作为这一领域的观察者,Mark Beylin深入剖析了如何通过打造人们真正需要的代币,来推动Web3项目的成功与企业的蓬…

浅谈Spring MVC

文章目录 一、什么是 Spring MVC?1.1、MVC定义1.2、MVC 和 Spring MVC 的关系? 1.3、为什么要学习 Spring MVC?二、需要掌握Spring MVC的一些功能2.1 Spring MVC 的创建和连接功能实现2.2 Spring MVC 获取参数功能2.2.1、传递单个参数2.2.2、传递对象2.…

大漠插件7.2422

工具名称:大漠插件7.2422 /更新时间2024年6月2日 / v7.2422 1. 综合工具的图像编辑工具可以缩放窗口了 2. 增加AiFindPic AiFindPicEx AiFindPicMem AiFindPicMemEx AiEnableFindPicWindow 共5个接口 / 工具简介: 大漠 综合 插件 (dm.dll)采用vc6.0编写,识别速度超级…

北京崇文门中医医院贾英才与行业共进——第二届海峡两岸中西医结合肾脏病学术大会

第二届海峡两岸中西医结合肾脏病学术大会授牌仪式于2024年6月7号在北京前门国医堂举行。 第二届海峡两岸中西医结合肾脏病学术大会的主要议程可能包括以下内容: 学术讲座:来自海峡两岸的专家学者发表演讲,分享肾脏病防治、透析技术等方面的研…