np和tensor转换

说明

先给出torch和numpy转换的方式,之后参照W3C的一个教程,总结一些有用的。

Tensor与Numpy的ndarray类似,但深度学习框架又比Numpy的ndarray多一些重要功能: 首先,GPU很好地支持加速计算,而NumPy仅支持CPU计算; 其次,张量类支持自动微分。 这些功能使得张量类更适合深度学习。
torch张量和numpy数组将共享它们的底层内存,就地操作更改一个张量也会同时更改另一个张量。

代码

numpy转tensor

转numpy类型

  • .numpy()

转tensor

  • torch.tensor()
  • torch.from_numpy()

两者的区别
查看类型和转换

import torch
import numpy
A = X.numpy()
B = torch.tensor(A)
type(A), type(B)

(numpy.ndarray, torch.Tensor)

tensor 转换标量

将大小为1的张量转换为Python标量,我们可以调用item函数或Python的内置函数。

a = torch.tensor([3.5])
a, a.item(), float(a), int(a)

(tensor([3.5000]), 3.5, 3.5, 3)

numpy数据类型转化

使用 astype

#numpy转化float类型
a= np.array([1,2,3])
a = a.astype(np.float)
print(a)
print(a.dtype)

注意有损失的转换方式:使用dtype

#numpy转化float类型
b= np.array([1,2,3])
b.dtype= np.float32
print(b)
print(b.dtype)

[1.e-45 3.e-45 4.e-45]
float32

不要用float代替np.float,否则可能出现意想不到的错误

不能从np.float64位转化np.float32,会报错

np.float64与np.float32相乘,结果为np.float64

在实际使用过程中,可以指定为np.float,也可以指定具体的位数,如np.float,不过直接指定np.float更方便。

torch数据类型转化

torch使用torch.float()转化数据类型,float默认转化为32位,torch中没有torch.float64()这个方法

# torch转化float类型
b = torch.tensor([4,5,6])
b = b.float()
b.dtype

np.float64使用torch.from_numpy转化为torch后也是64位的

print(a.dtype)
c = torch.from_numpy(a)
c.dtype

torch.float32与torch.float64数据类型相乘会出错,因此相乘的时候注意指定或转化数据float具体类型

区别

np和torch数据类型转化大体原理一样,只有相乘的时候,torch.float不一致不可相乘,np.float不一致可以相乘,并且转化为np.float64.

两者的区别

torch.from_numpytensor.Tensor
安全float安全

使用torch.from_numpy更加安全,使用tensor.Tensor在非float类型下会与预期不符。

打个不完全正确的比方说,torch.Tensor就如同c的int,torch.from_numpy就如同c++的static_cast,我们都知道,如果将int64强制转int32,只要是高位转低位,一定会出现高位被抹去的隐患的,不仅仅可能会丢失精度,甚至会正负对调。

1、当转换的源是float类型,torch.Tensor与torch.from_numpy会共享一块内存!且转换后的结果的类型是torch.float32

2、当转换的源不是float类型,torch.Tensor得到的是torch.float32,而torch.from_numpy则是与源类型一致!

使用torch.from_numpy更加安全,使用tensor.Tensor在非float类型下会与预期不符。
回到顶部

参考文章

numpy和torch数据类型怎么转化
pytorch的一些数据操作(李沐)

在PyTorch中,将张量转换为可以可视化的图形通常涉及到两个步骤:首先,你需要将张量转换回一个图像,然后使用可视化库展示出来。以下是这个过程的一个基本示例: ```python import torch import matplotlib.pyplot as plt import numpy as np # 假设 tensor 是一个 [0...255] 范围内的单通道灰度图像 # 这里我们使用 numpy 的 toarray() 将 tensor 转换为数组 tensor_image = tensor.numpy().squeeze() # 如果是 RGB 彩色图像,可以先转换为灰度图(如果有必要) if len(tensor.shape) == 3 and tensor.shape[0] == 3: # 有3个通道 tensor_image = np.mean(tensor_image, axis=0) # 现在我们有了一个 numpy 数组,可以直接显示 plt.imshow(tensor_image, cmap='gray') if tensor_image.ndim == 2 else plt.imshow(tensor_image) plt.show() ``` 在这个例子中,`numpy.squeeze()` 用于移除多余的维度,因为单通道图像在 PyTorch 中通常是以形状 `[batch_size, channels, height, width]` 存储的,但在显示时不需要 batch_size 通道信息。 如果你使用的是 `torchvision` 库,还有专门的函数可以将张量直接转换为图像,如 `torchvision.utils.make_grid` 或 `imshow` 函数: ```python import torchvision.utils as vutils vutils.make_grid(tensor, nrow=8).show() # 适用于彩色图像 ``` 请注意,对于训练过程中生成的中间结果张量,可能会包含批处理数据,上述代码只展示了其中的一部分。如果是这种情况,你可能需要进一步处理以提取单个样本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值