Tensor数据类型
数据类型 | dtype | CPU tensor | GPU tensor |
---|---|---|---|
32位浮点 | torch.float32\torch.float | torch.FloatTensor | torch.cuda.FloatTensor |
64位浮点 | torch.float64\torch.double | torch.DoubleTensor | torch.cuda.DoubleTensor |
16位浮点(1) | torch.float16\torch.half | torch.HalfTensor | torch.cuda.HalfTensor |
16位浮点(2) | torch.bfloat16 | torch.BFloat16Tensor | torch.cuda.BFloat16Tensor |
32位复数 | torch.complex32 | ||
64位复数 | torch.complex64 | ||
128位复数 | torch.complex128\torch.cdouble | ||
8位无符号整型 | torch.uint8 | torch.ByteTensor | torch.cuda.ByteTensor |
8位有符号整型 | torch.int8 | torch.CharTensor | torch.cuda.CharTensor |
16位有符号整型 | torch.int16\torch.short | torch.ShortTensor | torch.cuda.ShortTensor |
32位有符号整型 | torch.int32\torch.int | torch.IntTensor | torch.cuda.IntTensor |
64位有符号整型 | torch.int64\torch.long | torch.LongTensor | torch.cuda.LongTensor |
布尔 | torch.bool | torch.BoolTensor | torch.cuda.BoolTensor |
- 16位半精度浮点是专为GPU上运行的模型设计的,以尽可能地节省GPU显存占用,但这种节省显存空间的方式也缩小了所能表达数据的大小。PyTorch中默认的数据类型是torch.FloatTensor,即torch.Tensor等同于torch.FloatTensor。
- PyTorch可以通过set_default_tensor_type函数设置默认使用的Tensor类型,在局部使用完后如果需要其他类型,则还需要重新设置回所需的类型。
例:torch.set_default_tensor_type('torch.DoubleTensor')
Tensor类型转换
1 | import torch |
Tensor的创建与维度查看
- 常规创建
例:a = torch.Tensor(2,2)
- 指定类型创建
例:a = torch.HalfTensor(2,2)
- 直接使用Python的list创建
例:a = torch.Tensor([[2,2],[3,3]])
- 创建一个元素全为0的tensor
例:a = torch.zeros(2, 2)
- 创建一个元素全为1的tensor
例:a = torch.ones(2, 2)
- 创建一个对角线元素全为1的2维矩阵,行列可以不相同,可用于构造单位矩阵
例:a = torch.eye(2, 2)
- 创建一个随机tensor
例:a = torch.randon(2, 2)
- 创建一个随机排列的1维向量
例:a = torch.randperm(n)#长度为n
torch.arange(start, end, step)
创建一个从start到end,间距为step,1维向量torch.linspace(start, end, step)
创建一个从start到end,一共steps份,1维向量- 查看tensor的维度
例:a.shape
或a.size()
- 查看tensor的元素总个数
例:a.numel()
或a.nelement()
Tensor的组合与分块
torch.cat()
沿着已有的数据的某一维度进行拼接,操作后数据的总维数不变,在进行拼接时,除了拼接的维度之外,其他维度必须相同
例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21import torch
a = torch.Tensor([[2,2],[3,3]])
b = torch.Tensor([[4,4],[5,5]])
print(a)
print(b)
c = torch.cat([a,b], 0) #沿着第1维拼接
print(c)
print(c.size())
'''
result:
a = tensor([[2., 2.],
[3., 3.]])
b = tensor([[4., 4.],
[5., 5.]])
c = tensor([[2., 2.],
[3., 3.],
[4., 4.],
[5., 5.]])
c.size = torch.Size([4, 2])
'''torch.stack()
新增维度,并按照指定的维度进行叠加
例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21import torch
a = torch.Tensor([[2,2],[3,3]])
b = torch.Tensor([[4,4],[5,5]])
print(a)
print(b)
d = torch.stack([a,b],1) #沿着第1维拼接
print(d)
print(d.size())
'''
result:
a = tensor([[2., 2.],
[3., 3.]])
b = tensor([[4., 4.],
[5., 5.]])
d = tensor([[[2., 2.],
[4., 4.]],
[[3., 3.],
[5., 5.]]])
torch.Size([2, 2, 2])torch.chunk()
将Tensor分割成不同的子Tensor,需要指定分块的数量
例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16import torch
a = torch.Tensor([[2,3,4],[2,3,4]])
print(a)
# 沿着第1维进行分块,因此分割成两个Tensor,当不能整除时,最后一个的维数会小于前面的
# 因此第一个Tensor为2×2,第二个为2×1
d = torch.chunk(a,2,1)
print(d)
'''
result:
a = tensor([[2., 3., 4.],
[2., 3., 4.]])
d = (tensor([[2., 3.],
[2., 3.]]), tensor([[4.],
[4.]]))
'''torch.split()
将Tensor分割成不同的子Tensor,需要指定每一块的大小,以整型或者list来表示1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21import torch
a = torch.Tensor([[2,3,4],[2,3,4]])
print(a)
# 沿着第1维分块,每一块维度为2,因此第一个Tensor为2×2,第二个为2×1
b = torch.split(a,2,1)
print(b)
# split也可以根据输入的list进行自动分块,list中的元素代表了每一个块占的维度
c = torch.split(a,[1,2],1)
print(c)
'''
result:
a = tensor([[2., 3., 4.],
[2., 3., 4.]])
b = (tensor([[2., 3.],
[2., 3.]]), tensor([[4.],
[4.]]))
c = (tensor([[2.],
[2.]]), tensor([[3., 4.],
[3., 4.]]))
'''
money money money~ money money~
- 本文链接:http://yoursite.com/2020/08/14/DL_P6/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub Issues