Pytorch包类型:tensor
1、输入
1.1 arange reshape
import torch
a=torch.arange(16).reshape(1,1,4,4)
# a = torch.tensor([[[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]]])
print(a)
1.2 randint clamp
torch.randint(low, high, size):随机生成指定范围 [low,high) 的 size 大小的整数 tensor
→ numpy → uniform
clamp:将输入的tensor的每个元素限制到特定区域,输出新的tensor
| min, if xi < min
yi = | xi, if min <= xi <= max
| max, if xi > max
import torch
a=torch.randint(low=0,high=10,size=(5,2))
print(a)
a=torch.clamp(a,3,7)
print(a)
import random
a = random.randint(1,10) # 生成1-10之间的随机整数,包括 1 和 10
1.3 dtype size
shape???(TBD)
tensor.dtype:查看tensor的类型
tensor.size():查看tensor的size
tensor.size(0):查看tensor第一维度的size
import torch
a = torch.tensor([1,2,-100], dtype=torch.bool)
print(a) # tensor([True, True, True])
print(a.dtype,a.size())
b = a.long()
print(b) # tensor([1, 1, 1])
print(b.dtype) # torch.int64
1.4 empty ones_like zeros_like
import torch
input = torch.empty(2, 3)
a = torch.ones_like(input)
print(input)
print(a)
1.5 cat stack vstack hstack
cat 只是拼接不升维
stack的dim还是没有太搞懂,反正会升一个维度。(TBD)
import torch
a = torch.ones((2,3))
b = torch.arange(6).reshape((2,3))
c = torch.cat((a,b))
print(c)
c = torch.cat((a,b),dim=1)
print(c)
c = torch.stack((a,b))
print(c)
c = torch.stack((a,b),dim=1)
print(c)
c = torch.stack((a,b),dim=2)
print(c)
c = torch.vstack((a,b)) # 等同于 c = torch.cat((a,b))
print(c)
c = torch.hstack((a,b)) # 等同于c = torch.cat((a,b),dim=1)
print(c)
注意:高版本的torch不再支持vstack、hstack
1.6 flatten
flatten(data, start_dim, end_dim) 给tensor型的数据降维,end_dim省略的话等于最高维
import torch
a = torch.arange(24).reshape(2,3,4)+1
print(a)
b = torch.flatten(a,0) # 将tensor的0-2维度拼接:24
print(b)
b = torch.flatten(a,1) # 将tensor的1-2维度拼接:2×12
print(b)
b = torch.flatten(a,2) # 将tensor的2-2维度拼接:2×3×4
print(b)
b = torch.flatten(a,0,1) # 将2×3×4变成6×4
print(b)
b = torch.flatten(a,1,2) # 将2×3×4变成2×12
print(b)
1.7 shape size
a.shape
a.size()
# 二者含义相同
2、数据类型转换
- Tensor 的 int、float 数据类型转换
- 在Tensor后加
.long()
,.int()
,.float()
,.double()
等即可- Tensor 与 numpy 数据类型转换:
- Tensor → Numpy 使用
data.numpy()
,data为Tensor变量- Numpy → Tensor 使用
torch.from_numpy(data)
,data为numpy变量- Tensor 与 Python 数据类型转换:
- Tensor → 单个Python数据,使用
data.item()
,data为Tensor变量且只能为包含单个数据- Tensor → Python list,使用
data.tolist()
,data为Tensor变量,返回shape相同的可嵌套的list- 剥离出一个tensor
参与计算,但不参与求导
:data.detach()
- Tensor 在 gpu 和 cpu 上存储转换:
- cpu → gpu 使用
data.cuda()
,data为Tensor变量- gpu → cpu 使用
data.cpu()
,data为Tensor变量
2.0 type type_as
用于tensor类型转换,后面有空补充案例(TBD)
2.1 item tolist
tensor.item():将只有一个元素的tensor转换为标量。
tensor.tolist():将tensor转换为shape相同列表。
import torch
x = torch.tensor([1])
print(x.dtype)
print(x.item())
print(type(x.item()))
y = torch.tensor([2,3,4,5])
print(y.tolist())
print(type(y.tolist()))
2.2 .clone() .detach() .data
tensor.clone():深拷贝,clone后创建一个新的地址存放数据。
tensor.detach():浅拷贝,剥离出的 tensor 参与计算,但不参与求导(相当于把原 tensor 的值用另一个索引拿出来了)
import torch
a = torch.tensor(1.0, requires_grad=True)
b = a.clone()
c = a.detach() #⭐detach将requires_grad 属性设置为False
a.data *= 3
b += 1
c += 1
print(a)
print(a.data)
print(a.requires_grad)
print(b)
print(c)
print(c.requires_grad)
'''
输出结果:
tensor(4., requires_grad=True)
tensor(4.)
True
tensor(2., grad_fn=<AddBackward0>)
tensor(4.) # detach()后的值随着a的变化出现变化
False
'''
3、排序 求最大最小值
3.1 sort argsort
sort:对输入数据排序,返回两个值,即
排序后的数据values
和其在原矩阵中的索引indices
argsort:同torch.sort(),但
只返回indices
1、有两种使用方式 torch.argsort(a,dim=0,descending = True)
a.argsort(descending=True)2、有两个参数 默认dim = 1 对行向量做排序,dim = 0 时对列向量排序 默认descending = False 向量升序排序
import torch
a = torch.tensor([[2,3,1],[0,5,6]])
print(a)
print('_______sort_______')
print(torch.sort(a))
print(torch.sort(a,dim=0))
print(torch.sort(a,dim=0,descending=True))
print('_______argsort_______')
print(torch.argsort(a))
print(torch.argsort(a,dim=0 ))
print(torch.argsort(a,dim=0,descending = True))
print('_______ _______')
print(a.argsort(descending=True))
3.2 max argmax min argmin
找输入数据最大/小值,返回最大/小值和对应索引。
1、同sort,有两种表示方式
torch.max(a,dim=1, keepdim=True)
a.max(dim=1, keepdim=True)2、同样有两个参数 dim=0找每一列的最大值,dim=1找每一行的最大值。 keepdim表示是否需要保持输出的维度与输入一样。
keepdim=True表示输出和输入的维度一样
keepdim=False表示输出的维度被压缩了,也就是输出会比输入低一个维度。
import torch
a = torch.tensor([[2,3,1],[0,5,6]])
print('_______max_______')
print(torch.max(a,dim=1))
print(torch.max(a,dim=1)[1].shape)
print('_______max&keepdim_______')
print(torch.max(a,dim=1, keepdim=True))
print(torch.max(a,dim=1, keepdim=True)[1].shape)
print('_______argmax_______')
print(torch.argmax(a,dim=1, keepdim=True))
import torch
a = torch.tensor([[2,3,1],[0,5,6]]) # 2x3
b = torch.tensor([[5,2,1],[3,1,4]])
print(torch.max(a,b)) # 2x3