🖋️【深度学习原理与PyTorch实战】实验一:PyTorch使用简介
00 分钟
2023-5-12
2023-9-1
type
status
date
slug
summary
tags
category
icon
password
Last edited time
Sep 1, 2023 04:40 AM
Created time
May 24, 2023 06:53 AM
本文介绍了PyTorch的使用,包括自动微分、构造模型和计算损失函数、测试模型等。其中,自动微分是PyTorch的最主要特性,可以让我们的计算模型更灵活、复杂,并可以让反向传播算法随时进行。最后,通过一个简单的线性回归算法的实现,展示了PyTorch的应用。

实验介绍

实验内容

pytorch是一个开源的深度学习框架,由Facebook支持开发。
Tensor(张量)是pytorch的基础数据结构,自动微分运算是深度学习的核心。
在本实验中我们将学习 PyTorch 中 Tensor 的用法,以及简单的自动微分变量原理,
最后,我们还会使用 PyTorch 构建一个简单的线性回归网络。

实验知识点

  • pytorch简介
  • pytorch中的张量及其运算
  • pytorch中的自动微分运算
  • 用pytorch实现线性回归

实验环境

  • Python 3.7
  • Pytorch 1.4.0
  • Jupyter Notebook

张量(Tensor)运算

使用Tensor

pytorch的基本数据单元是张量(Tensor),它实际上是一种N维数组。
  • 1阶的张量可以看做是一个向量,通过索引可以取得一个“值”。
  • 2阶的张量可以看做是一个矩阵,通过索引可以取得一个个的“向量”。
  • 3阶的张量是在2阶张量的矩阵中增加了一个深度,通过索引取得一个个的“矩阵”。
示例代码:

基本Tensor运算

两个2阶的张量相加实际就是矩阵加法,必须保证两个张量的尺寸是一致的。
示例代码:
两个tensor按照矩阵的方式相乘,若x的尺寸是5*3,y的尺寸也是5*3无法进行矩阵乘法,所以先将y进行转置。
转置操作可以用.t()来完成,也可以用transpose(0,1)来完成。
示例代码:
所有的Tensor的使用方法可见链接:torch.Tensor — PyTorch master documentation

Tensor与numpy.ndarray之间的转换

pytorch的Tensor可以与Python的常用数据处理包numpy中的多维数组进行转换。
示例代码:
下面是另外一种转换tensor的方法,类型为FloatTensor。
示例代码:
还可以从一个tensor转化为numpy的多维数组。
示例代码:
Tensor和numpy的最大区别在于Tensor可以在GPU上进行运算。默认情况下,Tensor是在CPU上进行运算的。
如果需要Tensor在GPU上的实例,需要运行这个Tensor的.cuda()方法。
示例代码:

自动微分(Autograd)

动态运算图(Dynamic Computation Graph)是pytorch的最主要特性。
它可以让我们的计算模型更灵活、复杂,并可以让反向传播算法随时进行。
而反向传播算法就是深度神经网络的核心。
用来构建计算图的数据叫做自动微分变量(Variable),它与Tensor不同。
每个variable包含三个属性,分别对应着数据(data),父节点(creator),以及梯度(grad)。
其中“梯度”就是反向传播算法所要传播的信息。
示例代码:
示例代码:
注意,.data可以返回一个Variable所包裹的Tensor。
示例代码:
backward()可以实施反向传播算法,并计算所有计算图上叶子节点(没有子节点)的导数(梯度)信息。
注意,由于z和y都不是叶子节点,所以都没有梯度信息。
示例代码:
在下面的实例中,会让矩阵x反复作用在向量s上,系统会自动记录中间的依赖关系和长路径。
示例代码:

利用pytorch实现简单的线性回归算法

准备数据

训练一条直线,让这条直线拟合一些数据点的趋势。
首先生成一些样本点作为原始数据。
这些原始“数据点”就是直线需要拟合的对象。
示例代码:
将生成的原始数据点画在图上,用视觉观察下数据点的“趋势”。
示例代码:
所有的数据点以视觉可见的增势增长。

构造模型,计算损失函数

ax+b来表示一条直线,这条直线是由参数a和b控制的,所以模型就是要“学习”出这两个参数。
下面首先建立变量,随机初设化用于线性拟合的参数a和b。
示例代码:
在当前的模型中,这两个参数的初始值无关紧要,因为下面会通过1000次训练,来反复修正这两个参数。
在下面的代码中,需要注意expand_as和mul的使用。
首先,a的维度为1,x是维度为100*1的Tensor,这两者不能直接相乘,因为维度不同。
所以,先要将a升维成1*1的Tensor。
expand_as(x)可以将张量升维成与x同维度的张量。所以如果a=1,x为尺寸为100,那么,
x * y为两个1维张量的乘积,计算结果:
示例代码:
从打印出的损失中我们可以观察到损失一直在下降。
我们现在可以把直线绘制出来,看看这条直线是什么样子。
示例代码:

测试模型

准备数据,模型设计,训练,测试是完成深度学习任务的基本套路。
示例代码:
👌🏼
若您有更好的见解,请您在评论区评论!

评论