本章主要是介绍 PyTorch,并通过构建简单的图像分类器练习,来加深有关神经网络的理解。
本章是 Make Your First GAN With PyTorch 的第一章,其他介绍详见这篇文章。


本文目录

  • 1. Google Colab
  • 2. PyTorch 张量
  • 3. PyTorch 的自动求导
  • 4. 计算图
    • 4.1 计算图基本概念
    • 4.2 多节点的计算图示例
    • 4.3 计算图的有关讨论
  • 5. 总结

我们当然可以使用 Pythonnumpy 库来创建简单但有效的神经网络。但是构建更大的网络任务艰巨,特别是是通过做微积分来找到网络中后向传播误差(back­propagated error)和权重(weights)之间的关系。而且网络中一点点的改变,就需要完全重做上述工作。

而使用 PyTorch 等深度学习框架,可以避免很多低水平的重复工作,转而更关注于网络的设计问题。不管想要什么类型、什么尺寸的网络, PyTorch 可以做所有的微积分;而且,即使改变网络的设计,PyTorch 可以自动计算出新的微积分,不需要再次手工计算梯度。

特别是,PyTorch 的语法和用法很接近普通的 Python,这降低了入门的难度。

PyTorch 是一个开源的 Python 机器学习库,最初由 Facebook 的人工智能研究团队开发。
除了 PyTorch 外,还有诸如 TensorFlowCaffe 等其他开源框架。

1. Google Colab

Make Your First GAN With PyTorch 中主要是使用了 Google Colab 服务,通过在线的 Python notebook 在线运行我们的代码。Colab 完全通过浏览器接入,不需要在自己的电脑上安装任何软件。

这就是我说的蛋疼的地方,Make Your First GAN With PyTorch 为了简化再简化,直接使用了 Google Colab 来运行代码。而国内的同学基本不太可能使用这个服务…
这里还是忠于原著,简单介绍 Google Colab 的使用方法。同时,后面的代码,亲测在自己电脑搭建的环境也可运行。

首先,登录 Google 账户后,通过下面的链接来激活 Google Colab 服务:

  • https://colab.research.google.com

激活后可以在 File 目录,通过选择 New Python
3 notebook
来创建一个新的 notebook 文件,如下图所示:

可以看到一个空白的 Python notebook 文件:


在第一个 cell 里输入如下代码:

2 + 3

点击左侧的运行按钮,可以直接得到代码运行结果,也就是 5

2. PyTorch 张量

使用 PyTorch 前,需要导入 torch 模块。

由于 Google Colab 服务已经基本预装了常见的库,这里只需要简单地导 入即可。

还是那句话,如果在本机或者其他平台运行 PyTorch,需要安装这些常见的库…

在第一个 cell 中输入下面的语句并运行:

import torch

普通的 Python 使用 变量(variables) 存储数据,而 PyTorch 则使用一种独特的变量类型来存储数据,称之为 PyTorch 张量(tensors),下面是一个例子:

# 定义 PyTorch 张量(tensor)并输出
x = torch.tensor(3.5)
print(x)

代码是指创建了称为 xPyTorch 张量,初始值为 3.5。运行结果为:

如图所示,输出显示数值为 3.5000,同时也表明这个值包含于一个 PyTorch 张量 (tensor) 中。

张量也可以进行一般的算术运算,运算结果也同样为张量。

3. PyTorch 的自动求导

下面的代码同样创建了一个称为 x 的张量,但是这次增加了一个附加选项 requires_grad = True

# PyTorch 张量
x = torch.tensor(3.5, requires_grad = True)
print(x)

输出结果为:

tensor(3.5000, requires_grad=True

可以看到 x 包括了值为 Truerequres_grad 的选项。使用 x 创建一个新变量 y,表达式如下所示:

# 定义 y 是 x 的一个函数
y = (x - 1) * (x - 2) * (x - 3)
print(y)

运行可得 y 的取值:

tensor(1.8750, grad_fn=<MulBackward0>)

正如预料,y 的值为 1.8750,这是因为 x3.5,所以 (3.5 − 1) ∗ (3.5 − 2) ∗ (3.5 − 3)1.8750

下图是刚刚计算的 y=(x−1)∗(x−2)∗(x−3)y = (x − 1) ∗ (x − 2) ∗ (x − 3)y=(x−1)∗(x−2)∗(x−3) 的曲线图:


上述例子看起来简单,但实际上 PyTorch 做了一些隐性的工作:除了计算了 1.8750 的值,并将其放入一个名为 y 的张量中,PyTorch 实际上还记住了数学定义。

PyTorch 记住数学定义,意味着在训练神经网络时,可以方便的使用微积分获得误差梯度,进而随着网络权重的改变,决定输出误差的改变率。

下面计算 x=3.5x = 3.5x=3.5 处 y 的梯度(dy/dxdy/dxdy/dx),说明 PyTorch 是如何计算梯度的:

# 使用 PyTorch 直接计算梯度(导数)
y.backward()

这个简单的命令就完成了一切:明确了 y 是来自于 (x−1)∗(x−2)∗(x−3)(x − 1) ∗ (x − 2) ∗ (x − 3)(x−1)∗(x−2)∗(x−3),并且自动计算出梯度 dy/dxdy/dxdy/dx 是 3x2−12x+113x^2-12x +113x2−12x+11。该命令也计算出了梯度的数值,由于x3.5,所以梯度值为 3∗(3.5∗3.5)−12∗(3.5)+11=5.753*(3.5*3.5)-12*(3.5)+11=5.753∗(3.5∗3.5)−12∗(3.5)+11=5.75,并将其放在了张量 x 中,可以使用 x.grad 查看张量 x 中的梯度值:

# x = 3.5 处的梯度值
x.grad

运算结果如下所示:

张量是 PyTorch 中数据的基本形式,几乎其他的所有特性都需要张量作为基础,比一般的 Python 变量或者 numpy 数组更加丰富,张量可以是多维数组、简单的二维阵列或一维列表,甚至单独一个值,而且:

  • 比简单的数值更多的附加信息,比如梯度值;
  • 这个张量依赖的其他张量的信息,和具体依赖的数学形式。

4. 计算图

4.1 计算图基本概念

观察下面非常简单的网络,它并不是神经网络,而只是一系列计算:


图中的输入是 x,输出为 z,中间变量为 yyz 的计算公式为:

y=x2z=2y+3y=x^2 \\ z=2y+3y=x2z=2y+3

使用 链式法则(chain rule of calculus) 计算 dz/dxdz/dxdz/dx:

dz/dx=dz/dy⋅dy/dxdz/dx=2⋅2xdz/dx=4xdz/dx=dz/dy \cdot dy/dx \\ dz/dx=2 \cdot 2x \\ dz/dx=4xdz/dx=dz/dy⋅dy/dxdz/dx=2⋅2xdz/dx=4x

上图给出计算获得输出 z 随着 x 变化率是 4x4x4x ,所以,如果 x=3.5x = 3.5x=3.5,则 dz/dxdz/dxdz/dx 为 4∗3.5=144*3.5=144∗3.5=14。

PyTorch 中描述这些张量如何连接的图片称为计算图(computation graph)。这个例子中的计算图为:


上图可以看到 y 是如何使用 x 计算的,z 是如何使用 y 计算的。另外,PyTorch 还增加了反向箭头,显示出当 x 变化时 y 是如何变化,当 y 变化时 z 是如何变化,这是为了在训练时更新神经网络的梯度。

上图中,更简单的理解,我认为正向箭头是变量的计算公式,反向箭头代表了导数/变化率,也就是前一个向量变化时,后一个向量如何变化。

微积分由 PyTorch 完成,不需要我们计算。将计算图的正向箭头列入到 PyTorch 定义中:

# 使用 x, y, z 设置一个简单的计算图
x = torch.tensor(3.5, requires_grad = True)
y = x * x
z = 2 * y + 3

PyTorch 只构建正向的计算图。为了获取后向梯度,需要使用 backward() 函数进行计算:

# 计算梯度值
z.backward()

更前面一样,梯度 dz/dxdz/dxdz/dx 将会放入张量 x 中,作为 x.grad

# x = 3.5 处的梯度值
x.grad

运行结果如下图:


可以看到结果是 14,与手动计算结果一致!

需要注意的是,由于前面是 z.backward(),所以 x.grad 是 dz/dxdz/dxdz/dx,而不是 dy/dxdy/dxdy/dx。

4.2 多节点的计算图示例

绝大多数神经网络中有多重链接,下面可以看一个稍微复杂的例子:


输入有两个,分别为 ab,输出为 z,这些节点的关系为:

x=2a+3by=5a2+3b2z=2x+3yx=2a+3b \\ y=5a^2+3b^2 \\ z=2x+3yx=2a+3by=5a2+3b2z=2x+3y

可以计算梯度:

dz/dx=2dx/da=2dz/dy=3dx/db=3dz/dx=2 \\ dx/da=2 \\ dz/dy=3 \\ dx/db=3dz/dx=2dx/da=2dz/dy=3dx/db=3

将这些信息添加到计算图上:


通过下面路径可以很简单的计算出从 za 的梯度 dz/dadz/dadz/da。实际上,dz/dadz/dadz/da 有两条路径,一条通过 xxx,另一条则通过 yyy,将这两条路径的表达式分别相加(下图用不同颜色标出),可以得到梯度值。


通过 x 的第一条路的结果是2∗22∗22∗2,通过 y 的第二条路是 3∗10a3∗10a3∗10a,所以 z 关于a 的梯度是 4+30a4 + 30a4+30a,当a2 时,dz/dadz/dadz/da 为 4+30∗2=644+30∗2 = 644+30∗2=64。

下面使用 PyTorch 计算,首先设定计算图中的关系:

# 设置 x, y, z 的关系
a = torch.tensor(2.0, requires_grad = True)
b = torch.tensor(1.0, requires_grad = True)x = 2 * a + 3 * b
y = 5 * a * a + 3 * b * b * b
z = 2 * x + 3 * y

然后触发梯度计算,并将其值放入张量 a 中:

# 计算梯度值
z.backward()# a = 2.0 处的梯度值
a.grad

PyTorch 计算的结果见下图:

计算结果正确。

4.3 计算图的有关讨论

上面并没有讲清楚如何将网络和更新内部的权重与 误差(error) 构建关系,下面就探讨这个。

如果和4.1 节中的简单网络类似,网络的输出为 z,且正确的输出应该是 t,此时误差 E 为 (z−t)(z − t)(z−t),或者更一般的是 (z−t)2(z − t)^2(z−t)2。将误差 E 看做网络末端的另一个节点(而不是 z),所以 (z−t)2(z − t)^2(z−t)2 是从 zE 的计算。PyTorch 能够计算出新的输出 E 与网络输入相关的梯度。

对于网络的权重 www,假设权重也是节点,就如下图:


上图中,z 既依赖于变量 y ,也依赖于权重 w2w_2w2​,也就是整个关系可以表示为 z=w2∗yz = w_2 ∗ yz=w2​∗y,与神经网络类似。

可以看到 dz/dw2dz/dw_2dz/dw2​ 可以与 dz/dydz/dydz/dy 使用一样的方法计算。举例而言,就像前面一 样,可以通过遵循从 z 到 w1w_1w1​ 的反向路径,来确定 dz/dw1dz/dw_1dz/dw1​。

5. 总结

本章主要围绕如何计算梯度开展,介绍了 PyTorch 中的张量和计算图。理论内容到此为止,下章开始就要实际构建网络。

PyTorch 的关键特性是能够对定义的函数自动计算 梯度(gradients)。计 算梯度是训练神经网络的基础,为了完成这项工作,PyTorch 构建了 计算图(computation graph) 来表示张量之间的关系。

可以代码中方便的定义张量之间的关系,也就是计算图的表示。

Make Your First GAN With PyTorch:1.PyTorch基础相关推荐

  1. 好像还挺好玩的GAN重制版4——Pytorch搭建SRGAN平台进行图片超分辨率提升

    好像还挺好玩的GAN重制版4--Pytorch搭建SRGAN平台进行图片超分辨率提升 学习前言 源码下载地址 网络构建 一.什么是SRGAN 二.生成网络的构建 三.判别网络的构建 训练思路 一.判别 ...

  2. GAN如此简单的PyTorch实现,一张脸生成72种表情(附代码)

    [新智元导读]随着GAN的发展,单凭一张图像就能自动将面部表情生成动画已不是难事.但近期在Reddit和GitHub热议的新款GANimation,却将此技术提到新的高度.GANimation构建了一 ...

  3. 1.0 深度学习回顾与PyTorch简介 - PyTorch学习笔记

    P1 深度学习回顾与PyTorch简介 视频课程地址:点我 fly~~~ 本节课主要偏向于NLP,因为作者本人是做NLP方向NLP 预训练三种模型: BERT OpenAI GPT ELMo [NLP ...

  4. 李嘉骐:03 PyTorch模块与基础实战

    深入浅出Pytorch 03 PyTorch模块与基础实战 内容属性:深度学习(实践)专题 航路开辟者:李嘉骐.牛志康.刘洋.陈安东 领航员:叶志雄 航海士:李嘉骐.牛志康.刘洋.陈安东 开源内容:h ...

  5. PyTorch学习笔记(二):PyTorch简介与基础知识

    往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: PyTorch学习笔记(一):PyTorch环境安 ...

  6. 【0基础入门Pytorch】Pytorch的简介与安装(Windows)

    任务内容: Pytorch简介 Pytorch的安装步骤 1. Pytorch简介 PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序.它主要由Facebook ...

  7. 【Pytorch】| Pytorch中softmax的dim的详细总结

    [Pytorch]| Pytorch中softmax的dim的详细总结 关于softmax的理解 一维向量:dim=0和dim=-1结果相同,dim=1和dim=2会报错 二维张量:dim=1和dim ...

  8. [Pytorch框架] PyTorch 中文手册

    PyTorch 中文手册 书籍介绍 这是一本开源的书籍,目标是帮助那些希望和使用PyTorch进行深度学习开发和研究的朋友快速入门. 由于本人水平有限,在写此教程的时候参考了一些网上的资料,在这里对他 ...

  9. Pytorch ——基础指北_叁 [Pytorch API 构建基础模型]

    Pytorch --基础指北_叁 系列文章目录 Pytorch --基础指北_零 Pytorch --基础指北_壹 Pytorch --基础指北_贰 Pytorch --基础指北_叁 文章目录 Pyt ...

  10. Pytorch Note1 Pytorch介绍

    Pytorch Note1 Pytorch介绍 PyTorch的诞生 常见的深度学习框架简介 为什么选择PyTorch 总结一下Pytorch的特点 Python 优先 命令式体验 快速精益 安装 全 ...

最新文章

  1. ListView通过自定义适配器来显示数据并对Item项以及子view项的控件实现监听.
  2. CRC24循环冗余校验码的FPGA实现
  3. python中for和while区别_Python学习第九篇——while和for的区别
  4. Html5 填表 表单(二) input type 各种输入, 各种用户选择,上传等等泛输入用户交互
  5. MooseFS学习-概述
  6. 大文件上传服务器、支持超大文件HTTP断点续传实践总结
  7. rocketMq消息重复消费问题
  8. 【三维路径规划】基于matlab A_star算法机器人栅格地图三维路径规划【含Matlab源码 190期】
  9. android手机向电脑传输文件,手机怎么用数据线连接电脑传输文件
  10. 有道智云 php,调用有道智云API,自动翻译WORDPRESS标题为英文
  11. 奇葩报错之返回值为 -1073741515 (0xc0000135) ‘未找到依赖 dll‘
  12. 校园消防vr模拟火灾逃生软件将火灾伤害全感官还原
  13. TODA EMS(设备管理系统)简介
  14. Centos修改DNS
  15. docker 进入容器内部及退出
  16. Composite(组合模式)
  17. MySQL复习笔记(三)
  18. 进制转换(进制转换)
  19. CRF as RNN 代码解读
  20. matlab中的将几条曲线画在一个坐标系下的方法,请问怎么将几条线画在同一个坐标轴下?有程序!...

热门文章

  1. 二维列表的转置(行列互换,首行变首列,尾行变尾列)
  2. #Unity _ 简体转繁体
  3. AutoIt教程资源汇总
  4. 如何将pdf转换成word的3种免费方法
  5. 波士顿大学计算机硕士排名,GPA3.25却获波士顿大学计算机硕士录取
  6. IE浏览器无法打开网页
  7. python提取图片中的文字并生成word文档
  8. java 专业英语单词_java_专业英语单词_力荐
  9. 国外android大神博客,Android手机浏览器(国外篇)横向对比评测
  10. TWEN-ASR ONE 语音识别系列教程(2)--- GPIO、ADC、PWM的使用