iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >pytorch中.numpy()、.item()、.cpu()、.detach()以及.data的使用方法
  • 355
分享到

pytorch中.numpy()、.item()、.cpu()、.detach()以及.data的使用方法

2024-04-02 19:04:59 355人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录.numpy().item().cpu().detach()和.data(重点)补充:关于.data和.cpu().data的各种操作总结.numpy() Tensor.nump

.numpy()

Tensor.numpy()将Tensor转化为ndarray,这里的Tensor可以是标量或者向量(与item()不同)转换前后的dtype不会改变

a = torch.tensor([[1.,2.]])
a_numpy = a.numpy() #[[1., 2.]]

.item()

将一个Tensor变量转换为python标量(int float等)常用于用于深度学习训练时,将loss值转换为标量并加,以及进行分类任务,计算准确值值时需要

        optimizer.zero_grad()
        outputs = model(data)
        loss = F.cross_entropy(outputs, label)
        #计算这一个batch的准确率
        acc = (outputs.argmax(dim=1) == label).sum().cpu().item() / len(labels) #这里也用到了.item()
        loss.backward()
        optimizer.step()
        train_loss += loss.item()   #这里用到了.item()
        train_acc += acc

.cpu()

将数据的处理设备从其他设备(如.cuda()拿到cpu上),不会改变变量类型,转换后仍然是Tensor变量。

.detach()和.data(重点)

.detach()就是返回一个新的tensor,并且这个tensor是从当前的计算图中分离出来的。但是返回的tensor和原来的tensor是共享内存空间的。

举个例子来说明一下detach有什么用。 如果A网络的输出被喂给B网络作为输入, 如果我们希望在梯度反传的时候只更新B中参数的值,而不更新A中的参数值,这时候就可以使用detach()

a = A(input)
a = a.deatch() # 或者a.detach_()进行in_place操作
out = B(a)
loss = criterion(out, labels)
loss.backward()

Tensor.data和Tensor.detach()一样, 都会返回一个新的Tensor, 这个Tensor和原来的Tensor共享内存空间,一个改变,另一个也会随着改变,且都会设置新的Tensor的requires_grad属性为False。这两个方法只取出原来Tensor的tensor数据, 丢弃了grad、grad_fn等额外的信息。

tensor.data是不安全的, 因为 x.data 不能被 autograd 追踪求微分

这是为什么呢?我们对.data进行进一步探究

import torch

a = torch.tensor([4., 5., 6.], requires_grad=True)
print("a", a)
out = a.sigmoid()
print("out", out)
print(out.requires_grad)   #在进行.data前仍为true
result = out.data  #共享变量,同时将requires_grad设置为false
result.zero_()  # 改变c的值,原来的out也会改变
print("result", result)
print("out", out)
out.sum().backward()  # 对原来的out求导,
print(a.grad)  # 不会报错,但是结果却并不正确
'''运行结果为:
a tensor([4., 5., 6.], requires_grad=True)
out tensor([0.9820, 0.9933, 0.9975], grad_fn=<SigmoidBackward0>)
True
result tensor([0., 0., 0.])
out tensor([0., 0., 0.], grad_fn=<SigmoidBackward0>)
tensor([0., 0., 0.])
'''

由于更改分离之后的变量值result,导致原来的张量out的值也跟着改变了,但是这种改变对于autograd是没有察觉的,它依然按照求导规则来求导,导致得出完全错误的导数值却浑然不知。

那么我们继续看看.detach()

可以看到将.data改为.detach()后程序立马报错,阻止了非法的修改,安全性很高

我们需要记住的就是:

  • .data 是一个属性,二.detach()是一个方法;
  • .data 是不安全的,.detach()是安全的。

补充:关于.data和.cpu().data的各种操作

先上图

仔细分析:

1.首先a是一个放在GPU上的Variable,a.data是把Variable里的tensor取出来,

  可以看出与a的差别是:缺少了第一行(Variable containing)

2.a.cpu()和a.data.cpu()是分别把a和a.data放在cpu上,其他的没区别,另外:a.data.cpu()和a.cpu().data一样

3.a.data[0] |  a.cpu().data[0]  | a.data.cpu()[0]是一样的,都是把第一个值取出来,类型均为float

4.a.data.cpu().numpy()把tensor转换成numpy的格式

总结

到此这篇关于PyTorch中.numpy()、.item()、.cpu()、.detach()以及.data使用的文章就介绍到这了,更多相关pytorch .numpy()、.item()、.cpu()、.detach()及.data内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: pytorch中.numpy()、.item()、.cpu()、.detach()以及.data的使用方法

本文链接: https://www.lsjlt.com/news/120080.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • pytorch中.numpy()、.item()、.cpu()、.detach()以及.data的使用方法
    目录.numpy().item().cpu().detach()和.data(重点)补充:关于.data和.cpu().data的各种操作总结.numpy() Tensor.nump...
    99+
    2024-04-02
  • Pytorch中TensorBoard及torchsummary的使用方法
    这篇文章将为大家详细讲解有关Pytorch中TensorBoard及torchsummary的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.TensorBoard神经网络可视化工具Tensor...
    99+
    2023-06-15
  • Pytorch中的gather使用方法
    官方说明 gather可以对一个Tensor进行聚合,声明为:torch.gather(input, dim, index, out=None) → Tensor 一般来说有三个参数...
    99+
    2024-04-02
  • Java中的getClass()以及getName()方法使用
    目录getClass()及getName()方法使用getClassgetName关于getClass()与getName()一道题在牛客网上看到的一道题目getClass()及ge...
    99+
    2024-04-02
  • 在jupyternotebook中使用pytorch的方法
    笔者刚开始学习pytorch时便遇到了无法在jupyter notebook使用anaconda配置的环境的问题,当时尝试了各种方法:卸载重装anaconda、pytorch环境、j...
    99+
    2024-04-02
  • Pytorch中DataLoader的使用方法详解
    目录一:dataset类构建。二:DataLoader使用三:举例前言加载数据datasetdataloader在Pytorch中,torch.utils.data中的Dataset...
    99+
    2024-04-02
  • python中 @的含义以及基本使用方法
    目录一、表示修饰符。二、表示矩阵乘法。总结一、表示修饰符。 可以在模块或者类的定义层内对函数进行修饰。出现在函数定义的前一行,不允许和函数定义在同一行。 一个修饰符就是一个函数,它将...
    99+
    2024-04-02
  • ffmpeg的安装以及使用的方法
    这篇文章主要介绍“ffmpeg的安装以及使用的方法”,在日常操作中,相信很多人在ffmpeg的安装以及使用的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ffmpeg的安...
    99+
    2024-04-02
  • Pythonrequests.post()方法中data和json参数的使用方法
    目录json和dictrequests.post()post请求中json和data的区别json和dict python中的dict类型要转换为json格式的数据需要用到json库...
    99+
    2024-04-02
  • vue data中的return使用方法示例
    目录一、vue 里面的data return 是什么?二、如何使用1.vue 双向绑定 v-model2.带有 ":"的属性 比如:class、:id等等3. 标...
    99+
    2024-04-02
  • JavaScript中String对象的使用方法以及实例
    方法总览: 实例(js中字符串和字符串对象之间能够自由转换,字符串可以直接使用字符串对象的方法和属性):  var ss="孙士彬倪炜豪汤键倪炜豪"; documen...
    99+
    2024-04-02
  • Python中的模块heapq以及使用方法详解
    python中的 heapq 模块 1、heapq 的两个函数:nlargest() 和 nsmallest() 1.1 nlargest(n, iterable, key=None) 函数 功能:获...
    99+
    2023-09-01
    python 开发语言 队列 heapq
  • Lombok中@Data的使用方法是什么
    本篇内容主要讲解“Lombok中@Data的使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Lombok中@Data的使用方法是什么”吧!Lombok先来简单介绍一下 Lombok ...
    99+
    2023-06-21
  • 浅谈java中==以及equals方法的用法
    equals 方法是 java.lang.Object 类的方法。有两种用法说明:(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。“==”比较两个变量本身的值,即两个对象在内存中的首地址。“eq...
    99+
    2023-05-30
    java equals方法 ava
  • Vue中$attrs和$listeners详解以及使用方法
    目录Vue中 常见的组件通信方式可分为三类1. 前言2. 知识点3. 示例总结 传送门:Vue中 子组件向父组件传值 及 .sync 修饰符 详解传送门:Vue中 状态管理...
    99+
    2022-11-16
    vue $attrs $listeners vue $attrs $listeners属性
  • CSS使用中常见的问题以及解决方法
    这篇文章主要介绍“CSS使用中常见的问题以及解决方法”,在日常操作中,相信很多人在CSS使用中常见的问题以及解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS使用中...
    99+
    2024-04-02
  • requests.post()方法中data和json参数的使用
    目录requests.post()中data和json参数json和dictrequests.post()其它post请求中json和data的区别requests.post()中d...
    99+
    2024-04-02
  • 在python中利用numpy求解多项式以及多项式拟合的方法
    在Python中,我们可以使用NumPy库来求解多项式以及多项式拟合。首先,我们可以使用NumPy的`polyval`函数来求解多项...
    99+
    2023-08-17
    python
  • 在JavaScript的jQuery中如何使用detach()方法删除dom节点元素
    这篇文章主要介绍在JavaScript的jQuery中如何使用detach()方法删除dom节点元素,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JavaScript有什么特点1、js属于一种解释性脚本语言;2、在绝...
    99+
    2023-06-14
  • css中id和class的定义格式以及使用方法
    本篇内容介绍了“css中id和class的定义格式以及使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作