一文带你入门PyTorch

文章目录

  • 1 PyTorch简介
  • 2 PyTorch张量
  • 3 PyTorch的自动求导机制
    • 3.1单变量求导
    • 3.2多变量求导与链式求导

1 PyTorch简介

一文带你入门PyTorch_第1张图片

PyTorch 是一个开源的机器学习库,提供了强大的计算能力和灵活的用于构建和训练神经网络的工具。它的核心特点包括:

动态图计算:与其他机器学习库(如 TensorFlow)不同,PyTorch 允许在运行时动态构建计算图,这使得可以使用 Python 控制流操作(如 if、for、while)来构建模型。

快速 GPU 加速:PyTorch 提供了与 CUDA 相关的 API,可以使用 GPU 加速计算。这使得可以使用 PyTorch 训练大型深度学习模型,而无需太多编码工作。

简单易用:PyTorch 提供了丰富的 API 和数据结构,使得机器学习任务变得简单易用。同时,它还与其他机器学习库(如 NumPy)相集成,使得可以方便地将 PyTorch 与其他库集成在一起。

PyTorch 适用于各种机器学习任务,包括图像分类、自然语言处理、生成对抗网络(GAN)等。它已被广泛应用于学术界和工业界,并被许多公司和组织用于实际应用中。

2 PyTorch张量

正常情况下,我们会直接定义一个变量以及进行变量的加减。

x = 10
y = 2*x*x+3
print(x,y)
# 10 103

但如果使用Pytorch定义变量的话,会以张量(tensor)的形式存在。使用张量进行赋值计算的新变量,也会成为张量。

x = torch.tensor(10)
print(x)
#tensor(10)

y = 2*x*x+3
print(y)
#tensor(203)

在深度学习里,Tensor实际上就是一个多维数组(multidimensional array)。而Tensor的目的是能够创造更高维度的矩阵、向量。

3 PyTorch的自动求导机制

3.1单变量求导

自动求导机制是PyTorch相比numpy的最重要区别之一。我们在创建张量的时候,需要给Torch一个额外的参数:require_grad=True。这个参数的意思是:梯度反传时对该 Tensor 计算梯度。

x = torch.tensor(10.0, requires_grad=True)
print(x)

此时的打印结果是tensor(10., requires_grad=True)。可以发现上面的代码输入的还是10,这次我改成了10.0,是因为如果进行求导的话,torch要求的数据格式是float类型而不能是int类型。

y = 2*x*x+3
print(y)

此时的打印结果是tensor(203., grad_fn=),可以看到y也随之发生了变化。接下来我们来计算梯度。

y.backward()
print(x.grad)

此时的打印结果是tensor(200.),这里backward函数完成了计算梯度工作,而x.grad则为在x点的梯度值。

3.2多变量求导与链式求导

在实际的神经网络建模中,一定不只一个节点和一个中间层,因此多变量求导与链式求导是常态,Torch对此也是完美支持。
假设此时我们增加一个变量z,z是y的函数,y是x的函数,那么当我们需要求dz/dx时,就需要用来链式求导法则。

import torch

x = torch.tensor(10.0, requires_grad=True)

y = 2*x*x+3
z = 5*y+6

z.backward()
print(x.grad)
# tensor(200.)

这个结果与dz/dy * dy/dx 完全相同。
接下来让上面的函数变的更复杂些,加入变量a与b,函数间的关系如下:
一文带你入门PyTorch_第2张图片
这同时也和神经网络更像了,可以把x和a想象成输入层,y和b想象成隐含层,z想象成输出层。如果我们需要求dz/dx,那需要对所有的途径分别求导并相加,也就是: d z d x = d z d y ∗ d y d x + d z d b ∗ d b d x \frac{dz}{dx}=\frac{dz}{dy}*\frac{dy}{dx}+\frac{dz}{db}*\frac{db}{dx} dxdz=dydzdxdy+dbdzdxdb
Torch同样可以轻松完成以上操作。

import torch

a = torch.tensor(5.0,requires_grad=True)
x = torch.tensor(10.0, requires_grad=True)

y = 2*x*x+3*a
b = 6*x*a

z = y*y+1/(b*y)

z.backward()
print(x.grad)
# tensor(17200.)

可以看到,PyTorch会根据我们输入的变量关系,计算出z对x的导数。

以上内容并未覆盖Pytorch的全部内容,但是包含了神经网络建模的大多知识点与相关思想。如果希望进一步了解Pytorch,可以查看下一篇博文,如何使用Pytorch搭建一个简单的三层神经网络模型(撰写中)。

你可能感兴趣的:(深度学习,#,对抗神经网络,pytorch,深度学习)