1.4.初见PyTorch
1.4.1.PyTorch生态
1.4.2.PyTorch能做什么?
GPU加速
自动求导
常用网络层
nn.Linear
nn.Conv2d
nn.LSTM
nn.ReLU
nn.Sigmoid
nn.Softmax
nn.CrossEntropyLoss
nn.MSE
1.4.3.PyTorch之Autograd
以下部分来自:https://www.cnblogs.com/xueqiuqiu/p/7513721.html
在PyTorch中,autograd是所有神经网络的核心内容,为Tensor所有操作提供自动求导方法。
它是一个按运行方式定义的框架,这意味着backprop是由代码的运行方式定义的。
1.4.3.1.Variable
autograd.Variable是autograd中最核心的类。它包装了一个Tensor,并且几乎支持所有在其上定义的操作。一旦完成了你的运算,你可以调用.backward()来自动计算出所有的梯度。
Variable有三个属性:data , grad以及creator。
访问原始的tensor使用属性.data; 关于这一Variable的梯度则集中于 .grad; .creator反映了创建者,标识了是否由用户使用.Variable直接创建(None)。
还有一个对autograd的实现非常重要的类—Function。Variable和Function数是相互关联的,并建立一个非循环图,从而编码完整的计算过程。每个变量都有一个.grad_fn属性引用创建变量的函数(除了用户创建的变量,它们的grad_fn是None)。
# -*- coding: UTF-8 -*-
import torch
from torch.autograd import Variable
创建变量X:
x = Variable(torch.ones(2, 2), requires_grad=True)
print(x)
输出结果:
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
在X基础上进行运算:
y = x + 2
print(y)
输出结果:
tensor([[3., 3.],
[3., 3.]], grad_fn=<AddBackward0>)
查看x的grad_fn:
print(x.grad_fn)
输出结果为:
None
查看y的grad_fn:
print(y.grad_fn)
输出结果为:
<AddBackward0 object at 0x000001BA69C73E48>
可以看到y是作为运算的结果产生的,所以y有grad_fn,而x是直接创建的,所以x没有grad_fn。
在y基础上进行运算:
z = y * y * 3 #前两个相当于是矩阵相乘
out = z.mean()
print(z)
print(out)
输出结果为:
tensor([[27., 27.],
[27., 27.]], grad_fn=<MulBackward0>)
tensor(27., grad_fn=<MeanBackward0>)
1.4.4.autograd案例
# -*- coding: UTF-8 -*-
import torch
from torch import autograd
x = torch.tensor(1.)
a = torch.tensor(1., requires_grad=True)
b = torch.tensor(2., requires_grad=True)
c = torch.tensor(3., requires_grad=True)
y = a**2 * x + b ** 3 * x + c
print('before:', a.grad, b.grad, c.grad)
# 分别对a,b,c求导(对某个值进行求导的时候,别的作为常量)
grads = autograd.grad(y, [a, b, c])
print('after :', grads[0], grads[1], grads[2])
运行结果:
before: None None None
after : tensor(2.) tensor(12.) tensor(1.)
1.4.5.GPU加速案例
# -*- coding: UTF-8 -*-
import torch
import time
print(torch.__version__)
print(torch.cuda.is_available())
a = torch.randn(10000, 1000)
b = torch.randn(1000, 2000)
t0 = time.time()
c = torch.matmul(a, b)
t1 = time.time()
print(a.device, t1 - t0, c.norm(2))
# 使用cuda
device = torch.device('cuda')
a = a.to(device)
b = b.to(device)
t0 = time.time()
c = torch.matmul(a, b)
t2 = time.time()
print(a.device, t2 - t0, c.norm(2))
t0 = time.time()
c = torch.matmul(a, b)
t2 = time.time()
print(a.device, t2 - t0, c.norm(2))