PyTorch学习笔记(一)
来自 https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html
PyTorch学习笔记
类似TensorFlow,PyTorch也是一个深度学习的框架,另外它也作为NumPy中的数据在GPU上运算时使用的一种替代品。
其实框架无所谓好坏,对于小白来说不去打基本功,狠狠的学上几年的深度学习的基础理论,反而一上来就使用框架也许不是一件坏事,谁不想马上看到一些成果呢?
其他框架诸如TensorFlow、Keras、scikit-learn等已经资格很老啦,PyTorch最近发展的比较火,于是打算深入了解一下。
PyTorch中的数据类型
类似TensorFlow中,也是使用张量Tensor。这里的empty、ones、zero等都是模仿numpy中的名称。注意python原生的四则运算需要替换成torch.add()这样的运算函数。
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)
- a.numpy()可以转换成Numpy数组。
- torch.from_numpy()可以转换成Tensor。
如果想把数据放在GPU上运算呢?很简单,一个to()函数就行了。
if torch.cuda.is_available():
device = torch.device("cuda") # a CUDA device object
y = torch.ones_like(x, device=device) # directly create a tensor on GPU
x = x.to(device) # or just use strings ``.to("cuda")``
z = x + y
print(z)
print(z.to("cpu", torch.double)) # ``.to`` can also change dtype together!
自动求梯度
autograd包是PyTorch的关键,torch.Tensor是基本的数据单元。
Tensor的grad、requires_grad、grad_fn(一个Function对象)等属性都跟梯度有关。(Tensor和Funciton构成一个无环图,上面编码了完整的计算历史)
x = torch.ones(2, 2, requires_grad=True)
y = x + 2
z = y * y * 3
out = z.mean()
可以打印验证y、z的grad_fn属性都是存在的。一个是加,一个是乘,这里的grad_fn指的是产生这个Tensor的函数。
然后:
out.backward()
print(x.grad)
就会打印:
tensor([[4.5000, 4.5000],
[4.5000, 4.5000]])
这里out对x的梯度就能得到了。