学习网易云课堂上pytorch课堂,大多参考笔记总结,添加了自己的一些总结
从numpy创建
import torch
import numpy as np
a = np.array([2, 3.3])
a = torch.from_numpy(a) # torch.DoubleTensor
从list创建
a = torch.FloatTensor([2, 3.3]) # 尽量少用这种方式,容易和给shape的情况看混淆
b = torch.tensor([2, 3.3]) # 现有list时尽量用这种方式
数据量不是很大的时候
注意
- 小写的
tensor
只接受现有的数据; - 而大写的
Tensor
相当于就是FloatTensor,既可以接收现有的数据,也可以接受shape来创建指定形状的Tensor。
仅指定维度的初始化(未初始化)
前面都提供了里面元素的具体值,也可以按照shape来创建,而先不为其提供具体值。
# 生成2行3列的数据
a = torch.empty(2, 3)
b = torch.FloatTensor(2, 3)
c = torch.IntTensor(2, 3)
未初始化里面也有数据,但是非常不规则,可能包含无穷大或负无穷大数字。尽量使用随机初始化
修改tensor的默认类型
使用torch.tensor
传入浮点数元素,或者使用torch.Tensor
仅指定维度时,生成的默认是FloatTensor,也可以修改默认设置使其默认是其它类型的。
print(torch.tensor([1, 2.2]).type())
torch.set_default_tensor_type(torch.DoubleTensor)
print(torch.tensor([1, 2.2]).type())
运行结果:
torch.FloatTensor
torch.DoubleTensor
随机初始化
# 采样自0~1均匀分布
a = torch.rand(3, 3)
# 形如*_like接受一个Tensor,将这个Tensor的shape读取出来之后在送入*所表示的函数
# 下面的rand_like(a)即将a的shape=3,3读出来传给torch.rand()函数
b = torch.rand_like(a) # 相当于执行了torch.rand(3,3)
# 在区间[1,10)上随机采样,生成shape=2,2的LongTensor
c = torch.randint(1, 10, [2, 2])
# 采样自N(0,1),正态分布
d = torch.randn(3, 3)
使用相同元素构建
# shape=2,3,所使用的相同的元素为7
b = torch.full([2, 3], 7)
指定参数的正态分布
# 指定均值和标准差
a = torch.normal(mean=torch.full([10], 0), std=torch.arange(1, 0, -0.1))
arange
生成等差数列,[0,8),步长2。注意torch.range()
是包含结尾的,但是已经被弃用了,一律用arange就好
c = torch.arange(0, 8, 2) # tensor([0, 2, 4, 6])
linespace
也是等差数列,包含结尾[0, 8],但最后一个参数的意思按照多少份等分切割,并不是步长
c = torch.linespace(0, 8, 4) # tensor([0.0000, 2.6667, 5.3333, 8.0000])
logspace
从10的n次方取到10的m次方,指数是等差的,也就是元素值是等比的。
e = torch.logspace(0, -1, 5) # tensor([1.0000, 0.5623, 0.3162, 0.1778, 0.1000])
全0
a = torch.zeros([3, 4])
全1
b = torch.ones([3, 4])
对角阵
c = torch.eye(3, 4) # 只能是二维的,传入dim=2的shape
也可以只给一个参数n,得到的就是n阶的对角方阵。
randperm
使用randperm可以生成一个从0开始的、已经打乱的连续索引Tensor,用它可以对其它Tensor做shuffle。特别是在有几个需要保持一致顺序的Tensor时,用相同的索引Tensor就能保证shuffle之后的Tensor在那个维度上的顺序一致了。
import torch
# 两个Tensor的shape[0]是相同的,都是3
a = torch.rand(3, 1)
b = torch.rand(3, 1)
print(a, b, sep='\n')
print("-" * 20)
# 制造一个[0,3)的索引序列
idx = torch.randperm(3)
print(idx)
print("-" * 20)
# 给a,b做shuffle,保证第一个维度在shuffle后的对应关系不变
a_sf = a[idx]
b_sf = b[idx]
print(a_sf, b_sf, sep='\n')