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)

显示结果:
PyTorch学习笔记 1. 安装配置和一些基本概念_linux

随机数初始化

from __future__ import print_function
import torch as t

x = t.rand(5,4)
print(x)

PyTorch学习笔记 1. 安装配置和一些基本概念_深度学习_02

显示Tensor的形状

print(x.size())

PyTorch学习笔记 1. 安装配置和一些基本概念_linux_03

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)

PyTorch学习笔记 1. 安装配置和一些基本概念_数据结构_04
加法还可以写成:

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的数据结构如下:
PyTorch学习笔记 1. 安装配置和一些基本概念_pytorch_05
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>