PyTorch中torch.tensor()和torch.to_tensor()的区别

 更新时间:2023年01月28日 10:38:05   作者:Enzo 想砸电脑  
在Pytorch中Tensor和tensor都用于生成新的张量,但二者并不相同,下面这篇文章主要给大家介绍了关于PyTorch中torch.tensor()和torch.to_tensor()区别的相关资料,需要的朋友可以参考下

前言

在跑模型的时候,遇到如下报错

UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).

网上查了一下,发现将 torch.tensor() 改写成 torch.as_tensor() 就可以避免报错了。

# 如下写法报错
 feature = torch.tensor(image, dtype=torch.float32)
 
# 改为
feature = torch.as_tensor(image, dtype=torch.float32)

然后就又仔细研究了下 torch.as_tensor()torch.tensor() 的区别,在此记录。

1、torch.as_tensor()

new_data = torch.as_tensor(data, dtype=None,device=None)->Tensor

作用:生成一个新的 tensor, 这个新生成的tensor 会根据原数据的实际情况,来决定是进行浅拷贝,还是深拷贝。当然,会优先浅拷贝,浅拷贝会共享内存,并共享 autograd 历史记录。

情况一:数据类型相同 且 device相同,会进行浅拷贝,共享内存

import numpy
import torch

a = numpy.array([1, 2, 3])
t = torch.as_tensor(a)
t[0] = -1

print(a)   # [-1  2  3]
print(a.dtype)   # int64
print(t)   # tensor([-1,  2,  3])
print(t.dtype)   # torch.int64
import numpy
import torch

a = torch.tensor([1, 2, 3], device=torch.device('cuda'))
t = torch.as_tensor(a)
t[0] = -1

print(a)   # tensor([-1,  2,  3], device='cuda:0')
print(t)   # tensor([-1,  2,  3], device='cuda:0')

情况二: 数据类型相同,但是device不同,深拷贝,不再共享内存

import numpy
import torch

import numpy
a = numpy.array([1, 2, 3])
t = torch.as_tensor(a, device=torch.device('cuda'))
t[0] = -1

print(a)   # [1 2 3]
print(a.dtype)   # int64
print(t)   # tensor([-1,  2,  3], device='cuda:0')
print(t.dtype)   # torch.int64

情况三:device相同,但数据类型不同,深拷贝,不再共享内存

import numpy
import torch

a = numpy.array([1, 2, 3])
t = torch.as_tensor(a, dtype=torch.float32)
t[0] = -1

print(a)   # [1 2 3]
print(a.dtype)   # int64
print(t)   # tensor([-1.,  2.,  3.])
print(t.dtype)   # torch.float32

2、torch.tensor()

torch.tensor() 是深拷贝方式。

torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)

深拷贝:会拷贝 数据类型 和 device,不会记录 autograd 历史 (also known as a “leaf tensor” 叶子tensor)

重点是:

  • 如果原数据的数据类型是:list, tuple, NumPy ndarray, scalar, and other types,不会 waring
  • 如果原数据的数据类型是:tensor,使用 torch.tensor(data) 就会报waring
# 原数据类型是:tensor 会发出警告
import numpy
import torch

a = torch.tensor([1, 2, 3], device=torch.device('cuda'))
t = torch.tensor(a)
t[0] = -1

print(a)
print(t)

# 输出:
# tensor([1, 2, 3], device='cuda:0')
# tensor([-1,  2,  3], device='cuda:0')
# /opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:5: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).
# 原数据类型是:list, tuple, NumPy ndarray, scalar, and other types, 没警告
import torch
import numpy

a =  numpy.array([1, 2, 3])
t = torch.tensor(a) 

b = [1,2,3]
t= torch.tensor(b)

c = (1,2,3)
t= torch.tensor(c)

结论就是:以后尽量用 torch.as_tensor()

总结

到此这篇关于PyTorch中torch.tensor()和torch.to_tensor()区别的文章就介绍到这了,更多相关torch.tensor()和torch.to_tensor()区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python并发2之使用asyncio处理并发

    python并发2之使用asyncio处理并发

    本篇文章主要介绍了python并发2之使用asyncio处理并发,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 基于Python打造一个高效开发辅助全能工具箱

    基于Python打造一个高效开发辅助全能工具箱

    在日常开发过程中,我们经常需要进行各种琐碎但又必不可少的操作,本文介绍一款基于 Python 编写的 全能工具箱,它涵盖了开发过程中常用的功能,希望对大家有所帮助
    2025-03-03
  • pytorch 如何使用batch训练lstm网络

    pytorch 如何使用batch训练lstm网络

    这篇文章主要介绍了pytorch 如何使用batch训练lstm网络的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • python函数定义和调用过程详解

    python函数定义和调用过程详解

    这篇文章主要介绍了python函数定义和调用过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Django工程的分层结构详解

    Django工程的分层结构详解

    在本篇文章里小编给各位分享的是关于Django工程的分层结构的相关知识点内容,有兴趣的朋友们学习参考下。
    2019-07-07
  • Python 海象运算符( :=)的三种用法

    Python 海象运算符( :=)的三种用法

    这篇文章主要介绍了Python 海象运算符(:=)的三种用法,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-06-06
  • Python实现将MongoDB中的数据导入到MySQL

    Python实现将MongoDB中的数据导入到MySQL

    这篇文章主要为大家详细介绍了如何通过Python封装一个将 MongoDB 中的数据导入到 MySQL 中的 Python 工具类 MongoToMysql,感兴趣的可以了解一下
    2023-05-05
  • Python代码打开本地.mp4格式文件的方法

    Python代码打开本地.mp4格式文件的方法

    今天小编就为大家分享一篇Python代码打开本地.mp4格式文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python中的Super用法示例详解

    Python中的Super用法示例详解

    Python中可以直接通过调用父类名调用父类方法,在多重继承中,使用super()是一个很好的习惯,下面这篇文章主要给大家介绍了关于Python中Super用法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Python+Turtle实现绘制勾股树

    Python+Turtle实现绘制勾股树

    毕达哥拉斯树,也叫“勾股树”,是由毕达哥拉斯根据勾股定理所画出来的一个可以无限重复的树形图形。本文将利用Python中的Turtle库实现勾股树的绘制,感兴趣的可以了解一下
    2023-01-01

最新评论