什么是 PyTorch?PyTorch 是一个开源机器学习和深度学习框架。 可以使用 PyTorch 编写代码、处理数据,编写机器学习和深度学习算法。 世界上许多大型公司,如 Meta (Facebook),特斯拉和微软,以及人工智能研究公司,如 OpenAI use PyTorch 都使用 PyTorch 研究机器学习算法,并将算法落地到他们的产品中。 例如,Andrej Karpathy(特斯拉 AI 负责人)进行了多次关于自动驾驶计算机视觉模型的演讲,(PyTorch DevCon 2019, Tesla AI Day 2021) 分享了特斯拉使用了 PyTorch 推动计算机视觉模型的发展。PyTorch 还用于农业等其他行业,为拖拉机上的计算机视觉提供动力。 为什么使用 PyTorch?机器学习研究人员喜欢使用 PyTorch。截至 2022 年 2 月,PyTorch 是 Papers With Code 上最常用的深度学习框架,该网站用于跟踪机器学习研究论文及其附带的代码存储库。 PyTorch 还有 GPU 加速,使代码运行得更快,你可以专注于操作数据和编写算法。 本文分享的内容
本文来源项目地址在 GitHub,https://github.com/mrdbourke/pytorch-deep-learning. 如果阅读英文无压力,建议阅读原文,若想先中文预览一下,继续看下去吧!本文在原文基础上加入了一些思考。 如果遇到困难也可以在讨论页面上提问:https://github.com/mrdbourke/pytorch-deep-learning/discussions PyTorch 开发者论坛:https://discuss.pytorch.org/ Kaggle 练习地址原项目有 Google Colab 的练习地址,考虑方便性,搬运到了 Kaggle 平台,进行了汉化,仅用于学习。 https://www./zymzym/pytorch-fundamentals-00 PyTorch 基础知识导入 PyTorch
设置好 GPU,让我们导入 PyTorch 并检查使用的版本。 张量简介现在我们已经导入了 PyTorch,是时候了解张量了。 张量是机器学习的基本构建块。工作方式是以数字方式表示数据。 例如, 读者可以将图像表示为张量,形状为 上图展示的图像张量,具有三个维度,对于不了解 PyTorch ,这些知识有些超前,接下来,通过代码了解更多的内容。 创建张量提供官网关于张量的文档,感兴趣可以阅读完本文之后继续扩展:https://pytorch.org/docs/stable/tensors.html 我们要创建的第一个变量是标量(Scalar)。 标量是一个单一的数字,用张量的语言来说,它是一个零维张量。 看看上面打印出来的 我们可以使用 如果我们想从张量中检索数字怎么办?例如把它从 我们可以使用 Okay, 现在让我们看一个 vector (向量)。 向量是一维张量,但可以包含许多数字。 就像房子一样可以用一个矢量 现在 嗯,这很奇怪, 在 PyTorch 中,可以通过外面方括号 ( 张量的另一个重要概念是它们的 我们来看看 上面的 现在让我们看一个 matrix(矩阵)。 哇!更多数字!矩阵和向量一样灵活,除了它们有一个额外的维度。
读者认为 我们得到输出 我们来创建一个 tensor(张量)? 哇!多么漂亮的张量。 张量几乎可以代表任何东西。 我们刚刚创建的那个可能是一家牛排和杏仁黄油店的销售数字。 读者认为它有多少维度?(提示:使用方括号计数技巧) 那它的形状呢? 输出是
让我们总结一下。
随机张量我们已经确定张量代表某种形式的数据。机器学习中的神经网络使用张量操作数据。但在使用 PyTorch 构建机器学习模型时,我们很少会手动创建 tenor。 相反,机器学习模型通常从大量随机数字张量开始,并在处理数据时调整这些随机数字以更好地表示它。 在本质上:
作为数据科学家,会定义机器学习模型如何启动(初始化)、查看数据(表示)和更新(优化)其随机数。 稍后我们将着手处理这些步骤。 现在,让我们看看如何创建随机数张量。 我们可以使用
例如我们创建一个常见的图像张量 全为 0 的张量和全为 1 的张量当我们想用 0 屏蔽一个张量中的某些值,让模型知道不要学习它们时,会创建全为 0 的张量。
创建一个在定义范围内的张量有时可能需要一个数字范围,例如 1 到 10 或 0 到 100。可以使用 其中:
有时可能希望某种类型的一个张量与另一个张量具有相同的形状。例如,一个全零张量想与前一个张量具有相同形状。为此,读者可以使用 张量数据类型PyTorch 中有许多不同的张量数据类型可用。有些特定于 CPU,有些则更适合 GPU。了解哪个是哪个可能需要一些时间,更多内容可以阅读。https://pytorch.org/docs/stable/tensors.html#data-types 一般来说,如果你在任何地方看到 最常见的类型是 更令人困惑的是,还有 8 位、16 位、32 位和 64 位整数。
两个数字的区别与计算精度有关。精度是用于描述数字的详细程度。精度值(8、16、32)越高,用于表达数字的细节和数据就越多。 这在深度学习和数值计算中很重要,因为你要进行如此多的操作,你需要计算的细节越多,你必须使用的计算就越多。 因此,较低精度的数据类型通常计算速度更快,但会牺牲一些评估指标的性能,例如准确性(计算速度更快但准确性较低)。
让我们看看如何创建一些具有特定数据类型的张量,可以使用 除了形状问题(张量形状不匹配)之外,我们在 PyTorch 中遇到的另外两个最常见的问题是数据类型和设备问题。 如,一个张量是 或者你的一个张量在 CPU 上,另一个在 GPU 上(PyTorch 喜欢在同一设备上进行张量之间的计算)。 稍后我们会看到更多关于此设备的讨论。 现在让我们用 从张量中获取信息当你创建了张量(或者其他人还是 PyTorch 模块已经创建了它们),我们可能想要从它们那里获取一些信息。 我们之前已经见过这些,了解关于张量的三个最常见的属性是:
让我们创建一个随机张量并找出有关它的详细信息。 张量运算在深度学习中,数据(图像、文本、视频、音频、蛋白质结构等)被表示为张量。 模型通过研究这些张量并对张量执行一系列操作(可能超过 1,000,000 次)来学习,来表示输入数据中的关系。 这些操作往往是:
就是这样。当然还有更多,但这些是神经网络的基本构建块。我们可以用正确的方式堆叠这些构建块,来创建最复杂的神经网络。(就像乐高一样!) 基本操作让我们从一些基本运算开始,加法 ( 注意上面的张量值最终并没有变成 让我们减去一个数字,这次我们将重新分配 PyTorch 也有一堆内置函数,比如 但是,更常见的是使用运算符符号是 矩阵乘法机器学习和深度学习算法(如神经网络)中最常见的操作之一是矩阵乘法 matrix multiplication。 PyTorch 在 要记住的矩阵(行,列)乘法的两个主要规则:
让我们创建一个张量并对其执行逐元素乘法和矩阵乘法。 逐元素乘法和矩阵乘法的区别在于值的相加。 对于
处理张量形状深度学习中最常见的错误之一(形状错误)由于大部分深度学习都是在矩阵上进行乘法和运算,而矩阵对可以组合的形状和大小有严格的规定,因此在深度学习中遇到的最常见错误之一是形状不匹配。 可以通过使它们的内部维度匹配来使矩阵乘法在 一种方法是使用 转置 transpose (变换给定张量的维度)。 我们可以使用以下任一方法在 PyTorch 中执行转置:
让我们试试第二种。 也可以使用 矩阵乘法的视觉效果如下: 创建自己的矩阵乘法视觉效果地址,http:///
神经网络充满了矩阵乘法和点积。 该 其中:
这是一个线性函数 (读者可能在高中已经看到类似 ),并且可以用来画一条直线! 让我们玩一个线性层。 尝试更改 查找最小值、最大值、平均值、总和等现在我们已经看到了几种操作张量的方法,让我们来看看其他方法(从更多的值到更少的值)。 首先,我们将创建一个张量,然后找到它的最大值、最小值、平均值和总和。
同样可以使用 位置最小值/最大值读者还可以找到张量的索引,其中最大值或最小值分别出现在 如果读者想要最高(或最低)值所在的位置而不是实际值本身,在后面的部分会使用softmax activation function)做到。 更改张量数据类型深度学习操作的一个常见问题是张量具有不同的数据类型。 如果一个张量在 可以使用 首先,我们将创建一个张量并检查它的数据类型(默认为 现在我们将创建另一个与之前相同的张量,但将其数据类型更改为 可以做类似的事情来制作
Reshaping, stacking, squeezing and unsqueezing很多时候读者会想要改变张量的维度而不改变它们内部的值。 常见的方法是:
为什么要做这些? 因为深度学习模型(神经网络)都是关于以某种方式操纵张量的。由于矩阵乘法的规则,如果形状不匹配,就会出错。这些方法可帮助您将张量的正确元素与其他张量的正确元素混合。 让我们试试看。 首先,我们将创建一个张量。 现在让我们添加一个额外的维度 我们还可以使用 但请记住,使用 如果我们想将新张量叠加在自身之上五次,我们可以使用 如何从张量中删除所有单一维度?可以使用 要执行 读者还可以使用
索引(从张量中挑选数据)有时会希望从张量中选择特定数据(例如,仅第一列或第二行),可以使用索引。 如果读者曾经在 Python 列表或 NumPy 数组上进行过索引,那么在 PyTorch 中使用张量进行索引非常相似。 索引值为外部维度 -> 内部维度(检查方括号)。 可以使用 索引一开始可能会很混乱,尤其是对于较大的张量,对于有经验的人仍然需要多次尝试索引才能正确。 PyTorch 张量和 NumPy由于 NumPy 是一种流行的 Python 数值计算库,因此 PyTorch 具有与其良好交互的功能。 从 NumPy 到 PyTorch(并再次返回),使用的两种主要方法是:
让我们试试看。
因为 如果想从 PyTorch 张量到 NumPy 数组,可以调用 同样,如果改变原始的 再现性(试图从随机中取出随机)随着读者对神经网络和机器学习的了解越来越多,将会发现随机性的作用有多大。在计算机中这里的随机是伪随机性。因为随机性是被设计的,计算机基本上是确定性的(每一步都是可预测的),所以它们创建的随机性是模拟随机性。 那么这与神经网络和深度学习有什么关系呢? 我们讨论了神经网络从随机数开始描述数据中的关系,并尝试使用张量操作,改进这些随机数以更好地描述数据中的关系。 简而言之:
尽管随机性很好也很强大,但有时我们希望随机性少一点。 为什么? 因此我们可以进行可重复的实验。 这就是再现性的用武之地。 换句话说,读者能在自己的计算机上运行与其他人的代码,并且获得相同(或非常相似)的结果吗? 让我们看一个 PyTorch 中可再现性的简短示例。 我们将从创建两个随机张量开始,因为它们是随机的,读者会认为它们是不同的吗? 正如读者预料的那样,张量具有不同的值。但是如果想创建两个具有相同值的随机张量怎么办。 这就需要 在 GPU 上运行张量(并进行更快的计算)深度学习算法需要大量的数值运算。 默认情况下,这些操作通常在 CPU(计算机处理单元)上完成。 然而,还有另一种常见的硬件,称为 GPU(图形处理单元),它在执行神经网络所需的特定类型的操作(矩阵乘法)时通常比 CPU 快得多。 有几种方法可以首先访问 GPU,然后让 PyTorch 使用 GPU。 若在 Kaggle(注册需要外网) 或是 Google Colab(一直需要外网) 平台上运行代码,可以开启 GPU 设置。 1. 获得 GPU如果没有,有几种方法可以访问其中一个。
要检查是否可以访问 Nvidia GPU,可以 如果没有可访问的 Nvidia GPU,上面的内容将输出如下内容: NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running. 2. 让 PyTorch 在 GPU 上运行一旦准备好访问 GPU,下一步就是让 PyTorch 用于存储数据(张量)和计算数据(对张量执行操作)。为此,可以使用该 可以使用 如果以上输出 现在,假设你想要设置代码,使其在可用的 CPU 或 GPU 上运行。这样,如果其他人运行你的代码时,无论他们使用何种计算设备,代码都可以正常工作。 让我们创建一个 如果上面的输出
如果想做更快的计算,可以使用一个 GPU,但如果想做更快的计算,可以使用多个 GPU。 使用 了解 PyTorch 可用的 GPU 数量,可以让一个特定进程在一个 GPU 上运行,而在另一个 GPU 上运行另一个进程(PyTorch 还能让所有GPU 上运行一个进程)。 3. 将张量(和模型)放在 GPU 上可以通过 为什么要这样做? GPU 提供比 CPU 快得多的数值计算,如果 GPU 不可用,由于 设备不可知,它将在 CPU 上运行。
让我们尝试创建一个张量并将其放在 GPU 上(如果可用)。 请注意,第二个张量有 4. 将张量移回 CPU如果想使用 NumPy 与张量进行交互(NumPy 不利用 GPU),将需要执行以下操作。 让我们使用 相反,要将张量返回给 CPU 并可用于 NumPy,可以使用 这会将张量复制到 CPU 内存,因此它可用于 CPU。 以上返回在 CPU 内存中 GPU 张量的副本,因此原始张量仍在 GPU 上。 点击👇卡片关注我,第一时间获取干货~ |
|
来自: NeighborMrSun > 《语法技巧》