数据类型
1 pytorch中的常用数据类型
32位浮点型:torch.FloatTensor。
64位整型:torch.LongTensor。
32位整型:torch.IntTensor。
16位整型:torch.ShortTensor。
64位浮点型:torch.DoubleTensor。
布尔型:torch.BoolTensor。布尔型是8位,即一个字节。
除此之外,pytorch的其他数据类型不需要掌握。
如果要在CUDA中进行计算,那么要使用的数据类型是:
torch.cuda.FloatTensor
torch.cuda.LongTensor
torch.cuda.IntTensor
torch.cuda.ShortTensor
torch.cuda.DoubleTensor
torch.cuda.BoolTensor。
也就是说,在pytorch中,torch.FloatTensor和torch.cuda.FloatTensor分别属于不同的类。
2 数据的尺度与维度
(1)0维数据
pytorch 0.4以后的版本,将标量当成0维的数据,比如 torch.tensor(1.)就是标量,而torch.tensor([1.]),多了一对方括号的就是向量。
(2)1维数据
由一对方括号括起来的,就是向量,比如torch.tensor([1, 2, 3]),torch.tensor([1])
(3)2维数据
由两对方括号括起来的,就是矩阵,如
torch.tensor([[1, 2, 3], [4, 5, 6]])
如果a是二维的,那么a[0,0]就是标量,即0维的,并非长度为1的一维向量。
import torch
a = torch.rand(2,3)
print(a[1, 0]) # 具体到元素,那就是标量,而非长度是1的一维向量
print(a.size(1)) # 输出a的第二个维度的长度,和 a.shape[1] 等效
# print(a.shape(1)) # 这么写会报错,应该是 a.shape[1]
# 和numpy不一样的是,torch中只有shape属性,没有shape函数
输出
tensor(0.3593)
3
具体到元素了,不管是几维,结果都是标量。可以用a.size(1)输出第二个维度的长度。
同理,也有4维,5维和更高维度的数据,用几个方括号,就是几维。
0维,1维,2维数据的size
c = torch.tensor(1.)
print(c.shape)
d = torch.tensor([1.])
print(d.shape)
e = torch.tensor([1., 2., 3.])
print(e.size())
f = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(f.size())
输出
torch.Size([])
torch.Size([1])
torch.Size([3])
torch.Size([2, 3])
注意,torch.Size([1])和torch.Size([3])都是向量的尺寸,括号里面的1和3表示向量的长度。
3 获取数据的维度数、形状、元素个数等信息
使用.dim()函数,可以返回数据是几维的,
调用.shape属性,或者.size()方法都可以返回张量的维度,
调用.numel()函数,可以返回张量中元素的总个数
import torch
a = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(a)
print(a.dim())
print(a.size())
print(a.shape)
print(a.numel())
输出
tensor([[1, 2, 3],
[4, 5, 6]])
2
torch.Size([2, 3])
torch.Size([2, 3])
6
4 用.type()返回张量的数据类型
print(a.type())
print(type(a))
输出
torch.LongTensor
<class 'torch.Tensor'>
也就是说,type(a)返回的是a在python中的数据类型,a.type()返回的是a在torch中的数据类型。
5 初始化张量.tensor(),.FloatTensor(),.Tensor()的区别
使用.tensor()是用现成的数据初始化一个张量出来,张量的数据类型根据括号中的数据类型来确定。
import torch
'''使用tensor函数初试化一个函数,
如果初始化值中,全部为整数,那么生成的张量就是LongTensor
只要有一个元素为浮点型,生成的张量就是FloatTensor'''
a = torch.tensor([2, 3, 4])
print(a.type())
b = torch.tensor([2., 3])
print(b.type())
输出
torch.LongTensor
torch.FloatTensor
也可以使用
DoubleTensor(),.FloatTensor(),.IntTensor(),.LongTensor()来生成具体类型的数据,如果括号中的数据类型不符合要求,强制类型转换
a = torch.FloatTensor([[1, 2, 3], [4, 5, 6]])
print(a)
print(a.type())
输出
tensor([[1., 2., 3.],
[4., 5., 6.]])
torch.FloatTensor
DoubleTensor(),.IntTensor(),.LongTensor()的用法也和.FloatTensor()一样
上述方法很少使用,因为.FloatTensor()经常是用来生成某个特定维度的数据,在括号中指定维度,实现某个张量的初始化,如
b = torch.FloatTensor(2, 3)
print(b)
print(b.type())
输出
tensor([[9.5461e-01, 4.4377e+27, 1.7975e+19],
[4.6894e+27, 7.9463e+08, 5.0944e-14]])
torch.FloatTensor
此外,.Tensor()也是用来生成某个特定维度的数据,其数据类型是默认的数据类型,假如默认的数据类型是FloatTensor,那么生成的张量,其数据类型就是FloatTensor,如
c = torch.Tensor(2, 3)
print(c)
print(c.type())
输出
tensor([[1.7181e+19, 4.4166e+21, 1.1259e+24],
[1.0894e+27, 1.4603e-19, 1.6795e+08]])
torch.FloatTensor
也可以改变torch的默认数据类型,使用函数.set_default_tensor_type()
torch.set_default_tensor_type(torch.DoubleTensor)
综合上面的,可以看到,.tensor(data)是把现成的数据转化为张量,而.FloatTensor(shape)和.Tensor(shape)是生成某个特定维度的张量。
6 张量的长度
利用python中的内置函数len,可以测量张量第一个维度的长度(即“一级子目录”的数量),相当于size(0),但len返回的是一个纯数字
a = torch.rand(50, 8)
b = torch.rand(2, 5, 6)
print(len(a))
print(len(b))
输出
50
2
7 numpy数组与pytorch的tensor的转化
(1)numpy转化为tensor
a 使用torch.from_numpy()函数(共享内存)
import numpy as np
import torch
a = np.arange(10).reshape(2, 5)
b = torch.from_numpy(a)
a[1, 3] = 100
print(a)
print(b)
输出
[[ 0 1 2 3 4]
[ 5 6 7 100 9]]
tensor([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 100, 9]], dtype=torch.int32)
b 使用torch.tensor()(拷贝一份,不共享内存)
import numpy as np
import torch
a = np.arange(10).reshape(2, 5)
# b = torch.from_numpy(a)
b = torch.tensor(a)
a[1, 3] = 100
print(a)
print(b)
输出
[[ 0 1 2 3 4]
[ 5 6 7 100 9]]
tensor([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]], dtype=torch.int32)
(2)将tensor转化为numpy
a 使用torch.numpy(ndarray)(共享内存)
b 使用np.array(torch.tensor)(拷贝一份,不共享内存)
import numpy as np
import torch
b = torch.arange(10).reshape(2, 5)
c = b.numpy()
d = np.array(b)
b[1, 3] = 100
print(20*'-','b', 20*'-')
print(b)
print(20*'-','c', 20*'-')
print(c)
print(20*'-','d', 20*'-')
print(d)
输出
-------------------- b --------------------
tensor([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 100, 9]])
-------------------- c --------------------
[[ 0 1 2 3 4]
[ 5 6 7 100 9]]
-------------------- d --------------------
[[0 1 2 3 4]
[5 6 7 8 9]]
8 Python知识补充
(1)isinstance()
isinstance(a, FloatTensor) 判断数据a是否为FloatTensor类
(2)enumerate()
enumerate()函数 可以给原来的列表、元组、字符串带上索引,变成枚举类型。可以用list函数将枚举类型对象转换成列表。
(3)iter()与next()
这两种方法经常一起使用
next(iterable[, default])
iterable – 可迭代对象,得是用iter方法封装后的容器
default – 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。
# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
print(x)
except StopIteration:
# 遇到StopIteration就退出循环
break
输出
1
2
3
4
5
8 总结
(1)本课回顾
1 pytorch的常用数据类型(张量类型)有哪些?CUDA中的类型有哪些?
2 数据的维度数是什么意思,它和size的差别是什么?0维数据怎么生成?
如果a是二维的,那么a[0,0]是标量还是长度为1的向量?具体到元素的,都是标量
如何获取a中第二个维度的长度?
3 如何获取数据的维度数、形状、元素个数等信息
4 假如a是一个张量,那么type(a)和a.type()分别表示什么?
5 初始化张量.tensor(),.FloatTensor(),.Tensor()的用法区别
6 len(a)返回的是张量的元素总数,还是a的第一个维度的长度?
7 tensor与numpy如何实现互相转换(不共享内存)
(2)要求掌握
1 如何用[2, 3, 4]初始化一个张量?
a = torch.tensor([2, 3, 4])
2 获得张量在pytorch中的数据类型
a.type()
3 获得张量的形状
a.shape或a.size()
4 读取张量指定位置的元素
a = torch.rand(2,3)
print(a[1, 0])
5 torch中有多少种数据类型?
6种,三整两实加布尔
6 tensor与numpy相互转化(不共享内存)
tensor——>numpy np.array()
numpy——>tensor torch.tensor()