具有不规则结果的常规 PyTorch 张量函数

一、说明

         深度学习从业者应注意的常用 PyTorch 张量函数的例外情况。你是不是也和上面的人一样呢?如果是,那么本文可能会帮助您在使用 PyTorch 构建深度学习模型时发现一些常见错误。

        我在下面提到了 5 个最常用的 PyTorch 函数及其小示例以及它们无法按预期工作的一种可能情况。所以,坚持住。让我们开始!

二、torch.Tensor.numpy()

直观上看,该函数用于将张量转换为 numpy 多维数组。[参考这里]

当定义 Tensor 时将 require_grad 设置为 True,然后尝试转换为 numpy 数组,PyTorch 会抛出运行时错误,如下图 1 所示。

图 1:将叶张量转换为 Numpy 数组时出错

        这是因为 PyTorch 只能将张量转换为 Numpy 数组,而这不会成为 PyTorch 中任何动态计算的一部分。必须使用detach将张量与动态图分离,然后转换为 numpy 数组。

三、torch.Tensor.new_tensor()

该方法返回一个新的张量作为data张量数据。[参考这里]

当使用 .new_tensor() 方法从现有张量复制新张量时,将 require_grad 设置为“True”,仅复制张量数据,而不复制与源张量相关的梯度。

请参考下面这个例子:

# Create tensors.
x = torch.tensor(1., requires_grad=True )
w = torch.tensor(2., requires_grad=True)
b = torch.tensor(3., requires_grad=True)
print("x:",x)
print("w:",w)
print("b:",b)

y = w*x + b 
print(y)

y.backward() #calculates the gradient of output w.r.t inputs

#gradients of outputs w.r.t inputs
print('dy/dx :',x.grad)  
print('dy/dw :',w.grad)
print('dy/db :',b.grad)

a = x.new_tensor(x,requires_grad=True) #creating a copy of a tensor x

print(a.grad)  #no grad of tensor x is copied to tensor a

图 2:在不复制梯度的情况下形成新的张量

在打印与张量 a 相关的梯度值时,不会打印None 。这是因为,PyTorch 只关联动态计算图中涉及的Leaf 张量的梯度(例如图 2 中计算张量 y 时使用的张量 x、w 和 b)。new_tensor 方法仅将张量数据复制到新张量(例如张量 a )

四、torch.Tensor.view()

此方法返回具有相同数据但形状不同的新张量。[参考这里]

t1 = torch.randn(2,3)
print(t1)
print("is t1 contiguous??",t1.is_contiguous())
t1_ = t1.transpose(0,1)
print(t1_)
print("is t1_ contiguous??",t1_.is_contiguous())
print(t1_.view(-1))
tensor([[-1.5140,  0.7263, -0.7764],
        [ 0.6795,  0.7041,  1.1364]])
is t1 contiguous?? True
tensor([[-1.5140,  0.6795],
        [ 0.7263,  0.7041],
        [-0.7764,  1.1364]])
is t1_ contiguous?? False
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-45-ac8f2ddf9c04> in <module>
      5 print(t1_)
      6 print("is t1_ contiguous??",t1_.is_contiguous())
----> 7 print(t1_.view(-1))

RuntimeError: view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(...) instead.

此方法不适用于非连续张量。有关张量连续性的更多信息可以在此处找到。

图 3:非连续张量上的 .view() 错误

从图 3 中可以看出,很明显.view()无法重塑非连续张量 t1_,因此可以使用 .view() 。在这里重塑以达到相同的目的。

五、torch.Tensor.is_leaf

根据 PyTorch 文档 V1.5.0 ,所有属性 require_grad 设置为False 的张量都被视为叶张量。[请参阅此处]

t2 = torch.randn(2,2,requires_grad=True)+2
print(t2)

#As shown above, the tensor t2 is a random tensor with requires_grad set to True 
#but is a result of an operation of adding 2 also. 
#So, in this case it will not be a Leaf Tensor. Let's check!!

print(t2.is_leaf) #t2 is not a leaf Tensor as it is created by an operation with requires_grad = True

仅当属性 require_grad 设置为 True 的张量由用户创建且不是操作结果时,才将其视为叶张量。

tensor([[4.4777, 2.4102], [2.5153, 1.6102]], grad_fn=<AddBackward0>) False

图 4:创建叶张量时出错

从图 4 中可以看出,张量 t2 不是叶张量,因为它是通过将两个添加到新定义的张量而创建的,这违反了定义叶张量的准则。

六、torch.Tensor.backward()

该函数负责计算当前张量相对于图叶子(leaftensors)的梯度【参考这里】

此方法仅需要 1 维张量或标量来计算叶向量/图叶的梯度

t1 = torch.randn(2,2,requires_grad=True)
t2 = torch.randn(2,2,requires_grad=True)

print(t1,t2)

#Above are 2 randomly defined tensors of dimensions 2x2 with requires_grad = True. 
#Let's involve these variables in a linear computation and calculate the gradient 
#of output y w.r.t these variables. 

y = t1*t2
print(y)
print(y.shape)

y.backward()

tensor([[ 1.0389, -1.0465], [-1.0421, 0.7246]], requires_grad=True) tensor([[0.1542, 1.4928], [0.0989, 0.2785]], requires_grad=True) tensor([[ 0.1602, -1.5622], [-0.1031, 0.2018]], grad_fn=<MulBackward0>) torch.Size([2, 2])

图 5:非一维张量的梯度计算误差

RuntimeError                              Traceback (most recent call last)
<ipython-input-58-3a823b03f50a> in <module>
     12 print(y.shape)
     13 
---> 14 y.backward()

~/anaconda3/envs/snowflakes/lib/python3.7/site-packages/torch/tensor.py in backward(self, gradient, retain_graph, create_graph)
    193                 products. Defaults to ``False``.
    194         """
--> 195         torch.autograd.backward(self, gradient, retain_graph, create_graph)
    196 
    197     def register_hook(self, hook):

~/anaconda3/envs/snowflakes/lib/python3.7/site-packages/torch/autograd/__init__.py in backward(tensors, grad_tensors, retain_graph, create_graph, grad_variables)
     91         grad_tensors = list(grad_tensors)
     92 
---> 93     grad_tensors = _make_grads(tensors, grad_tensors)
     94     if retain_graph is None:
     95         retain_graph = create_graph

~/anaconda3/envs/snowflakes/lib/python3.7/site-packages/torch/autograd/__init__.py in _make_grads(outputs, grads)
     32             if out.requires_grad:
     33                 if out.numel() != 1:
---> 34                     raise RuntimeError("grad can be implicitly created only for scalar outputs")
     35                 new_grads.append(torch.ones_like(out, memory_format=torch.preserve_format))
     36             else:

RuntimeError: grad can be implicitly created only for scalar outputs

从图5中,我们可以观察到张量y的形状是2x2,因此无法计算y相对于t1,t2的梯度并导致运行时错误。因此,为了计算梯度,我们可以对张量 y 中的所有元素求和,然后根据上下文和要求计算梯度 wrt 总和或更新张量 y 中每个元素的梯度。有关 PyTorch 论坛的更多讨论,请参阅此处。

请参阅此处的完整代码

Pytorch Tensor Functions - Notebook by Souptik (souptikmajumder) | Jovian

GitHub - souptikmajumder/torch.tensor-function-exceptions-pytorch: 5 exceptions to the most regularly used pytorch.tensor functions

有关 Torch.tensor 的官方 PyTorch 文档可以在此处找到。

本文是由Jovian.MLfreecodecamp主办的 PyTorch 从零到 GAN 课程的一部分。该课程的注册链接在这里

谢谢阅读!希望这篇文章能够消除对 PyTorch 中这些基本功能的一些疑问。

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

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

相关文章

阿里云服务器8080端口怎么打开?在安全组中设置

阿里云服务器8080端口开放在安全组中放行&#xff0c;Tomcat默认使用8080端口&#xff0c;8080端口也用于www代理服务&#xff0c;阿腾云atengyun.com以8080端口为例来详细说下阿里云服务器8080端口开启教程教程&#xff1a; 阿里云服务器8080端口开启教程 阿里云服务器8080端…

Codeforces Good Bye 2023 A~E

A.2023(思维) 题意&#xff1a; 有一个序列 A a 1 , a 2 , . . . , a n k A a_1, a_2, ..., a_{n k} Aa1​,a2​,...,ank​&#xff0c;且这个序列满足 ∏ i 1 n k a i 2023 \prod\limits_{i 1}^{n k}a_i 2023 i1∏nk​ai​2023&#xff0c;而这个序列中的 k k k个…

[Flutter]WindowsOS上运行遇到的问题总结

[Flutter]WindowsOS上运行遇到的问题总结 写在开头 Flutter项目已能在移动端完美使用后&#xff0c;想看看在桌面端等使用情况 基于Flutter3.0后已支持Windows/MacOS等桌面端&#xff0c;不过具体的系统&#xff0c;还需要看下官方文档解释。 这里抛出文档地址&#xff0c;可…

solidity显示以太坊美元价格

看过以太坊白皮书的都知道&#xff0c;以太坊比较比特币而言所提升的地方中&#xff0c;我认为最重要的一点就是能够访问外部的数据&#xff0c;这一点在赌博、金融领域应用会很广泛&#xff0c;但是区块链是一个确定的系统&#xff0c;包括里面的所有数值包括交易ID等都是确定…

教师行业的行业现状

teacher行业现状&#xff0c;近年来呈现出许多新的变化。作为一名从事教育行业多年的教师&#xff0c;深感这个行业的日新月异。今天&#xff0c;就让我来为大家揭秘一下&#xff0c;这个行业究竟有着怎样的现状吧&#xff01; 需求持续增长随着不断发展&#xff0c;家长们对孩…

【计算机毕业设计】SSM实现的在线农产品商城

项目介绍 本项目分为前后台&#xff0c;且有普通用户与管理员两种角色。 用户角色包含以下功能&#xff1a; 用户登录,查看首页,按分类查看商品,查看新闻资讯,查看关于我们,查看商品详情,加入购物车,查看我的订单,提交订单,添加收获地址,支付订单等功能。 管理员角色包含以…

AntDB设计之CheckPoint——引言与功能简述

1.引言 数据库服务能力提升是一项系统性的工程&#xff0c;在不同的应用场景下&#xff0c;用户对于数据库各项能力的关注点也不同&#xff0c;如&#xff1a;读写延迟、吞吐量、扩展性、可靠性、可用性等等。国内不少数据库系统通过系统架构优化、硬件设备升级等方式&#xf…

工程项目管理软件哪个好用?这款顶级软件别错过!

“随着市场竞争加剧、产品利润走薄、用户响应要求提高、产品更新迭代加快等各项因素的变化&#xff0c;项目管理开始成为越来越多企业的管理方式。项目管理的核心目标是在规定时间和预算内&#xff0c;完成事先确定的范围内的工作&#xff0c;同时达到质量要求。” 你所在公司…

架构师使用的8种重要生命周期图

什么是生命周期? 百度给出的定义是:生命周期就是指一个对象的生老病死。 生命周期的概念应用很广泛,特别是在政治、经济、环境、技术、社会等诸多领域经常出现,其基本涵义可以通俗地理解为"从摇篮到坟墓"的整个过程。对于某个产品而言,它的生命周期其实是指产…

【hyperledger-fabric】部署和安装

简介 对hyperledger-fabric进行安装&#xff0c;话不多说&#xff0c;直接开干。但是需要申明一点&#xff0c;也就是本文章全程是开着加速器进行的资源操作&#xff0c;所以对于没有开加速器的情况可能会由于网络原因导致下载资源失败。 资料提供 1.官方部署文档在此&#…

mfc100u.dll文件丢失,有五种不同解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到mfc100u.dll文件”。那么&#xff0c;mfc100u.dll文件到底是什么&#xff1f;为什么会出现丢失的情况&#xff1f;本文将详细介绍mfc100u.dll文件的作用以及丢失的原因&#xff0c;并…

软件测试入门(知识汇总)

1、黑盒测试、白盒测试、灰盒测试 1.1 黑盒测试 黑盒测试又叫功能测试、数据驱动测试 或 基于需求规格说明书的功能测试。该类测试注重于测试软件的功能性需求。 采用这种测试方法&#xff0c;测试工程师把测试对象看作一个黑盒子&#xff0c;完全不考虑程序内部的逻辑结构和…

【多线程与高并发 四】CAS、Unsafe 及 JUC 原子类详解

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是若明天不见&#xff0c;BAT的Java高级开发工程师&#xff0c;CSDN博客专家&#xff0c;后端领域优质创作者 &#x1f4d5;系列专栏&#xff1a;多线程及高并发系列 &#x1f4d5;其他专栏&#xff1a;微服务框架系列、…

每日一题 2487. 从链表中移除节点(中等,回溯)

显然只要从后往前遍历链表&#xff0c;设 t 为当前的最大值&#xff0c;只要在遍历过程中比 t 小的节点都删除&#xff0c;大于等于 t 的则更新 t 为新的节点 通过递归回溯的方法可以很简单地实现从后往前遍历链表 # Definition for singly-linked list. # class ListNode: # …

Qt第一个UI程序设计

在第一个Qt程序的基础上我对ui界面进行设计&#xff0c;点击设计按钮 然后 拖动Label按钮输入想要输入的语句。 运行结果如下图。

【LMM 008】Instruction Tuning with GPT-4

论文标题&#xff1a;Instruction Tuning with GPT-4 论文作者&#xff1a;Baolin Peng, Chunyuan Li, Pengcheng He, Michel Galley, Jianfeng Gao 作者单位&#xff1a;Microsoft Research 论文原文&#xff1a;https://arxiv.org/abs/2304.03277 论文出处&#xff1a;– 论文…

海外服务器2核2G/4G/8G和4核8G配置16M公网带宽优惠价格表

腾讯云海外服务器租用优惠价格表&#xff0c;2核2G10M带宽、2核4G12M、2核8G14M、4核8G16M配置可选&#xff0c;可以选择Linux操作系统或Linux系统&#xff0c;相比较Linux服务器价格要更优惠一些&#xff0c;腾讯云服务器网txyfwq.com分享腾讯云国外服务器租用配置报价&#x…

计算机组成原理 存储器概述,主存系统模型和RAM和ROM

文章目录 存储器概述基本概念存储器层次结构存储器分类性能指标 主存系统模型和结构存储元结构主存寻址 RAM和ROMRAM概念RAM对比DRAM刷新集中刷新分散刷新异步刷新 ROM 存储器概述 #mermaid-svg-EjCg9aMsdPUw7lra {font-family:"trebuchet ms",verdana,arial,sans-se…

Docker 安装Mysql

目录 Docker Mysql安装 ✨安装和配置mysql ✨远程连接mysql远程连接 MySQL 是世界上最流行的开源数据库。根据 DB-Engines的调查数据&#xff0c;MySQL 是第二受欢迎的数据库&#xff0c;仅次于 Oracle 数据库。MySQL在过去由于性能高、成本低、可靠性好&#xff0c;已经成…