pyTorch 快速入门

前言:
疫情太严重推迟开学了,可能三月份甚至四月份才开学,这个寒假真长,利用这段时间在家学点东西。如果足够自律,就能够充分利用时间;如果足够自律,就能不断地补充自己的不足;如果足够自律,就能扎实深度学习理论基础;如果足够自律,就能进一步提升代码能力。

这一年,希望自己能够自律些,一步步靠近合格的算法工程师。

这几天,我对《动手学深度学习 pyTorch版》这本书很感兴趣,但不熟悉pyTorch,所以快速学习一下,作为pyTorch的入门,附上pytorch的官方链接https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html#sphx-glr-beginner-blitz-tensor-tutorial-py

1. pyTorch简单介绍

pyTorch 类似于numpy,而pyTorch中的Tensors和NumPy的ndarray是相似的。

2.基本操作

(1)声明一个未初始化的矩阵,但在使用前不包含确定的已知值。

x = torch.empty(5, 3)
print(x)
tensor([[2.3576e-36, 0.0000e+00, 0.0000e+00],
        [0.0000e+00, 0.0000e+00, 0.0000e+00],
        [0.0000e+00, 0.0000e+00, 2.8026e-45],
        [0.0000e+00, 1.1210e-44, 0.0000e+00],
        [1.4013e-45, 0.0000e+00, 0.0000e+00]])

(2)构造一个随机初始化的矩阵

x = torch.rand(5, 3)
print(x)
tensor([[0.2031, 0.8195, 0.2181],
        [0.4732, 0.4602, 0.8097],
        [0.6037, 0.4483, 0.2570],
        [0.1677, 0.1944, 0.7259],
        [0.3056, 0.8363, 0.1282]])

(3)构造一个元素全部为零,类型为 long的矩阵

x = torch.zeros(5, 3, dtype=torch.long)
print(x)
tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])

(4)直接以数据来构造张量

x = torch.tensor([5.5, 3])
print(x)
tensor([5.5000, 3.0000])

(5)基于现有张量来创建张量(除非用户提供新的值,否则这些方法将会重用现有张量的属性,例如 dtype)

x = x.new_ones(5, 3, dtype=torch.double)      # new_* methods take in sizes
print(x)

x = torch.randn_like(x, dtype=torch.float)    # override dtype!与上面的Xsize相同
print(x)  
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)
        
tensor([[-0.0929,  0.9791,  0.1481],
        [-1.7100,  0.4316, -0.4209],
        [-0.6479,  1.5173, -0.3646],
        [-1.3288,  2.6447, -0.6539],
        [-0.0300,  1.8167,  0.8633]])
print(x.size())
torch.Size([5, 3])

(6)矢量加减乘除运算

y = torch.rand(5, 3)
#法一
print(x + y)

#法二
print(torch.add(x, y))

#法三
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)

#法四
y.add_(x)
print(y)

运算后结果一样

tensor([[ 0.4184,  0.6502,  0.3735],
        [ 2.0532,  0.1959,  0.6630],
        [ 1.6664,  0.4967,  0.7961],
        [ 0.8452,  1.1509,  0.6831],
        [ 1.0740,  0.8284, -0.2371]])
tensor([[ 0.4184,  0.6502,  0.3735],
        [ 2.0532,  0.1959,  0.6630],
        [ 1.6664,  0.4967,  0.7961],
        [ 0.8452,  1.1509,  0.6831],
        [ 1.0740,  0.8284, -0.2371]])
tensor([[ 0.4184,  0.6502,  0.3735],
        [ 2.0532,  0.1959,  0.6630],
        [ 1.6664,  0.4967,  0.7961],
        [ 0.8452,  1.1509,  0.6831],
        [ 1.0740,  0.8284, -0.2371]])
tensor([[ 0.4184,  0.6502,  0.3735],
        [ 2.0532,  0.1959,  0.6630],
        [ 1.6664,  0.4967,  0.7961],
        [ 0.8452,  1.1509,  0.6831],
        [ 1.0740,  0.8284, -0.2371]])

(7)可以类似于NumPy的索引

print(x[:, 1])
tensor([ 0.5996, -0.0382,  0.4017,  0.5467,  0.2213])

(8)调整大小
调整张量大小,可使用torch.view:

x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)  # -1的意思是从其他维度来推断
print(x.size(), y.size(), z.size())
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])

(9)如果只有一个元素的张量,可使用.item()获取该值

x = torch.randn(1)
print(x)
print(x.item())
tensor([-0.4073])
-0.40732377767562866

(10)Torch张量与NumPy数组的转换

# torch转为numpy
a = torch.ones(5)
print(a)
b = a.numpy()
print(b)

tensor([1., 1., 1., 1., 1.])
[1. 1. 1. 1. 1.]
# numpy转为torch
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)


[2. 2. 2. 2. 2.]
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)

你可能感兴趣的:(pyTorch)