解决numpy和torch数据类型转化的问题

在实际计算过程中,float类型使用最多,因此这里重点介绍numpy和torch数据float类型转化遇到的问题,其他类型同理。

numpy数据类型转化

numpy使用astype转化数据类型,float默认转化为64位,可以使用np.float32指定为32位

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

[1. 2. 3.]

float64

不要使用a.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
torch.float32

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

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

float64

torch.float64

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

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

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

numpy和tensor互转

tensor转化为numpy

import torch
b = torch.tensor([4.0,6])
# b = b.float()
print(b.dtype)
c = b.numpy()
print(c.dtype)

torch.int64

int64

numpy转化为tensor

import torch
import numpy as np
b= np.array([1,2,3])
# b = b.astype(np.float)
print(b.dtype)
c = torch.from_numpy(b)
print(c.dtype)

int32

torch.int32

可以看到,torch默认int型是64位的,numpy默认int型是32位的

补充:torch.from_numpy VS torch.Tensor

最近在造dataset的时候,突然发现,在输入图像转tensor的时候,我可以用torch.Tensor直接强制转型将numpy类转成tensor类,也可以用torch.from_numpy这个方法将numpy类转换成tensor类,那么,torch.Tensor和torch.from_numpy这两个到底有什么区别呢?既然torch.Tensor能搞定,那torch.from_numpy留着不就是冗余吗?

答案

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

解释

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

这里的torch.Tensor与torch.from_numpy也会存在同样的问题。

看看torch.Tensor的文档,里面清楚地说明了,

torch.Tensor is an alias for the default tensor type (torch.FloatTensor).

而torch.from_numpy的文档则是说明,

The returned tensor and ndarray share the same memory. Modifications to the tensor will be reflected in the ndarray and vice versa. The returned tensor is not resizable.

也即是说,

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

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

是不是很神奇,下面是一个简单的例子:

import torch
import numpy as nps1 = np.arange(10, dtype=np.float32)
s2 = np.arange(10) # 默认的dtype是int64# 例一
o11 = torch.Tensor(s1)
o12 = torch.from_numpy(s1)
o11.dtype # torch.float32
o12.dtype # torch.float32
# 修改值
o11[0] = 12
o12[0] # tensor(12.)# 例二
o21 = torch.Tensor(s2)
o22 = torch.from_numpy(s2)
o21.dtype # torch.float32
o22.dtype # torch.int64
# 修改值
o21[0] = 12
o22[0] # tensor(0)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python、PyTorch图像读取与numpy转换实例

    Tensor转为numpy np.array(Tensor) numpy转换为Tensor torch.Tensor(numpy.darray) PIL.Image.Image转换成numpy np.array(PIL.Image.Image) numpy 转换成PIL.Image.Image Image.fromarray(numpy.ndarray) 首先需要保证numpy.ndarray 转换成np.uint8型 numpy.astype(np.uint8),像素值[0,255]. 同时灰

  • 从Pytorch模型pth文件中读取参数成numpy矩阵的操作

    目的: 把训练好的pth模型参数提取出来,然后用其他方式部署到边缘设备. Pytorch给了很方便的读取参数接口: nn.Module.parameters() 直接看demo: from torchvision.models.alexnet import alexnet model = alexnet(pretrained=True).eval().cuda() parameters = model.parameters() for p in parameters: numpy_para =

  • Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式

    我就废话不多说了,大家还是直接看代码吧! #!/usr/bin/python # -*- coding: UTF-8 -*- from PIL import Image import numpy as np import torch pil_img = Image.open('/Users/songlu/Desktop/code.jpg') img = np.array(pil_img) print torch.from_numpy(img) 补充知识:pytorch mxnet 多GPU训练

  • Pytorch之Tensor和Numpy之间的转换的实现方法

    为什么要相互转换: 1. 要对tensor进行操作,需要先启动一个Session,否则,我们无法对一个tensor比如一个tensor常量重新赋值或是做一些判断操作,所以如果将它转化为numpy数组就好处理了.下面一个小程序讲述了将tensor转化为numpy数组,以及又重新还原为tensor: 2. Torch的Tensor和numpy的array会共享他们的存储空间,修改一个会导致另外的一个也被修改. 学习链接:https://github.com/chenyuntc/pytorch-boo

  • Pyorch之numpy与torch之间相互转换方式

    numpy中的ndarray转化成pytorch中的tensor : torch.from_numpy() pytorch中的tensor转化成numpy中的ndarray : numpy() 代码 import numpy as np import torch np_arr = np.array([1,2,3,4]) tor_arr=torch.from_numpy(np_arr) tor2numpy=tor_arr.numpy() print('\nnumpy\n',np_arr,'\nto

  • 解决Numpy与Pytorch彼此转换时的坑

    前言 ​   最近使用 Numpy包与Pytorch写神经网络时,经常需要两者彼此转换,故用此笔记记录码代码时踩(菜)过的坑,网上有人说: Pytorch 又被称为 GPU 版的 Numpy,二者的许多功能都有良好的一一对应. ​但在使用时还是得多多注意,一个不留神就陷入到了 一根烟一杯酒,一个Bug找一宿 的地步. 1.1.numpy --> torch ​   使用 torch.from_numpy() 转换,需要注意,两者共享内存.例子如下: import torch import num

  • 解决numpy和torch数据类型转化的问题

    在实际计算过程中,float类型使用最多,因此这里重点介绍numpy和torch数据float类型转化遇到的问题,其他类型同理. numpy数据类型转化 numpy使用astype转化数据类型,float默认转化为64位,可以使用np.float32指定为32位 #numpy转化float类型 a= np.array([1,2,3]) a = a.astype(np.float) print(a) print(a.dtype) [1. 2. 3.] float64 不要使用a.dtype指定数据

  • 数据库 数据类型float到C#类型decimal, float数据类型转化无效

    今天运行系统突然出错,数据类型转化无效,错误在system.data.sqlclient.get_decimal()方法,初步估计是数据库的float类型转换为c#的decimal类型时出错了,实体类使用的是decimal?类型,心想就算数据库里的数值是空,也不能出现转换错误啊. 网上百般搜索,很多人遇到类似情况,多数是直接去float类型时候出错,如(float)dr[0],后来看到有说应该是先转化成double,然后在转化成float就可以了 尝试了一下把实体类的decimal?类型的字段改

  • 解决PyCharm import torch包失败的问题

    Anaconda3-5.1.0-MacOSX-x86_64.pkg 下载安装后,附带安装了pytorch包. 需要将环境调整到新的python3.6目录下. 1.在Project Interpreter选择"Show All..."菜单 Show All... 2.点击"+",新增新的Interpreter 选择 : Add Local... 选择 : System Interpreter 3.选择Anaconda3目录下的python3.6文件. 地址 : /an

  • 解决Numpy中sum函数求和结果维度的问题

    使用Numpy(下面简称np)中的sum函数对某一维度求和时,由于该维度会在求和后变成一个数,所以所得结果的这一维度为空. 比如下面的例子: a = np.array([[1,2,3],[4,5,6]]) b = np.sum(a,axis=1) print(b.shape) # (2,) 所以,对于一个shape为(2,3)的数组,在默认情况下使用np.sum函数求和后得到的结果shape是 (2,),如果我们想得到的是(2,1)的shape怎么办?比如Ng的深度学习编程练习中Course 1

  • 解决numpy矩阵相减出现的负值自动转正值的问题

    问题描述 今天在使用Numpy中的矩阵做相减操作时,出现了一些本应为负值的位置自动转换为了正值, 观察发现转换后的正值为原本的负值加上256得到,具体情况如下: 正常情况矩阵相减样例如下 >>> import numpy as np >>> arr = np.array([98,100,103,161,192,210]) >>> brr = np.array([105,105,106,197,196,195]) >>> crr = a

  • 如何修改numpy array的数据类型

    目录 修改numpy array数据类型 1.numpy数据类型 2.改变numpy array数据类型 numpy数据类型说明及自动转换陷阱 1.数据类型的表示 2.构造ndarray时的dtype 3.不同数据类型之间的转换兼容性 4.numpy对python对象数据类型'O'的处理 修改numpy array数据类型 1.numpy数据类型 数据名称 说明 bool 布尔类型,true,false int_ 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) in

  • Python NumPy教程之数据类型对象详解

    每个 ndarray 都有一个关联的数据类型 (dtype) 对象.这个数据类型对象(dtype)告诉我们数组的布局.这意味着它为我们提供了以下信息: 数据类型(整数.浮点数.Python 对象等) 数据大小(字节数) 数据的字节顺序(小端或大端) 如果数据类型是子数组,它的形状和数据类型是什么. ndarray 的值存储在缓冲区中,可以将其视为连续的内存字节块.所以这些字节将如何被解释由dtype对象给出. 构造数据类型(dtype)对象 数据类型对象是 numpy.dtype 类的一个实例,

  • 关于numpy和torch.tensor的张量的操作

    目录 1. 张量的拼接 (1) numpy.concatenate (2) torch.cat 2. 张量的重构 (1) np.reshape (2) array.shape (3) torch.view 3. 张量的形状 (1) torch.size 4. 张量的扩展 (1) torch.tensor扩展方法 (2) np.array扩展方法 总结 1. 张量的拼接 (1) numpy.concatenate np.concatenate((a1,a2,a3,-), axis=0) 张量的拼接

随机推荐