Pytorch中Tensor的类型转换

本文详细介绍了PyTorch中Tensor的各种类型转换方法,包括数据类型、存储位置、与Numpy及Python数据类型的转换,以及如何使用.detach()剥离Tensor进行计算但不参与求导,对比了.detach()与.data的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Pytorch中的Tensor常用的类型转换函数(inplace操作):

(1)数据类型转换

  在Tensor后加 .long(), .int(), .float(), .double()等即可,也可以用.to()函数进行转换,所有的Tensor类型可参考https://pytorch.org/docs/stable/tensors.html

(2)数据存储位置转换

  CPU张量 ---->  GPU张量,使用data.cuda()

  GPU张量 ----> CPU张量,使用data.cpu()

(3)与numpy数据类型转换

  Tensor---->Numpy  使用 data.numpy(),data为Tensor变量

  Numpy ----> Tensor 使用 torch.from_numpy(data),data为numpy变量

(4)与Python数据类型转换

  Tensor ----> 单个Python数据,使用data.item(),data为Tensor变量且只能为包含单个数据

  Tensor ----> Python list,使用data.tolist(),data为Tensor变量,返回shape相同的可嵌套的list

(5)剥离出一个tensor参与计算,但不参与求导

  Tensor后加 .detach()

  官方解释为:

  Returns a new Tensor, detached from the current graph. The result will never require gradient. Returned Tensor shares the same storage with the original one. In-place modifications on either of them will be seen, and may trigger errors in correctness checks. 

  (以前这个功能用过.data(),但现在不推荐使用了)

detach()和data生成的都是无梯度的纯tensor,并且通过同一个tensor数据操作,是共享一块数据内存。

import torch
t1 = torch.tensor([0,1.],requires_grad=True)
t2=t1.detach()
t3=t1.data
print(t2.requires_grad,t3.requires_grad)
---------------------------------------------
output: False, False

x.data和x.detach()新分离出来的tensor的requires_grad=False,即不可求导时两者之间没有区别,但是当当requires_grad=True的时候的两者之间的是有不同:x.data不能被autograd追踪求微分,但是x.detach可以被autograd()追踪求导。

x.data

import torch
a = torch.tensor([1,2,3.], requires_grad=True)
out = a.sigmoid()
out 
----------------------------------------------------
output: tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward>)

c = out.data
c
-----------------------------------------------------
output: tensor([0.7311, 0.8808, 0.9526])

c.zero_()    # 归0化
out
------------------------------------------------------
tensor([0., 0., 0.], grad_fn=<SigmoidBackward>)

out.sum().backward()
a.grad
-------------------------------------------------------
output:tensor([0., 0., 0.])

x.detach()

b = torch.tensor([1,2,3.], requires_grad=True)
out1 = b.sigmoid()
out1
------------------------------------------------------
output:tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward>)

c1 = out1.detach()
c1
------------------------------------------------------
output:tensor([0.7311, 0.8808, 0.9526])

c1.zero_()
out1.sum().backward()   # 报错是是因为autograd追踪求导的时候发现数据已经发生改变,被覆盖。
-------------------------------------------------------
output: RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation:

总而言之,x.data和x.detach()都是从原有计算中分离出来的一个tensor变量 ,并且都是inplace operation.在进行autograd追踪求倒时,两个的常量是相同。不同之处在于.data时属性,detach()是方法。 x.data不是安全的,x.detach()是安全的。

参考:

https://blog.csdn.net/hustchenze/article/details/79154139

https://pytorch.org/docs/stable/tensors.html#torch.Tensor.to

https://www.cnblogs.com/my-recode/p/12305250.html

### PyTorchTensor 类型转换方法 在 PyTorch 中,可以通过内置函数实现不同类型的 Tensor 转换。以下是常见的几种类型转换方式及其对应的代码示例。 #### 1. 整数类型到浮点类型 如果需要将 `torch.int64` 类型的 Tensor 转换为 `torch.float32` 类型,则可以调用 `.float()` 方法完成此操作[^1]: ```python import torch int_tensor = torch.tensor([1, 2, 3, 4], dtype=torch.int64) print(f"Original type: {int_tensor.dtype}") # 输出: Original type: torch.int64 float_tensor = int_tensor.float() print(f"Converted type: {float_tensor.dtype}") # 输出: Converted type: torch.float32 ``` #### 2. 浮点类型到整数类型 对于从 `torch.float32` 到 `torch.int64` 的转换,可使用 `.long()` 方法来执行向下取整并返回整数值: ```python float_tensor = torch.tensor([1.1, 2.5, 3.7, 4.0], dtype=torch.float32) print(f"Original type: {float_tensor.dtype}") # 输出: Original type: torch.float32 int_tensor = float_tensor.long() print(f"Converted type: {int_tensor.dtype}") # 输出: Converted type: torch.int64 ``` #### 3. Tensor 和 NumPy 数组之间的相互转换 当需要在 PyTorch Tensor 和 NumPy 数组间进行转换时,分别采用 `.numpy()` 函数以及 `torch.from_numpy()` 来处理[^3]: - **Tensor → NumPy** ```python tensor = torch.tensor([1, 2, 3, 4]) numpy_array = tensor.numpy() print(type(numpy_array)) # 输出: <class 'numpy.ndarray'> ``` - **NumPy → Tensor** ```python import numpy as np numpy_data = np.array([5, 6, 7, 8]) tensor = torch.from_numpy(numpy_data) print(type(tensor)) # 输出: <class 'torch.Tensor'> ``` 需要注意的是,在这两种形式下共享内存地址,因此修改其中一个对象会影响另一个对象的内容。 #### 4. 将 Tensor 转换成 Python 数据结构 为了进一步简化数据处理流程或者与其他库兼容,还可以通过特定目的函数把 Tensor 转化成更通用的数据格式: - **Tensor → List** ```python tensor = torch.tensor([[1, 2], [3, 4]]) list_data = tensor.tolist() print(list_data) # 输出: [[1, 2], [3, 4]] ``` - **单元素 Tensor → Scalar (标量)** ```python scalar_tensor = torch.tensor(42.) scalar_value = scalar_tensor.item() print(scalar_value) # 输出: 42.0 ``` 以上即是在 PyTorch 中针对 Tensor 进行不同类型转换的主要方法及其实现案例说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值