04_Pytorch生态、PyTorch能做什么、PyTorch之Autograd、autograd案例、GPU加速案例

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))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涂作权的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值