Pytorch 实现变量类型转换


Posted in Python onMay 17, 2021

Pytorch的数据类型为各式各样的Tensor,Tensor可以理解为高维矩阵。

与Numpy中的Array类似。Pytorch中的tensor又包括CPU上的数据类型和GPU上的数据类型,一般GPU上的Tensor是CPU上的Tensor加cuda()函数得到。通过使用Type函数可以查看变量类型。

一般系统默认是torch.FloatTensor类型。

例如data = torch.Tensor(2,3)是一个2*3的张量,类型为FloatTensor; data.cuda()就转换为GPU的张量类型,torch.cuda.FloatTensor类型。

下面简单介绍一下Pytorch中变量之间的相互转换

(1)CPU或GPU张量之间的转换

一般只要在Tensor后加long(), int(), double(),float(),byte()等函数就能将Tensor进行类型转换;

例如:Torch.LongTensor--->Torch.FloatTensor, 直接使用data.float()即可

还可以使用type()函数,data为Tensor数据类型,data.type()为给出data的类型,如果使用data.type(torch.FloatTensor)则强制转换为torch.FloatTensor类型张量。

当你不知道要转换为什么类型时,但需要求a1,a2两个张量的乘积,可以使用a1.type_as(a2)将a1转换为a2同类型。

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

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

(4)Variable变量转换成普通的Tensor,其实可以理解Variable为一个Wrapper,里头的data就是Tensor. 如果Var是Variable变量,使用Var.data获得Tensor变量

(5)Tensor与Numpy Array之间的转换

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

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

补充:Numpy/Pytorch之数据类型与强制类型转换

1.数据类型简介

Numpy

NumPy 支持比 Python 更多种类的数值类型。 下表显示了 NumPy 中定义的不同标量数据类型。

序号 数据类型及描述
1. bool_存储为一个字节的布尔值(真或假)
2. int_默认整数,相当于 C 的long,通常为int32或int64
3. intc相当于 C 的int,通常为int32或int64
4. intp用于索引的整数,相当于 C 的size_t,通常为int32或int64
5. int8字节(-128 ~ 127)
6. int1616 位整数(-32768 ~ 32767)
7. int3232 位整数(-2147483648 ~ 2147483647)
8. int6464 位整数(-9223372036854775808 ~ 9223372036854775807)
9. uint88 位无符号整数(0 ~ 255)
10. uint1616 位无符号整数(0 ~ 65535)
11. uint3232 位无符号整数(0 ~ 4294967295)
12. uint6464 位无符号整数(0 ~ 18446744073709551615)
13. float_float64的简写
14. float16半精度浮点:符号位,5 位指数,10 位尾数
15. float32单精度浮点:符号位,8 位指数,23 位尾数
16. float64双精度浮点:符号位,11 位指数,52 位尾数
17. complex_complex128的简写
18. complex64复数,由两个 32 位浮点表示(实部和虚部)
19.

complex128复数,由两个 64 位浮点表示(实部和虚部)

直接使用类型名很可能会报错,正确的使用方式是np.调用,eg, np.uint8

Pytorch

Torch定义了七种CPU张量类型和八种GPU张量类型,这里我们就只讲解一下CPU中的,其实GPU中只是中间加一个cuda即可,如torch.cuda.FloatTensor:

torch.FloatTensor(2,3) 构建一个2*3 Float类型的张量

torch.DoubleTensor(2,3) 构建一个2*3 Double类型的张量

torch.ByteTensor(2,3) 构建一个2*3 Byte类型的张量

torch.CharTensor(2,3) 构建一个2*3 Char类型的张量

torch.ShortTensor(2,3) 构建一个2*3 Short类型的张量

torch.IntTensor(2,3) 构建一个2*3 Int类型的张量

torch.LongTensor(2,3) 构建一个2*3 Long类型的张量

同样,直接使用类型名很可能会报错,正确的使用方式是torch.调用,eg,torch.FloatTensor()

2.Python的type()函数

type函数可以由变量调用,或者把变量作为参数传入。

返回的是该变量的类型,而非数据类型。

data = np.random.randint(0, 255, 300)
print(type(data))

输出

<class 'numpy.ndarray'>

3.Numpy/Pytorch的dtype属性

返回值为变量的数据类型

t_out = torch.Tensor(1,2,3)
print(t_out.dtype)

输出

torch.float32

t_out = torch.Tensor(1,2,3)

print(t_out.numpy().dtype)

输出

float32

4.Numpy中的类型转换

先聊聊我为什么会用到这个函数(不看跳过)

为了实施trochvision.transforms.ToPILImage()函数

于是我想从numpy的ndarray类型转成PILImage类型

我做了以下尝试

data = np.random.randint(0, 255, 300)
n_out = data.reshape(10,10,3)
print(n_out.dtype)
img = transforms.ToPILImage()(n_out)
img.show()

但是很遗憾,报错了

raise TypeError('Input type {} is not supported'.format(npimg.dtype))

TypeError: Input type int32 is not supported

因为要将ndarray转成PILImage要求ndarray是uint8类型的。

于是我认输了。。。

使用了

n_out = np.linspace(0,255,300,dtype=np.uint8)
n_out = n_out.reshape(10,10,3)
print(n_out.dtype)
img = torchvision.transforms.ToPILImage()(n_out)
img.show()

得到了输出

uint8

Pytorch 实现变量类型转换

嗯,显示了一张图片

但是呢,就很憋屈,和想要的随机数效果不一样。

于是我用了astype函数

astype()函数

由变量调用,但是直接调用不会改变原变量的数据类型,是返回值是改变类型后的新变量,所以要赋值回去。

n_out = n_out.astype(np.uint8)
#初始化随机数种子
np.random.seed(0)
 
data = np.random.randint(0, 255, 300)
print(data.dtype)
n_out = data.reshape(10,10,3)
 
#强制类型转换
n_out = n_out.astype(np.uint8)
print(n_out.dtype)
 
img = transforms.ToPILImage()(n_out)
img.show()

输出

int32

uint8

Pytorch 实现变量类型转换

5.Pytorch中的类型转换

pytorch中没有astype函数,正确的转换方法是

Way1 : 变量直接调用类型

tensor = torch.Tensor(3, 5)

torch.long() 将tensor投射为long类型

newtensor = tensor.long()

torch.half()将tensor投射为半精度浮点类型

newtensor = tensor.half()

torch.int()将该tensor投射为int类型

newtensor = tensor.int()

torch.double()将该tensor投射为double类型

newtensor = tensor.double()

torch.float()将该tensor投射为float类型

newtensor = tensor.float()

torch.char()将该tensor投射为char类型

newtensor = tensor.char()

torch.byte()将该tensor投射为byte类型

newtensor = tensor.byte()

torch.short()将该tensor投射为short类型

newtensor = tensor.short()

同样,和numpy中的astype函数一样,是返回值才是改变类型后的结果,调用的变量类型不变

Way2 : 变量调用pytorch中的type函数

type(new_type=None, async=False)如果未提供new_type,则返回类型,否则将此对象转换为指定的类型。 如果已经是正确的类型,则不会执行且返回原对象。

用法如下:

self = torch.LongTensor(3, 5)
# 转换为其他类型
print self.type(torch.FloatTensor)

Way3 : 变量调用pytorch中的type_as函数

如果张量已经是正确的类型,则不会执行操作。具体操作方法如下:

self = torch.Tensor(3, 5)
tesnor = torch.IntTensor(2,3)
print self.type_as(tesnor)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现根据IP地址和子网掩码算出网段的方法
Jul 30 Python
Python中 Lambda表达式全面解析
Nov 28 Python
Python实现图片转字符画的示例
Aug 22 Python
用pandas中的DataFrame时选取行或列的方法
Jul 11 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
Python作用域与名字空间原理详解
Mar 21 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
Apr 20 Python
深入了解Python 变量作用域
Jul 24 Python
Python requests接口测试实现代码
Sep 08 Python
Python列表删除重复元素与图像相似度判断及删除实例代码
May 07 Python
python如何正确使用yield
May 21 Python
Python图像处理库PIL详细使用说明
Apr 06 Python
Python进度条的使用
May 17 #Python
Python包管理工具pip的15 个使用小技巧
Python中json.dumps()函数的使用解析
May 17 #Python
Python中threading库实现线程锁与释放锁
Python中Cookies导出某站用户数据的方法
May 17 #Python
Python 高级库15 个让新手爱不释手(推荐)
Python带你从浅入深探究Tuple(基础篇)
May 15 #Python
You might like
php提示undefined index的几种解决方法
2012/05/21 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
为jQuery.Treeview添加右键菜单的实现代码
2010/10/22 Javascript
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
2011/10/31 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
2015/09/21 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
Vue.js开发环境快速搭建教程
2017/03/17 Javascript
Angular4 中内置指令的基本用法
2017/07/31 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
python不带重复的全排列代码
2013/08/13 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
kaggle+mnist实现手写字体识别
2018/07/26 Python
python3调用windows dos命令的例子
2019/08/14 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
小学师德标兵先进事迹材料
2014/05/25 职场文书
工作检讨书怎么写
2015/01/23 职场文书
质量保证书格式模板
2015/02/27 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
Python实现机器学习算法的分类
2021/06/03 Python
redis中lua脚本使用教程
2021/11/01 Redis
Golang数据类型和相互转换
2022/04/12 Golang