今天为大家带来一份非常详尽的PyTorch教程。本文共分3大部分:

安装PyTorch和Jupyter Notebook用PyTorch实现线性回归使用逻辑回归实现图像分类

文章超长,秉承用代码搞定一切的原则,内含大量代码,建议收藏,并分享给你喜欢的人。同时如果有什么疑问,也欢迎留言告知我们。

Tips:为了方便演示,文中代码和返回结果是用截图形式给出。本系列中的所有代码都以Jupyter Notebook形式提供,托管在Jovian。托管链接:

安装PyTorch和Jupyter Notebook

我们将使用Anaconda的Python发行版来安装库和管理虚拟环境,对于交互式编码和实验,我们将使用Jupyter Notebook。

首先按照官方教程安装Anaconda,接下来安装jovian:

$ pip install jovian --upgrade

下载针对本教程的notebook:

$ jovian clone e5cfe043873f4f3c9287507016747ae5

此时会创建一个01-pytorch-basics的目录,包含01-pytorch-basics.ipynb和environment.yml文件。

$ cd 01-pytorch-basics
$ conda env update

目的是不破坏本地Python环境,使用一个虚拟环境。接下来激活

$ conda activate 01-pytorch-basics

启动Jupyter

$ jupyter notebook

打开浏览器,输入:8888 。然后点有01-pytorch-basics.ipynb字样的就开始了。

数组指针_yml数组_数组c语言

本质上PyTorch是处理Tensor的库。所以我们先来简单看下tensor类型:

yml数组_数组c语言_数组指针

因为很多时候我们需要在NumPy的数组和PyTorch数组之间进行转换。

数组指针_yml数组_数组c语言

yml数组_数组c语言_数组指针

Commit并上传:

上传的项目还可以用 jovian clone 下载回来。操作类似git,这里不再累述。

简单的开场之后,我们直接进入硬核阶段。

用PyTorch实现线性回归

对于线性回归,相信大家都很熟悉了,各种机器学习的书第一个要讲的内容必定有线性回归。

这一部分,我们首先通过最原始的手动操作,来理解整个线性回归的原理和操作流程。

接着我们会再介绍使用PyTorch内置的函数,通过自动化的方式实现线性回归。

线性回归模型中,每个目标变量都被估算为输入变量的加权和及偏差。

先看一张表:

表格第一列是地区,第二类是温度单位华氏度,第二列是降水量单位毫米,第四列是湿度,第五列是苹果产量,第六列是橙子产量。

下面这段代码的目的是为了预估出苹果和橙子在不同地区、不同环境中的产量。

yield_apple = w11 * temp + w12 * rainfall + w13 * humidity + b1
yield_orange = w21 * temp + w22 * rainfall + w23 * humidity + b2

分别个温度temp、降水量rainfall、湿度humidity加上不同的权重(w11,w12,w13),最后再加一个b1或者b2的偏差。

通过使用被称为梯度下降的优化技术,少量多次调整权重以获得更精准的预测结果。

训练数据

在Jupyter Notebook里导入NumPy和PyTorch

训练数据我们inputs和targets两个矩阵表示,每个观察一行,每个变量一列。

数组c语言_数组指针_yml数组

接下来转换成PyTorch的tensors:

yml数组_数组c语言_数组指针

变量和偏差也用矩阵表示,从随机数值开始

yml数组_数组指针_数组c语言

模型可以表示为

yml数组_数组指针_数组c语言

我们这样定义模型:

生成预测

数组c语言_数组指针_yml数组

对比一下原始数据

数组指针_yml数组_数组c语言

yml数组_数组c语言_数组指针

发现差距很大,因为一开始我们用的是随机数值,所以数据合不上很正常。

接下来我们需要通过损失函数,来评估我们的模型和实际差距多大。分为3个步骤

计算两个矩阵(preds和targets)之间的差异平方差矩阵的所有元素以消除负值计算结果矩阵中元素的平均值

最终结果为均方误差MSE

yml数组_数组c语言_数组指针

数组指针_数组c语言_yml数组

计算梯度:

使用PyTorch可以自动计算损耗的梯度或导数w.r.t. 权重和偏差,因为requires_grad被设置为True。

计算权重梯度:

yml数组_数组指针_数组c语言

重置梯度:

数组c语言_yml数组_数组指针

使用梯度下降调整重量和偏差

我们将使用梯度下降优化算法减少损失并改进我们的模型,该算法具有以下步骤:

生成预测计算损失计算梯度w.r.t权重和偏差通过减去与梯度成比例的小量来调整权重将渐变重置为零让我们逐步实现上述步骤

接下来分别用代码表示:

数组c语言_数组指针_yml数组

数组指针_数组c语言_yml数组

数组指针_yml数组_数组c语言

最终效果:

yml数组_数组指针_数组c语言

再来看看损失:

数组指针_数组c语言_yml数组

说明有进步。那么我们就重复上面的过程,把损失减到最小。每词重复,我们成为1个epoch。我们先来100个epoch:

yml数组_数组c语言_数组指针

再看看效果:

数组指针_yml数组_数组c语言

损失很低了。print一下结果:

yml数组_数组c语言_数组指针

用PyTorch内置函数实现线性回归

了解了上述原理后,我们就可以用PyTorch内置的函数,简化我们的工作量。

数组指针_数组c语言_yml数组

接下来我们创建一个TensorDataset和一个DataLoader:

数组指针_yml数组_数组c语言

TensorDataset允许我们使用数组索引表示法(上面代码中的[0:3])访问训练数据的一小部分。 它返回一个元组(或对),其中第一个元素包含所选行的输入变量,第二个元素包含目标。

yml数组_数组指针_数组c语言

用for-in循环就可以了

数组c语言_yml数组_数组指针

用nn.linear自动初始化

刚开始我们是手动随机输入的初识权重。现在我们可以使用nn.linear自动完成初始化工作。

数组c语言_yml数组_数组指针

对于我们的线性回归模型,我们有一个权重矩阵和一个偏差矩阵。

yml数组_数组指针_数组c语言

接下来我们重复上面的流程,首先通过损失函数计算出差距,接着不断的降低损失。

yml数组_数组指针_数组c语言

以及用内置损失函数mse_loss:

yml数组_数组c语言_数组指针

优化的时候,我们可以使用优化器optim.SGD,不用手动操作模型的权重和偏差。

SGD代表随机梯度下降。 它被称为随机因为样本是分批选择的(通常是随机抽样)而不是单个组。

训练模型,思路上面已经讲过了,直接看代码

数组指针_数组c语言_yml数组

上面要注意的一些事项:

我们使用前面定义的数据加载器来获取每次迭代的batch数据我们不是手动更新参数(权重和偏差),而是使用opt.step来执行更新,而使用opt.zero_grad将梯度重置为零我们还添加了一个日志语句,用于打印每10个时期最后一批数据的丢失,以跟踪训练的进度。 loss.item返回存储在损失tensor中的实际值

来100个epoch

数组c语言_yml数组_数组指针

结果:

数组指针_yml数组_数组c语言

对比一下:

数组c语言_数组指针_yml数组

Commit并上传

现在可以将你的代码上传到我们的Notebook了。看了这么多代码估计你可能已经忘记怎么Commit了。

【2019新智元 AI 技术峰会倒计时16天】

2019年的3月27日,新智元再汇AI之力,在北京泰富酒店举办AI开年盛典——2019新智元AI技术峰会。峰会以“智能云•芯世界“为主题,聚焦智能云和AI芯片的发展,重塑未来AI世界格局。

同时,新智元将在峰会现场权威发布若干AI白皮书,聚焦产业链的创新活跃,评述华人AI学者的影响力,助力中国在世界级的AI竞争中实现超越。

购票二维码

活动行购票链接:2019新智元AI技术峰会--智能云•芯世界_精彩城市生活,尽在活动行!!


创业/副业必备:

本站已持续更新1W+创业副业顶尖课程,涵盖多个领域。

点击查看详情

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。