Pytorch 实现变量类型转换
作者:jingxian 发布时间:2021-09-27 23:35:47
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
嗯,显示了一张图片
但是呢,就很憋屈,和想要的随机数效果不一样。
于是我用了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
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)
来源:https://blog.csdn.net/hustchenze/article/details/79154139


猜你喜欢
- 以下是Python基础学习内容的学习笔记的全部内容,非常的详细,如果你对Python语言感兴趣,并且针对性的系统学习一下基础语言知识,下面的
- Python3 abs() 函数描述abs() 函数返回数字的绝对值。语法以下是 abs() 方法的语法:abs( x )参数x-- 数值表
- 一、使用matplotlib显示图import matplotlib.pyplot as plt #plt用于显示图片import matp
- 一、元素偏移量 offset 系列offset 翻译过来就是偏移量, 我们使用 offset 系列相关属性可以动态的得到该元素的位置(偏移)
- 线性判别分析(linear discriminant analysis),LDA。也称为Fisher线性判别(FLD)是模式识别的经典算法。
- 1.安装登陆确认mysql已经开启2.建库3.建表Create 数据库表右击选择Create Table,填写Table Name,Comm
- 1.’%.2f’%f该方法会进行四舍五入代码如下所示:f = 2.3456789print('
- 在 做一些天气预报或者RSS订阅的程序时,往往需要抓取非本地文件,一般情况下都是利用php模拟浏览器的访问,通过http请求访问url地址,
- 初学vue自己新建一个vue项目来做学习demo。不过在编写代码时一直出现空格不规范的警告。严重影响初学者的热情。错误如下图所示。(这样的错
- 1.pytnon的基本数据类型数字类型:整型(int)和浮点型(float)字符串(str)类型:用引号(单双引号都可以)定义一个字符串布尔
- RSA加密算法简史RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leo
- 自己写了一下,适用而已,不太好,应该还能优化。先自己记录一下。不说废话了,直接贴代码最好:/* * 获得时间差,时间格式为 年-月
- # -*- coding: utf-8 -*-import Image,ImageDraw,ImageFontimport randomim
- 本文研究的主要是numpy使用技巧之数组过滤的相关内容,具体如下。当使用布尔数组b作为下标存取数组x中的元素时,将收集数组x中所有在数组b中
- 在前一篇博客我们学习了 Go 数组,其要求所有元素为同一数据类型,如果希望存储不同类型的数据,就要用到结构体相关知识。结构体的定义:存储相同
- 大家都知道,不同字符编码,其在内存占用的字节数不一样。如ASCII编码字符占用1个字节,U
- 1:listWidget 以滚动窗口显示文件下的所有文件: self.listWidget = QtWidget
- 在建模时模型的超参数对精度有一定的影响,而设置和调整超参数的取值,往往称为调参。在实践中调参往往依赖人工来进行设置调整范围,然后使用机器在超
- 一、直接导入模块import 模块名优点:干净直接import sysprint(sys.path)import os # os是一个模块i
- 目录1、连接MongoDB2、指定(切换)数据库3、指定(切换)集合4、插入数据5、查询数据6、统计查询7、结果排序8、偏移9、更新数据10