【学习笔记】【Pytorch】七、卷积层

news2025/1/13 15:31:38

【学习笔记】【Pytorch】七、卷积层

  • 学习地址
  • 主要内容
    • 一、卷积操作示例
    • 二、Tensor(张量)是什么?
    • 三、functional.conv2d函数的使用
      • 1.使用说明
      • 2.代码实现
    • 四、torch.Tensor与torch.tensor区别
    • 五、nn.Conv2d类的使用
      • 1.使用说明
      • 2.代码实现
    • 六、卷积公式

学习地址

PyTorch深度学习快速入门教程【小土堆】.

主要内容

一、卷积操作示例
二、Tensor(张量)是什么?
三、functional.conv2d函数的使用
作用:对几个输入平面组成的输入信号应用2D卷积。
四、torch.Tensortorch.tensor区别
作用:图片尺寸缩放。
五、nn.Conv2d类的使用
作用:二维卷积层, 输入的尺度是(N, C_in,H,W),输出尺度(N,C_out,H_out,W_out)。
六、卷积公式

一、卷积操作示例

在这里插入图片描述

:卷积核的大小是自己设置的,初始参数是自定义的,卷积核上每个位置相当于一个权重w,比如一个3*3的卷积核,就是9个w,训练网络的目的就是学习这9个权值。

二、Tensor(张量)是什么?

参考

  • 什么是张量?

总结

  • 我们通常需要处理的数据有零维的(单纯的一个数字)、一维的(数组)、二维的(矩阵)、三维的(空间矩阵)、还有很多维的。Pytorch为了把这些各种维统一起来,所以起名叫张量
  • 标量视为零阶张量,矢量视为一阶张量,矩阵视为二阶张量。多一个维度,我们就多加一个[]。例如三维张量,torch.tensor([[[9,1,8],[6,7,5],[3,4,2]],[[2,9,1],[8,6,7],[5,3,4]],[[1,5,9],[7,2,6],[4,8,3]]])。
  • PyTorch中的Tensor支持超过一百种操作,包括转置、索引、切片、数学运算(加法、减法、点乘…)、线性代数、随机数等等,总之,凡是你能想到的操作,在pytorch里都有对应的方法去完成。PyTorch学习笔记(二):Tensor操作。

三、functional.conv2d函数的使用

import torch.nn.functional as F

1.使用说明

【实例化】torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)

  • 作用:对几个输入平面组成的输入信号应用2D卷积。
  • input: 输入张量, (minibatch, in_channels, iH, iW),即tensor_data.shape 应该有四个参数。
    • minibatch -即batch_size,每个batch(批次)要加载多少个样本
    • in_channels - 输入通道数
    • iH、iW - 数据形状
  • weight – 卷积核(过滤器)张量 ,(out_channels, in_channels/groups 整除, kH, kW) ,即tensor_data.shape 应该有四个参数。
  • bias – 可选偏置张量 (out_channels)
  • stride – 卷积核的步长,左移和下移的步长,可以是单个数字或一个元组 (sh x sw)。默认为1。
  • padding – 输入上隐含零填充。可以是单个数字或元组。 默认值:0。
  • dilation – 核元素之间的间距。默认值:1。
  • groups – 将输入分成组,in_channels应该被组数除尽。默认值:1。

2.代码实现

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]])

# 3*3的卷积核,二维张量
kernel =torch.tensor([[1, 2, 1],
                     [0, 1, 0],
                     [2, 1, 0]])

# 转化为四维张量,通道数是1,batch_size(数据个数)的大小为1,数据维度是5*5
input = torch.reshape(input, (1, 1, 5, 5))
# 转化为四维张量,通道数是1,batch_size(数据个数)的大小为1,数据维度是5*5
kernel = torch.reshape(kernel, (1, 1, 3, 3))

# print(input.shape) == print(input.size())
print(input.shape)  # torch.Size([1, 1, 5, 5])
print(kernel.size())  # torch.Size([1, 1, 3, 3])

# 上下步进为1的卷积操作
output = F.conv2d(input, kernel, stride=1)
print('\n', output)  # 四维张量

# 上下步进为2的卷积操作
output = F.conv2d(input, kernel, stride=2)
print('\n', output)  # 四维张量

# 上下步进为1、启用 1层0填充卷积
output = F.conv2d(input, kernel, stride=1, padding=1)
print('\n', output)  # 四维张量

控制台输出

torch.Size([1, 1, 5, 5])
torch.Size([1, 1, 3, 3])

 tensor([[[[10, 12, 12],
          [18, 16, 16],
          [13,  9,  3]]]])

 tensor([[[[10, 12],
          [13,  3]]]])

 tensor([[[[ 1,  3,  4, 10,  8],
          [ 5, 10, 12, 12,  6],
          [ 7, 18, 16, 16,  8],
          [11, 13,  9,  3,  4],
          [14, 13,  9,  7,  4]]]])

总结
将二维张量转化为四维张量才能满足torch.nn.functional.conv2d函数的输入要求,转化结果也就是添加了两个[ ]。

四、torch.Tensor与torch.tensor区别

参考
torch.Tensor()与torch.tensor()
总结

  • torch.Tensor()是python类,调用torch.Tensor([1,2, 3, 4, 5])来构造一个tensor的时候,会调用Tensor类的构造函数,生成一个单精度浮点类型的张量。它不能指定数据类型,除非转成一个已知数据类型的张量,使用type_as(tesnor)将张量转换为给定类型的张量。

  • torch.tensor()是python的函数,其中data可以是list,tuple,NumPy,ndarray等其他类型,torch.tensor(data)会从data中的数据部分做拷贝(而不是直接引用),根据原始数据类型生成相应的torch.LongTensor torch.FloatTensor和torch.DoubleTensor。通过设置dtype的函数参数值,生成对应类型的张量。

五、nn.Conv2d类的使用

from torch.nn import Conv2d

在这里插入图片描述

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

1.使用说明

【实例化】Conv2d(
in_channels: int,
out_channels: int,
kernel_size: _size_2_t,
stride: _size_2_t = 1,
padding: Union[str, _size_2_t] = 0,
dilation: _size_2_t = 1,
groups: int = 1,
bias: bool = True,
padding_mode: str = ‘zeros’, # TODO: refine this type
device=None,
dtype=None
)

  • 作用:创建一个二维卷积层,的实例,卷积核初始参数随机初始化。
  • in_channels(int) – 输入信号的通道
    out_channels(int) – 卷积产生的通道
    kerner_size(int or tuple) - 卷积核的尺寸
    stride(int or tuple, optional) - 卷积步长
    padding(int or tuple, optional) - 输入的每一条边补充0的层数
    dilation(int or tuple, optional) – 卷积核元素之间的间距
    groups(int, optional) – 从输入通道到输出通道的阻塞连接数
    bias(bool, optional) - 如果bias=True,添加偏置
  • 例子:
# 用conv1变量存储一个 Conv2d 实例
# in_channels表示3通道图片数据
 # out_channels表示输出通道数(这里3通道变6通道,一般是2个卷积核进行卷积得到的)
conv1 = Conv2d(in_channels=3, out_channels=6,
                            kernel_size=3, stride=1, padding=0)
  • 注:in_channels,彩色就是3,灰度就是1。

【_call_】conv1(x)
例子:

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

在这里插入图片描述
在这里插入图片描述

2.代码实现

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


class Model(nn.Module):
    def __init__(self):
        super().__init__()  # 父类参数初始化
        # 用conv1变量存储一个 Conv2d 实例
        # in_channels表示3通道图片数据
        # out_channels表示输出通道数(这里3通道变6通道,一般是2个卷积核进行卷积得到的)
        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 x




dataset = torchvision.datasets.CIFAR10(root="./dataset", train=False,
                                       transform=torchvision.transforms.ToTensor(),
                                       download=True)  # 创建一个 CIFAR10 实例
dataloader = DataLoader(dataset=dataset, batch_size=64)  # 创建一个 DataLoader 实例

nn_model = Model()  # 创建一个 Model 实例
# print(model)
# Model((conv1): Conv2d(3, 6, kernel_size=(3, 3), stride=(1, 1)))

writer = SummaryWriter("./dataloader_logs")  # 创建一个SummaryWriter实例
step = 0
for data in dataloader:
    imgs, targets = data
    output = nn_model(imgs)
    print(imgs.size())
    # torch.Size([64, 3, 32, 32]) batch_size=64,in_channels=3,图片尺寸
    print(output.shape)
    # torch.Size([64, 6, 30, 30]) batch_size=64,out_channels=6,图片尺寸

    writer.add_images("input", imgs, step)

    # 因为不能显示6通道的图片,所以使用reshape()转化为3通道图片,-1表示自动设置batch_size
    output = torch.reshape(output, (-1, 3, 30, 30))
    writer.add_images("output", output, step)

    step += 1


# tensorboard命令:tensorboard --logdir=dataloader_logs --port=6007

输出

Files already downloaded and verified
torch.Size([64, 3, 32, 32])
torch.Size([64, 6, 30, 30])
torch.Size([64, 3, 32, 32])
torch.Size([64, 6, 30, 30])
....
....

TensorBoard输出
在这里插入图片描述
output的batch_size变成了2*64=128。

六、卷积公式

参考:torch.nn.Conv2d
在这里插入图片描述

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

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

相关文章

C/C++ noexcept NRVO

为什么需要noexcept为了说明为什么需要noexcept&#xff0c;我们还是从一个例子出发&#xff0c;我们定义MyClass类&#xff0c;并且我们先不对MyClass类的移动构造函数使用noexceptclass MyClass { public:MyClass(){}MyClass(const MyClass& lValue){std::cout << …

使用语雀绘制 Java 中六大 UML 类图

目录 下载语雀 泛化关系&#xff08;Generalization&#xff09; 实现关系&#xff08;Realization&#xff09; 关联关系&#xff08;Association&#xff09; 依赖关系&#xff08;Dependency&#xff09; 聚合关系&#xff08;Aggregation&#xff09; 组合关系&…

【Python学习】列表和元组

前言 前四天每天更新了小白看的基础教程 今天开始就更新一下&#xff0c;深入一点的知识点吧 还是老话&#xff1a;刚接触python的宝子可以点击文章末尾名片进行交流学习的哦 什么是列表和元组 列表是动态的&#xff0c;长度大小不固定&#xff0c;可以随意地增加、删减或…

【软件测试】软件测试基础2

1. 软件测试的生命周期 软件测试的生命周期&#xff1a; 需求分析→测试计划→ 测试设计、测试开发→ 测试执行→ 测试评估 ● 需求分析&#xff1a;站在用户的角度&#xff1a;查看需求逻辑是否正确&#xff0c;是否符合用户的需求和行为习惯&#xff1b;站在开发人员的角度&…

Nexus使用

环境 apache-maven-3.5.4nexus-3.38.1-01 Android开发中常用的maven代理地址 阿里云&#xff1a;http://maven.aliyun.com/nexus/content/groups/public/google&#xff1a;https://dl.google.com/dl/android/maven2/jcenter&#xff1a;https://jcenter.bintray.com/mavenC…

Leetcode:236. 二叉树的最近公共祖先(C++)

目录 问题描述&#xff1a; 实现代码与解析&#xff1a; 原理思路: 问题描述&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&…

Xmanager7远程登录ubuntu20.04

Xmanager7远程登录ubuntu20.04 本文不介绍Xmanager7的下载和安装方法&#xff0c;详细内容可以参考【实用软件】Xmanager 7.0安装教程 - 哔哩哔哩 (bilibili.com)。关于Xmanager7远程登录的教材参考于 (149条消息) Xmanager远程桌面教程_周先森爱吃素的博客-CSDN博客_xmanage…

代码随想录第60天|84.柱状图中最大的矩形

84.柱状图中的最大的图形 总体思路&#xff1a;找到左右两个方向第一个小于该柱子高度的下标&#xff0c;用右下标-左下标-1得到该柱子高度对应的宽度w,再用宽度w*高度h得到面积&#xff0c;返回面积最大值 双指针法&#xff08;超时&#xff09; for循环判断左右第一个小于…

【NI Multisim 14.0虚拟仪器设计——虚拟仪器的引入】

目录 序言 前言 &#x1f349;知识点 一、虚拟仪器的引入 &#x1f34a;1.工具栏 &#x1f34a; 2.基本操作 ①仪器的选用与连接 ②仪器参数的设置 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电…

Linux云服务器下的gitee提交代码方法

目录 创建一个gitee仓库 gitee提交代码三板斧 1. git add 提交的文件 2. git commit -m "提交日志" 3. git push 可能存在的问题 .gitignore介绍 如何删除文件 创建一个gitee仓库 gitee提交代码三板斧 1. git add 提交的文件 作用&#xff1a;添加我…

Electron + React 应用打包全流程

&#xff08;第一次用 Typora 写博&#xff0c;希望效果不错~&#xff09; 这几天有个创意编程比赛&#xff0c;要写一个电脑端应用。我准备用 React.js Electron 做&#xff08;因为熟悉~&#xff09;&#xff0c;编程部分一路风雨无阻&#xff0c;到了打包却出现了问题。El…

多轮对话(一):概述(意图识别+槽填充)

一、对话系统 基于流水线的面向任务的对话系统包含了四个关键部分&#xff1a; 语言理解。它被称为自然语言理解&#xff08;NLU&#xff09;&#xff0c;它把用户话语解析为预定义的语义槽。对话状态跟踪器。它管理每一轮的输入与对话历史&#xff0c;输出当前对话状态。对话…

Sechunter移动应用隐私合规检测详解

概述&#xff1a; 受益于移动设备的广泛普及&#xff0c;移动应用近年来得到了蓬勃发展。基于移动设备集成的各类传感器&#xff0c;众多功能丰富的移动应用被开发出来&#xff0c;聚集了大量高价值用户隐私数据&#xff0c;包括用户身份信息、地理位置信息、账户资料信息等。…

玩转机密计算从 secGear 开始

随着网络与计算业务的快速发展&#xff0c;数据成为数字经济的关键生产要素&#xff0c;如何高质量挖掘数据价值&#xff0c;构建安全、合规、可信的数据流通&#xff0c;成为推动数字经济健康发展的关键。此外&#xff0c;根据我国个人信息保护法、欧盟通用数据保护条例 GDPR …

IDEA安装使用代码提交模板

IDEA安装使用代码提交模板 1. idea安装git commit template插件 2、重启idea 3、选择要提交的文件右击&#xff08;或CtrlShiftK&#xff09;&#xff0c;如下图&#xff1a; 3.1 Type of change用于说明commit的类别,常用的标识如下&#xff1a; feat: 新功能&#xff08;f…

501. 二叉搜索树中的众数

501. 二叉搜索树中的众数 难度简单 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返…

Effective C++条款38:通过复合塑模出 has-a 或“根据某物实现出“

Effective C条款38&#xff1a;通过复合塑模出 has-a 或"根据某物实现出"&#xff08;Model "has-a" or "is-implemented-in-terms-of" through composition&#xff09;条款38&#xff1a;通过复合塑模出 has-a 或"根据某物实现出"1、…

Batch Normalization

1、原理 在图像预处理过程中会对图像进行标准化处理&#xff0c;这样能够加速网络的收敛速度。 如下图所示&#xff0c;对于Conv1来说输入的是满足某一分布的特征矩阵&#xff0c;但对于Conv2来说输入的feature map就不一定满足某一分布规律。 Batch Normalization的目的就是使…

大坝安全在线监控系统包含哪些内容?怎样提升水库大坝信息化管理水平?

平升电子大坝安全在线监控系统根据SL551-2012《土石坝安全监测技术规范》的整编要求&#xff0c;设置了变形监测、渗流监测、环境量监测。大坝安全在线监控系统可及时了解大坝的工作性态和水库可能存在的事故隐患&#xff0c;为大坝安全管理与水库运行调度提供了准确、及时的现…

Elasticsearch集群搭建

前言在如今的开发过程中&#xff0c;单节点的Elasticsearch肯定是支撑不了大数据量的&#xff0c;而且还存在单节点故障的问题&#xff0c;所以Elasticsearch也提供了集群功能&#xff0c;像其他中间件也基本都会考虑到这个问题准备信息首先&#xff0c; 由于我机器有限&#x…