PyTorch学习笔记 1. 安装配置
本文学习资源《深度学习框架 PyTorch入门与实践》,陈云编著,电子工业出版社
一、 学习环境
- CentOS7
二、安装conda
wget https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh
chmod +x Anaconda3-2020.11-Linux-x86_64.sh
./Anaconda3-2020.11-Linux-x86_64.sh
按提示安装即可。
三、安装PyTorch包
1. 新建一个conda虚拟环境
conda create -n pytorch python=3.7
conda env list
conda activate pytorch
2. 安装PyTorch包
pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple torchvision
pip install --upgrade numpy
3. 测试
python
>>> import torch as t
没有报错则安装成功。
四、一些基本概念
1. 张量 Tensor
Tensor是PyTorch中重要的数据结构,可以理解为一个高维数组。表现形式可能是一个标量、一维数组、二维数组或更高维的数组。
Tensor和numpy的ndarrays类似,但Tensor可以使用GPU加速。
分配张量空间:
from __future__ import print_function
import torch as t
# 只分配空间,未执行初始化
x = t.Tensor(5,4)
print(x)
显示结果:
随机数初始化
from __future__ import print_function
import torch as t
x = t.rand(5,4)
print(x)
显示Tensor的形状
print(x.size())
Tensor加法
from __future__ import print_function
import torch as t
x = t.rand(5,4)
y = t.rand(5,4)
print(x)
print(y)
print(x+y)
加法还可以写成:
t.add(x,y)
或
result = t.Tensor(5,4)
t.add(x,y,out=result) # 输出到result变量
add_
- 如果使用 y.add(x) , y不改变,返回一个新值。
- 如果使用 y.add_(x) , 则y会改变。
GPU运算支持
if t.cuda.is_available():
x = x.cuda()
y = y.cuda()
print(x+y)
跟踪张量操作
定义Tensor时,如果设置属性 .requires_grad为True,那么它将会追踪对于该张量的所有操作。
当完成计算后可以通过调用.backward()来自动计算所有的梯度。这个张量的所有梯度将会自动累加到.grad属性。
要阻止一个张量被跟踪历史,可以调用.detach()方法将其与计算历史分离。
使用代码块with torch.no_grad():
也可以防止跟踪历史。
import torch
# 创建一个张量并设置requires_grad=True用来追踪其计算历史
x = torch.ones(2, 2, requires_grad=True)
print(x)
2. Autogra 自动微积分
PyTorch的Autograd模块实现了微分运算。
autograd.Variable是Autogra中的核心类,它内部封装了Tensor。Tensor在被封装为Variable后,可以调用它的.backward实现反向传播,自动计算所有梯度。
Variable的数据结构如下:
Variable主要包含三个属性:
- data 保存Variable 所包含的 Tensor。
- grad 保存data对应的梯度,grad 也是个Variable,而不是Tensor,它和data的形状一样。
- grad_fn 指向一个Function对象,这个Function用来反向传播计算输入的梯度。
import torch
from torch.autograd import Variable
a=Variable(torch.Tensor([1]),requires_grad=True)
b=Variable(torch.Tensor([2]),requires_grad=True)
c=Variable(torch.Tensor([3]),requires_grad=True)
d=a+b
e=d+c
e.backward()
print(d.grad) # 中间梯度值不保存,为空
print(a.grad_fn) # 第一个节点的.grad_fn为空
print(e.grad_fn) # <AddBackward0 object at 0x7f88153d6250>