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脚本分享
Apr 21 Python
Django Highcharts制作图表
Aug 27 Python
Python爬虫DOTA排行榜爬取实例(分享)
Jun 13 Python
使用Python读取安卓手机的屏幕分辨率方法
Mar 31 Python
Python基于百度云文字识别API
Dec 13 Python
python获取网络图片方法及整理过程详解
Dec 20 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
Jan 08 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 Python
Pycharm连接远程服务器过程图解
Apr 30 Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 Python
python glom模块的使用简介
Apr 13 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网站备份程序代码分享
2011/06/10 PHP
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
javascript控制swfObject应用介绍
2012/11/29 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
jQuery焦点图左右转换效果
2016/12/12 Javascript
phantomjs导出html到pdf的方法总结
2017/10/19 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
vue配置文件实现代理v2版本的方法
2019/06/21 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
javascript实现画板功能
2020/04/12 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
python输出100以内的质数与合数实例代码
2018/07/08 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
python对象转字典的两种实现方式示例
2019/11/07 Python
使用apiDoc实现python接口文档编写
2019/11/19 Python
Python求解正态分布置信区间教程
2019/11/20 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
英国现代市场:ARKET
2019/04/10 全球购物
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
学前教育专业毕业生自荐信
2013/10/03 职场文书
运动会通讯稿100字
2014/01/31 职场文书
《小松树和大松树》教学反思
2014/02/20 职场文书
分公司负责人任命书
2014/06/04 职场文书
县长“四风”对照检查材料思想汇报
2014/10/05 职场文书
2015学校年度工作总结
2015/05/11 职场文书
给男朋友的道歉短信
2015/05/12 职场文书
天气温馨提示语
2015/07/14 职场文书
中学语文教学反思
2016/02/16 职场文书
Python+SeaTable实现计算两个日期间的工作日天数
2022/07/07 Python