小白到高手的人工智能学习笔记之初步了解pytorch
PyTorch 基本原理
PyTorch?
PyTorch 是一个开源的机器学习和深度学习框架。允许您使用Python代码操作和处理数据并编写机器学习算法.
许多世界上最大的科技公司,如[Meta (Facebook)](https://ai.facebook.com/blog/pytorch-builds-the-future-of-ai-and-machine-learning-at-facebook/)、特斯拉(Tesla)和微软(Microsoft),以及[OpenAI]等人工智能研究公司,都使用PyTorch](https://openai.com/blog/openai-pytorch/)来推动研究,并将机器学习引入他们的产品。
例如,Andrej Karpathy(特斯拉人工智能主管)就特斯拉如何使用PyTorch为其自动驾驶计算机视觉模型提供动力进行了几次演讲([PyTorch DevCon 2019](https://youtu.be/oBklltKXtDE), Tesla AI Day 2021)。
PyTorch也用于其他行业,如农业[为拖拉机的计算机视觉提供动力](https://medium.com/pytorch/ai-for-ag-production-machine-learning-for-agriculture-e8cfdb9849a1)。
为什么使用 PyTorch?
机器学习研究人员喜欢使用PyTorch。截至2022年2月,PyTorch是Papers With Code中使用最多的深度学习框架,这是一个跟踪机器学习研究论文及其附带的代码库的网站。
PyTorch还在幕后帮助处理许多事情,比如GPU加速(使代码运行得更快)。
所以你可以专注于操作数据和编写算法,PyTorch将确保它运行得很快。
如果特斯拉(Tesla)和Meta (Facebook)等公司使用它来构建模型,为数百个应用程序提供动力,驱动数千辆汽车,并向数十亿人提供内容,那么它显然也能在开发方面发挥作用。
我们将讨论的内容
本课程分为不同的部分。
每个部分都涵盖了PyTorch中的重要思想和概念。
后续的笔记建立在前一个部分的知识基础上(编号从00、01、02开始,直到最后)。
本手册涉及机器学习和深度学习的基本组成部分,张量。
具体来说,我们将涵盖:
Topic | Contents |
---|---|
张量简介 | 张量是所有机器学习和深度学习的基本组成部分。 |
创建张量 | 张量几乎可以表示任何类型的数据(图像,单词,数字表)。 |
从张量中获取信息 | 如果你能把信息放入张量中,你也会想把它拿出来。 |
操纵张量 | 机器学习算法(如神经网络)涉及以许多不同的方式操纵张量,如加、乘、组合。 |
处理张量形状 | 机器学习中最常见的问题之一是处理形状不匹配(试图将错误形状的张量与其他张量混合)。 |
如果你在Python列表或NumPy数组上建立索引,它与张量非常相似,除了它们可以有更多的维度。 | |
混合PyTorch张量和NumPy数组 | PyTorch 基于张量, NumPy 更加推崇数组,有时你会想要混合和匹配它们。 |
机器学习是非常实验性的,因为它使用了大量的“随机性”来工作,有时你会希望“随机性”不是那么随机。 | |
在GPU上运行张量 | GPU(图形处理单元)使您的代码更快,PyTorch使您的代码更容易在GPU上运行。 |
导入 PyTorch
注意: 在运行本手册中的任何代码之前,您应该完成[PyTorch设置步骤,在windows 系统中,打开powershell 简单的采用命令行
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
注意了,这里的地址https://download.pytorch.org/whl/cu118 给定的是cuda版本,我这里使用的是11.8版本的Cuda.如果需要在GPU上面运行的pytorch,你就需要指定pytorch的Cuda版本,否则安装的PyTorch只能在CPU当中运行。
让我们从导入PyTorch并检查我们正在使用的版本开始。
准备python脚本
import torch
print(torch.__version__)
输出
2.7.0+cu118
太棒了,看起来我们已经有了PyTorch 2.7.0。
张量的简介
现在我们已经导入了PyTorch,是时候学习张量了。
张量是机器学习的基本组成部分。
它们的工作是以数字的方式表示数据。
让我们通过编码来学习更多关于张量的知识。
创建张量
PyTorch喜欢张量。所以有一个完整的文档页面专门用于[’ torch.Tensor '](https://pytorch.org/docs/stable/tensors.html)类。
你的第一个作业是阅读‘ torch.Tensor ’的文档 10分钟。但你可以稍后再讲。
让我们的代码。
我们首先要创建的是一个标量。
标量是一个单独的数字,用张量的术语来说它是一个零维张量。
注意: 这是这门课的趋势。我们将专注于编写特定的代码。但我通常会设置一些练习,包括阅读和熟悉PyTorch文档。因为毕竟,一旦你完成了这门课程,你无疑会想要学习更多。文档是你会经常看到的地方。
#Scalar
scalar = torch.tensor(7)
print(scalar)
输出为
tensor(7)
看看上面是怎么打印出张量(7)的(也就是tensor(7))?
这意味着尽管标量是一个数字,它的类型是torch张量。
我们可以使用ndim属性来检查张量的维度。
print(scalar.ndim)
输出为:
0
如果我们想从张量中取回这个数呢?
比如,把它从Pytorch上转过来。一个Python整数的张量?
为此,我们可以使用item()方法。
# Get the Python number within a tensor (only works with one-element tensors)
print(scalar.item())
输出为:
7
好的,现在我们来看一个向量。
向量是一个单维张量,但可以包含许多数字。
比如,你可以用一个向量[3,2]来描述你房子里的[卧室,浴室]。或者你可以用[3,2,2]来描述你家里的[卧室,浴室,停车场]。
这里的重要趋势是,向量在它所能表示的东西上是灵活的(张量也是如此)。
# Vector
vector = torch.tensor([7, 7])
print(vector)
输出为:
tensor([7, 7])
很好,向量vector现在包含两个7,我最喜欢的数字。
你认为它会有多少维度?
# Check the number of dimensions of vector
print(vector.ndim)
输出为:
1
嗯,这很奇怪,向量vector包含两个数但是只有一个维度。
我跟你玩个把戏。
在PyTorch中,你可以通过外部方括号([)的数量来判断张量的维度数,你只需要计算一面。
向量有多少方括号?
张量的另一个重要概念是它们的形状(shape)属性。形状告诉你里面的元素是如何排列的。
我们来看看向量的形状。
# Check shape of vector
vector.shape
输出为:
torch.Size([2])
上面的代码返回torch.Size([2]),这意味着我们的向量的形状是[2]。这是因为我们将两个元素放在方括号内([7,7])。
现在我们来看一个矩阵。
#Matrix
MATRIX = torch.tensor([[7, 8], [9, 10]])
print(MATRIX)
输出为:
tensor([[ 7, 8],[ 9, 10]])
更多的数字! 变量MATRIX和变量vector一样灵活,只不过它们多了一个维度。
看一下矩阵的维度
# Check number of dimensions
print(MATRIX.ndim)
输出为:
2
变量MATRIX有两个维度(你数过一边外面方括号的个数吗?)
你认为它会是什么形状?
print(MATRIX.shape)
输出为:
torch.Size([2, 2])
我们得到输出是torch.Size([2, 2]),因为变量MATRIX是两个元素深,两个元素宽。
我们创建一个张量 (tensor),来看看是怎么样的情况?
TENSOR = torch.tensor([[[1, 2, 3],[3, 6, 9], [2, 4, 5]]])
print(TENSOR)
输出为:
tensor([[[1, 2, 3],[3, 6, 9],[2, 4, 5]]])
哇!这就是张量啊(不是张亮麻辣烫)。
我想强调张量几乎可以表示任何东西。
你认为它有多少维度?(提示:使用方括号计数技巧)
# Check number of dimensions for TENSOR
print(TENSOR.ndim)
输出为:
3
然后就是这个变量的形状。
# Check shape of TENSOR
print(TENSOR.shape)
输出为:
torch.Size([1, 3, 3])
这里的输出,可以与原始数据的三重方括号对应起来。
[!TIP]
你可能已经注意到我用小写字母表示标量和向量,用大写字母表示矩阵和张量。这是故意的。在实践中,你会经常看到标量和向量用小写字母表示,比如y或a,矩阵和张量用大写字母表示,比如X或W。
你可能还会注意到矩阵和张量这两个名字可以互换使用。这很常见。因为在PyTorch中你经常处理torch.Tensor(张量的名字由此而来),然而,内部的形状和尺寸将决定它实际上是什么。
下面,我们就可以做一个总结了:
名称 | 具体意义 | 维度数目 | 大小写(举例) |
---|---|---|---|
标量 | 单独数字 | 0 | 小写(a) |
向量 | 带有方向的数字 | 1 | 小写(y) |
矩阵 | 二维数字数组 | 2 | 大写(Q) |
张量 | 多维数字数组 | 任何正整数,也包括零 | 大写 (X) |
随机的张量
我们已经建立了张量代表某种形式的数据。
神经网络等机器学习模型在张量中操纵和寻找模式。
但是当使用PyTorch构建机器学习模型时,你很少会手工创建张量(就像我们一直在做的那样)。
相反,机器学习模型通常从大量随机数字张量开始,并在处理数据时调整这些随机数以更好地表示数据。
从本质上讲:
从随机数开始->查看数据->更新随机数->查看数据->更新随机数…
作为数据科学家,您可以定义机器学习模型如何启动(初始化),查看数据(表示)和更新(优化)其随机数。
稍后我们将掌握这些步骤。
现在,让我们看看如何创建一个随机数张量。
我们可以使用torch.rand()并传入size参数。
# Create a random tensor of size (3, 4)
random_tensor = torch.rand(size=(3, 4))
print(random_tensor)
print(random_tensor.dtype
输出为:
tensor([[0.5096, 0.9002, 0.0358, 0.6309],[0.2991, 0.2683, 0.3643, 0.2328],[0.4461, 0.2612, 0.3237, 0.6506]])
torch.float32
torch.rand()的灵活性在于我们可以根据需要调整大小。
例如,假设你想要一个普通图像形状为[224,224,3]([height, width, color_channels])的随机张量。
random_image_size_tensor = torch.rand(size=(224, 224, 3))
print(random_image_size_tensor.shape)
print(random_image_size_tensor.ndim)
输出为:
torch.Size([224, 224, 3])
3
一和零
有时候你只是想用0或1填充张量。
这种情况在掩蔽中经常发生(比如用零掩盖一个张量中的一些值,让模型知道不去学习它们)。
让我们用torch.zeros() 创建一个全是0的张量。
同样,大小参数起了作用。
# Create a tensor of all zeros
zeros = torch.zeros(size=(3, 4))
print(zeros)
print(zeros.dtype)
输出为:
tensor([[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]])
torch.float32
使用torch.ones()方法可以做出以数字一填充的张量。
# Create a tensor of all ones
ones = torch.ones(size=(3, 4))
print(ones)
print( ones.dtype)
输出为:
tensor([[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]])
torch.float32
创建一个类似张量的序列
有时您可能需要一个数字范围,例如1到10或0到100。
你可以用touch.arrange(start,end,step)这个方法这样做。
这里:
start =范围的开始(例如0)
end =范围的结束(例如10)
step=每个值之间的步长(例如1)
注意:在Python中,你可以使用range()来创建一个数列。然而,在PyTorch中,torch.range()已被弃用,并可能在将来显示错误。
# Create a range of values 0 to 10
zero_to_ten = torch.arange(start=0, end=10, step=1)
print(zero_to_ten)
输出为:
tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
有时候你可能想要一个张量具有和另一个张量相同的形状。
例如,一个全零张量和之前的张量形状相同。
要做到这一点,你可以使用torch.zeros_likeinput)或torch.ones_like(input),它们分别返回一个由0或1填充的张量,其形状与输入相同。
# Can also create a tensor of zeros similar to another tensor
ten_zeros = torch.zeros_like(input=zero_to_ten) # will have same sha