pytorch学习笔记(一)

93 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

目前,对于图像的操作多涉及一些矩阵运算,numpy作为一个科学计算库,为一些科学计算提供了许多便捷的接口,但其无法直接调用cuda平台进行快速计算,torch的出现就是为了弥补这些问题。

为了能够方便的将两者的优点进行放大,numpy与torch之间可以方便的进行转换,如下面例子所示。

import torch
import numpy as np


a = torch.ones([5, 3])
b = np.ones([5, 3])
print(a, type(a))
print(b, type(b))

运行结果如下

image.png

在上面代码的基础上,使用torch.from_numpy()和np.array()分别可以实现numpy转tensor和tensor转numpy的过程。

在上面代码的基础上,继续执行下面的代码

c = torch.from_numpy(b)
print(c, type(c))

d = np.array(a)
print(d, type(d))

会得到如下的结果

image.png

表示我们将原来的tensor和numpy格式进行了互换。

由于torch操作的都是张量,因此在进行计算时我们需要将张量转移到GPU中,在后面很多深度学习框架的代码很容易见到,也就是下面几行代码。

if torch.cuda.is_available():
    a = a.cuda()
    c = c.cuda()
    t2 = time.time()
    print(a+c+(a*c)*(a*c))
    t3 = time.time()
    print(t3-t2)

得到下面的计算结果

image.png 其中divice='cuda:0'就是当前执行运算的GPU编号。

介绍的上面的操作都属于基础,下面主要介绍自动求导的相关函数及其作用。

首先,明确一下自动求导的包叫什么。autograd包,就是自动求导所使用的,作为一个运动时定义的框架,反向传播根据我们代码如何运行来定义的,每次的迭代过程可能有所不同。

既然求导的概念都已经引出,那么变量自然是必不可少的,在torch中autograd.Variable支持几乎所有的张量操作,另外求梯度的时候可以通过.backward()方法自动计算。

x = Variable(torch.ones(3, 3), requires_grad=True)
print(x, type(x))
y = x + 3
print(y)
z = y*y*y*7
print(z)
rest = z.mean()
print(rest)
rest.backward()
print(rest)
print(x.grad)

image.png

这个求梯度的过程实际上就是带入换元然后求导的过程,对rest求x的梯度,首先

rest=(yyy*7)*9/9

y = x+3

这样对rest求x的偏导,利用链式法则,就等于rest对y求偏导,然后y对x求偏导。所以最后得到37.3333。

torch为搭建一些网络框架提供了非常便捷的函数,同样也为计算梯度封装好了计算过程,下篇博客我们就零开始,学习如何利用torch搭建一个简单的神经网络,然后利用一些简单的小型数据集来训练我们的网络,最后通过验证,查看训练的效果如何。