关于本书
我们写本书的目的是为大家介绍PyTorch深度学习的基础知识,并以一个实际项目来展示。我们力图介绍深度学习底层的核心思想,并向读者展示PyTorch如何将其实现。在本书中,我们试图提供直观印象以帮助大家进一步探索,同时,我们选择性地深入细节,以解剖其背后的奥妙。
本书并不是一本参考书,相反,它是一本概念性的指南,旨在引导你在网上独立探索更高级的材料。因此,我们关注的是PyTorch提供的一部分特性,最值得注意的是循环神经网络,但PyTorch API的其他部分也同样值得重视。
读者对象
本书适用于那些已成为或打算成为深度学习实践者以及想了解PyTorch的开发人员。我们假设本书的读者是一些计算机科学家、数据科学家、软件工程师、大学生或以后会学习相关课程的学生。由于我们并不要求读者有深度学习的先验知识,因此本书前半部分的某些内容可能对有经验的实践者来说是一些已经了解的概念。对这些读者来说,我们希望本书能够提供一个与已知主题稍有不同的视角。
我们希望读者具备命令式编程和面向对象编程的基本知识。由于本书使用的编程语言是Python,因此大家需要熟悉Python的语法和操作环境,了解如何在所选择的平台上安装Python包和运行脚本。熟悉C++、Java、JavaScript、Ruby或其他类似语言的读者应该可以轻松上手,但是需要在本书之外做一些补充。同样,如果读者熟悉NumPy也很有用,但这并不是强制要求的。我们也希望读者熟悉线性代数的一些基础知识,如知道什么是矩阵、向量和点积。
本书的组织结构:路线图
本书由3个部分组成。第1部分介绍基础知识;第2部分在第1部分的基础上介绍一个端到端的项目,并增加更高级的概念;简短的第3部分以PyTorch部署之旅结束本书。大家可能会注意到各部分的写作风格和图片风格不同。尽管本书是无数小时的协同计划、讨论和编辑的结果,但写作和绘图的工作被分成了几部分。Luca主要负责第1部分,Eli主要负责第2部分[1],Thomas主要负责第3部分(他试图在第3部分将第1部分和第2部分的写作风格结合起来)。我们决定保留这些部分的原始风格,而不是一味寻找各部分风格的共同点。以下是各部分所包括的章及其概述。
第1部分
在第1部分中,我们在PyTorch的使用上迈出第一步,了解PyTorch项目并开始掌握构建自己的项目所需要的基本技能。我们将介绍PyTorch API和一些PyTorch库背后的特性,并训练一个初始的分类模型。在第1部分结束时,我们将准备处理一个真实的项目。
第1章介绍PyTorch用于深度学习的库及其在“深度学习革命”中的地位,并探讨PyTorch与其他深度学习框架的区别。
第2章通过运行一些预先训练好的网络示例来展示PyTorch的实际应用,演示如何在PyTorch Hub中下载和运行模型。
第3章介绍PyTorch的基本构建组件——张量,介绍张量的一些API,并深入底层介绍一些实现细节。
第4章展示不同类型的数据如何被表示为张量,以及深度学习模型期望构造什么样的张量。
第5章介绍梯度下降机制,以及PyTorch如何实现自动微分。
第6章展示利用PyTorch的神经网络(nn)和优化(optim)模块来建立和训练一个用于回归的神经网络的过程。
第7章在第6章的基础上介绍构建一个用于图像分类的全连接层模型,并扩展介绍PyTorch API的知识。
第8章介绍卷积神经网络,并探讨关于构建神经网络模型及其PyTorch实现方面更高级的概念。
第2部分
在第2部分中,每一章都会让我们更接近一个全面的肺癌自动检测解决方案。我们将把这个难题作为动机来演示解决诸如肺癌筛查的大规模问题所需的实际方法。这是一个专注于数据清洗工程、故障排除和问题求解的大型项目。
第9章从CT成像开始,介绍用于肺肿瘤分类的端到端策略。
第10章介绍使用标准PyTorch API加载人工标注数据和CT扫描的图像,并将相关信息转换为张量。
第11章介绍第1个分类模型,该模型基于第10章介绍的训练数据构建。本章还会介绍对模型进行训练,收集基本的性能指标,并使用张量可视化工具TensorBoard来监控训练。
第12章探讨并介绍实现标准性能指标,以及使用这些指标来识别之前完成的训练中的缺陷。然后,介绍通过使用经过数据平衡和数据增强方法改进过的数据集来弥补这些缺陷。
第13章介绍分割,即像素到像素的模型架构,以及使用它来生成覆盖整个CT扫描的可能结节位置的热力图。这张热力图可以用来在CT扫描中找到非人工标注数据的结节。
第14章介绍实现最终的端到端项目:使用新的分割模型和分类方法对癌症患者进行诊断。
第3部分
第3部分为第15章,主要介绍部署相关内容,概述如何将PyTorch模型部署到简单的Web服务中,或将它们嵌入C++程序中,抑或将它们发布到移动电话上。
关于代码
本书中所有的代码都是基于Python 3.6及以上的版本编写的。本书中的代码可以从异步社区中获取。编写本书时,Python的最新版本是3.6.8,本书正是使用该版本来测试书中的例子的。例如:
$ python
Python 3.6.8 (default, Jan 14 2019, 11:02:34)
[GCC 8.0.1 20180414 on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
在Bash提示符下输入的命令行以$开头(如本例中的$ python行),固定宽度的内联代码看起来像Python中的self用法一样。
以>>>开头的代码块是Python交互式提示符下的会话脚本。提示符>>>本身不被视为输入,输出文本行也不以>>>和…开头。在某些情况下,在>>>之前插入一个额外的空行,以提高输出的可读性。当你在交互式提示符下输入实际的文本时,这些空白行并不包括在内。
>>> print("Hello, world!")
Hello, world!
>>> print("Until next time...") ⇽--- 在实际的交互式会话期间不会出现此空行
Until next time...
我们也大量使用Jupyter Notebook,如第1章1.5.1小节所述。我们提供的作为官方GitHub仓库的Jupyter Notebook代码如下所示:
# In[1]:
print("Hello, world!")
# Out[1]:
Hello, world!
# In[2]:
print("Until next time...")
# Out[2]:
Until next time...
绝大多数Jupyter Notebook中的示例代码在第1个单元格(cell,一对In Out会话被视作一个代码单元)中包含以下模板代码(在前几章的代码中可能缺少模板代码中的某几行),这些模板代码在之后的代码中我们不再提及。
# In[1]:
%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.set_printoptions(edgeitems=2)
torch.manual_seed(123)
另外,代码块是.py源文件的一部分或是一份完整的代码。
代码清单 main.py:5, def main
def main():
print("Hello, world!")
if __name__ == '__main__':
main()
书中的许多代码示例都使用了2空格缩进。由于版面的限制,代码清单中的每行被限制在80个字符以内,这对于大量缩进的代码段是不切实际的。使用2空格缩进有助于减少换行。本书所有的代码都可以下载(同样请访问异步社区的本书页面),这些代码使用的是一致的4空格缩进。以_t作为后缀的变量是用于CPU存储器的张量,以_g作为后缀的变量用于GPU存储器,以_a作为后缀的变量是NumPy数组。
软件和硬件要求
第1部分不需要任何特定的计算资源,当前任何计算机或在线的计算资源都是足够的,也不需要特定的操作系统。第2部分我们计划完成一个完整的训练运行环境,将需要一个支持CUDA的GPU。第2部分中使用的默认环境配置参数假定为一个有8GB RAM的GPU(我们建议使用NVIDIA GTX 1070或更高的配置),如果你的硬件可用的RAM较少,这些参数可以进行调整。第2部分的癌症检测项目需要下载大约60GB的原始数据,因此至少需要200GB的可用磁盘空间用于训练。幸运的是,某些在线计算服务提供免费使用一定时长的GPU,我们将在适当的部分更详细地讨论计算所需的资源需求。
你需要Python 3.6或更高的版本,相关说明在Python官网上可以找到。有关PyTorch的安装信息,请参阅PyTorch官方网站的入门指南。我们建议Windows用户安装Anaconda或Miniconda。用户若使用其他操作系统,诸如Linux,通常有更多的可行选项,其中pip是Python最常用的包管理器。我们提供了一个名为requirements.txt的文件,pip可以按照该文件来安装依赖项。由于目前的苹果笔记本计算机没有支持CUDA的GPU,因此对于采用macOS的PyTorch预编译软件包只支持CPU。当然,有经验的用户可以自由地安装与你首选的开发环境最兼容的软件包。
其他在线资源
虽然本书没有假设读者有深度学习的先验知识,但本书并不是深度学习的基础导论。本书涵盖基础知识,但我们的重点是熟练使用PyTorch库。我们鼓励有兴趣的读者通过阅读本书建立对深度学习的直观理解。为此,Grokking Deep Learning是一本非常值得学习的书,可以帮助大家开发一个强大心智模型,并直观地了解深度神经网络的机制。要获得全面的介绍和参考,我们建议你阅读Goodfellow等人编写的Deep Learning[2]。当然,Manning出版社有一个关于深度学习的目录列表,其中涵盖了该领域各种各样的主题。你可以根据自己的兴趣,从中选择一本作为你下一步要阅读的书。
[1] Eli和Thomas的写作风格在其他部分也有所体现,如果某章的写作风格改变了,大家不要感到震惊!
[2] 中文版《深度学习》由人民邮电出版社出版。——译者注