参考内容
本章代码:
https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson1/tensor_introduce1.py
安装 PyTorch
第一部分是 cuda 版本或者 cpu,第二部分是 PyTorch 版本号,第三部分是 Python 版本号,第四部分是操作系统。
cu92/torch-1.5.0%2Bcu92-cp37-cp37m-linux_x86_64.whl
Tensor 中文为张量。张量的意思是一个多维数组,它是标量、向量、矩阵的高维扩展。
标量可以称为 0 维张量,向量可以称为 1 维张量,矩阵可以称为 2 维张量,RGB 图像可以表示 3 维张量。你可以把张量看作多维数组。
在 PyTorch 0.4.0 之前,torch.autograd 包中存在 Variable 这种数据类型,主要是用于封装 Tensor,进行自动求导。Variable 主要包含下面几种属性。
1. 直接创建 Tensor
torch.tensor()
torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)
代码示例:
arr = np.ones((3, 3))
print("ndarray的数据类型:", arr.dtype)
# 创建存放在 GPU 的数据
# t = torch.tensor(arr, device='cuda')
t= torch.tensor(arr)
print(t)
输出为:
ndarray的数据类型: float64
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
torch.from_numpy(ndarray)
从 numpy 创建 tensor。利用这个方法创建的 tensor 和原来的 ndarray 共享内存,当修改其中一个数据,另外一个也会被改动。
代码示例:
arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)
# 修改 array,tensor 也会被修改
# print("\n修改arr")
# arr[0, 0] = 0
# print("numpy array: ", arr)
# print("tensor : ", t)
# 修改 tensor,array 也会被修改
print("\n修改tensor")
t[0, 0] = -1
print("numpy array: ", arr)
print("tensor : ", t)
输出为:
修改tensor
numpy array: [[-1 2 3]
[ 4 5 6]]
tensor : tensor([[-1, 2, 3],
[ 4, 5, 6]], dtype=torch.int32)
2. 根据数值创建 Tensor
torch.zeros()
torch.zeros(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
代码示例:
out_t = torch.tensor([1])
# 这里制定了 out
t = torch.zeros((3, 3), out=out_t)
print(t, '\n', out_t)
# id 是取内存地址。最终 t 和 out_t 是同一个内存地址
print(id(t), id(out_t), id(t) == id(out_t))
输出是:
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
2984903203072 2984903203072 True
torch.zeros_like
torch.zeros_like(input, dtype=None, layout=None, device=None, requires_grad=False, memory_format=torch.preserve_format)
功能:根据 input 形状创建全 0 张量
同理还有全 1 张量的创建方法:torch.ones(),torch.ones_like()。
torch.full(),torch.full_like()
torch.full(size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False
功能:创建自定义数值的张量
代码示例:
t = torch.full((3, 3), 1)
print(t)
输出为:
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
torch.arange()
torch.arange(start=0, end, step=1, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
功能:创建等差的 1 维张量。注意区间为[start, end)。
代码示例:
t = torch.arange(2, 10, 2)
print(t)
输出为:
tensor([2, 4, 6, 8])
torch.linspace()
torch.linspace(start, end, steps=100, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
功能:创建均分的 1 维张量。数值区间为 [start, end]
代码示例:
# t = torch.linspace(2, 10, 5)
t = torch.linspace(2, 10, 6)
print(t)
输出为:
tensor([ 2.0000, 3.6000, 5.2000, 6.8000, 8.4000, 10.0000])
torch.logspace()
torch.logspace(start, end, steps=100, base=10.0, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
功能:创建对数均分的 1 维张量。数值区间为 [start, end],底为 base。
代码示例:
# t = torch.logspace(2, 10, 5)
t = torch.logspace(2, 10, 6)
print(t)
输出为:
tensor([ 2.0000, 3.6000, 5.2000, 6.8000, 8.4000, 10.0000])
torch.eye()
torch.eye(n, m=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
功能:创建单位对角矩阵( 2 维张量),默认为方阵
3. 根据概率创建 Tensor
torch.normal()
torch.normal(mean, std, *, generator=None, out=None)
功能:生成正态分布 (高斯分布)
有 4 种模式:
# mean:标量 std: 标量
# 这里需要设置 size
t_normal = torch.normal(0., 1., size=(4,))
print(t_normal)
输出为:
tensor([0.6614, 0.2669, 0.0617, 0.6213])
代码示例:
# mean:张量 std: 标量
mean = torch.arange(1, 5, dtype=torch.float)
std = 1
t_normal = torch.normal(mean, std)
print("mean:{}\nstd:{}".format(mean, std))
print(t_normal)
输出为:
mean:tensor([1., 2., 3., 4.])
std:1
tensor([1.6614, 2.2669, 3.0617, 4.6213])
这 4 个数采样分布的均值不同,但是方差都是 1。
代码示例:
# mean:张量 std: 张量
mean = torch.arange(1, 5, dtype=torch.float)
std = torch.arange(1, 5, dtype=torch.float)
t_normal = torch.normal(mean, std)
print("mean:{}\nstd:{}".format(mean, std))
print(t_normal)
输出为:
mean:tensor([1., 2., 3., 4.])
std:tensor([1., 2., 3., 4.])
tensor([1.6614, 2.5338, 3.1850, 6.4853])
其中 1.6614 是从正态分布 N ( 1 , 1 ) N(1,1) N(1,1) 中采样得到的,其他数字以此类推。
torch.randn() 和 torch.randn_like()
torch.randn(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
功能:生成标准正态分布。
torch.rand() 和 torch.rand_like()
torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
功能:在区间 [0, 1) 上生成均匀分布。
randint(low=0, high, size, *, generator=None, out=None,
dtype=None, layout=torch.strided, device=None, requires_grad=False)
功能:在区间 [low, high) 上生成整数均匀分布。
torch.randperm()
torch.randperm(n, out=None, dtype=torch.int64, layout=torch.strided, device=None, requires_grad=False)
功能:生成从 0 到 n-1 的随机排列。常用于生成索引。
torch.bernoulli()
torch.bernoulli(input, *, generator=None, out=None)
功能:以 input 为概率,生成伯努利分布 (0-1 分布,两点分布)