神经网络 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 Finput = 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 SummaryWriterdataset = 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 xtudui = Tudui()
print(tudui)writer = SummaryWriter('./logs')
step = 0
for data in dataloader:imgs, targets = dataoutputs = 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 += 1writer.close()

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

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

相关文章

Linux日志服务rsyslog深度解析(上)

🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、日志在Linux系统中的作用 2、rsyslog历史背景 …

保姆级讲解 FTP服务器的搭建、配置与管理

本来目录很长的 因为感觉不太美观 所以小标题都删掉了 本文介绍了 本地用户的FTP服务器搭建实例匿名用户的FTP服务器搭建实例虚拟用户的FTP服务器搭建实例企业常见类型搭建实验 配置与管理FTP服务器 配置与管理FTP服务器一、FTP相关知识二、项目设计与准备三、项目实施四、认识…

MyBatisPlus——入门到进阶

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。🍎个人主页:Meteors.的博客💞当前专栏:知识分享、知识备份✨特色专栏: 知识分享…

【GIS教程】土地利用转移矩阵

随着科技社会的不断进步,人类活动对地理环境的影响与塑造日益明显,土地不断的侵蚀与改变也导致一系列的环境问题日益突出。土地利用/覆盖(LUCC)作为全球环境变化研究的重点问题为越来越多的国际研究机构所重视,研究它的…

Day25 首页待办事项及备忘录添加功能

​ 本章节,完成首页待办事项及备忘录添加功能 一.修改待办事项和备忘录逻辑处理类,即AddMemoViewModel和AddTodoViewModel 在 AddMemoViewModel逻辑处理类中,为了支持与其关联的View视图文件的数据绑定,需要定义一个与视图文件相匹配的实体类 Model。这个Model将包含 View中…

图像算法---自动对焦AF

一,CDAF反差对焦原理 CDAF,全称Contrast Detection Auto Focus,即反差式对焦或对比度检测自动对焦,是一种广泛应用于入门级数码相机和相机模块化智能手机上的自动对焦技术。以下是关于CDAF反差对焦的详细介绍: 工作原…

每日AI资讯-20240606

智普AI推出全新开源大模型GLM-4-9B 智谱AI日前推出全新开源模型GLM-4-9B,该尺寸模型首次具备多模态能力。据了解,GLM-4-9B,最高支持1M/约两百万字上下文输入,相当于2本《红楼梦》或125篇论文的长度。性能上,GLM-4-9B函…

《手把手教你》系列练习篇之13-python+ selenium自动化测试 -压轴篇(详细教程)

1. 简介 “压轴”原本是戏曲名词,指一场折子戏演出的倒数第二个剧目。在现代社会中有很多应用,比如“压轴戏”,但压轴也是人们知识的一个盲区。“压轴”本意是指倒数第二个节目,而不是人们常说的倒数第一个,倒数第一个…

苗情生态自动监测站

TH-MQ1在现代农业发展中,苗情生态自动监测站的应用已经变得日益重要。这种技术不仅为农业生产提供了实时的数据支持,还通过精准监测和科学决策,提高了农业生产的效率和质量。 首先,苗情生态自动监测站的优势在于其能够实现精准监…

全流程透明双语大语言模型MAP-Neo,4.5T 高质量数据训练

前言 近年来,大语言模型 (LLM) 已经成为人工智能领域最热门的研究方向之一,并在各种任务中展现出前所未有的性能。然而,由于商业利益的驱动,许多最具竞争力的模型,例如 GPT、Gemini 和 Claude,其训练细节和…

读书笔记-《软件定义安全》之一:SDN和NFV:下一代网络的变革

第1章 SDN和NFV:下一代网络的变革 1.什么是SDN和NFV 1.1 SDN/NFV的体系结构 SDN SDN的体系结构可以分为3层: 基础设施层由经过资源抽象的网络设备组成,仅实现网络转发等数据平面的功能,不包含或仅包含有限的控制平面的功能。…

Unity Magica Cloth2 使用教程

视频教程 参考文章 前提: 找到角色的模型 模之屋,我这里准备了转好FBX格式的吟霖模型点击自取【源自 模之屋】 角色舞蹈动画 点击下载【源自 Mixamo】 导入Unity【如何将原神的角色导入Unity】 三渲二 (必须是2022.3LTS和URP项目) Magica Cloth2 头…

Mybatis05-一对多和多对一处理

多对一和一对多 多对一 多对一的理解: 多个学生对应一个老师 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师! 结果映射(resultMap): association 一个复杂类型的关联&…

在线Logo背景去除:pixian.ai

文章目录 简介特色 简介 pixian.ai是一款智能图片背景去除工具,进入网页后,会非常醒目地提示你准备【Free】还是【Paid】,这点就非常好,不向有一些网站,主打免费使用,但时不时弹出“免费注册”&#xff0c…

Python 连接 MySQL 及 SQL增删改查(主要使用sqlalchemy)

目录 一、环境 二、MySQL的连接和使用 2.1方式一:sql为主 2.1.1创建连接 2.1.2 表结构 2.1.3 新增数据 ​编辑 2.1.4 查看数据 ​编辑 2.1.5 修改数据 2.1.6 删除数据 2.2方式二:orm对象关系映射 2.2.1 mysql连接 2.2.2 创建表 2.2.3 新增…

解锁机器学习的无限可能:深入探究scikit-learn的强大功能

解锁机器学习的无限可能:深入探究scikit-learn的强大功能 第一部分:背景和功能介绍 在数据科学和机器学习领域,scikit-learn(简称sklearn)是一个广泛使用的Python库。它提供了简单高效的工具用于数据挖掘和数据分析&a…

【Python短期内快速掌握学习人工智能知识能力】:从零到入门的NLP学习秘籍

⭐️我叫忆_恒心,一名喜欢书写博客的研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支…

Echarts 在折线图的指定位置绘制一个图标展示

文章目录 需求分析需求 在线段交汇处用一个六边形图标展示 分析 可以使用 markPoint 和 symbol 属性来实现。这是一个更简单和更标准的方法来添加标记点在运行下述代码后,你将在浏览器中看到一个折线图,其中在 [3, 35] (即图表中第四个数据点 Thu 的 y 值为 35 的位置)处…

Java反射Reflect机制详解

文章目录 引言反射的基本概念反射基本原理反射应用场景反射基本使用获取类的Class对象获取构造方法并实例化对象获取和调用方法获取和修改字段反射工具类 反射源码解读获取Class对象的源码调用方法的源码 反射优缺点优点缺点 为什么需要反射总结 引言 Java反射是Java语言中的一…

【干货】视频文件抽帧(opencv和ffmpeg方式对比)

1 废话不多说,直接上代码 opencv方式 import time import subprocess import cv2, os from math import ceildef extract_frames_opencv(video_path, output_folder, frame_rate1):"""使用 OpenCV 从视频中抽取每秒指定帧数的帧,并保存到指定文件夹…