当前位置: 首页 > news >正文

小白到高手的人工智能学习笔记之初步了解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开始,直到最后)。

本手册涉及机器学习和深度学习的基本组成部分,张量。

具体来说,我们将涵盖:

TopicContents
张量简介张量是所有机器学习和深度学习的基本组成部分。
创建张量张量几乎可以表示任何类型的数据(图像,单词,数字表)。
从张量中获取信息如果你能把信息放入张量中,你也会想把它拿出来。
操纵张量机器学习算法(如神经网络)涉及以许多不同的方式操纵张量,如加、乘、组合。
处理张量形状机器学习中最常见的问题之一是处理形状不匹配(试图将错误形状的张量与其他张量混合)。
如果你在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

相关文章:

  • Ubuntu24.04下安装ISPConfig全过程记录
  • AM32电调学习解读八:无感驱动相位波形解析
  • 架构思维:构建高并发扣减服务_分布式无主架构
  • SQL性能分析
  • 第二章 苍穹外卖
  • Mamba LLM 架构简介:机器学习的新范式
  • 互联网大厂Java面试场景:从Spring Boot到分布式缓存技术的探讨
  • QT聊天项目DAY11
  • 如何实现RTSP和RTMP低至100-200ms的延迟:直播SDK的技术突破
  • 数据结构 -- 树形查找(二)平衡二叉树
  • 【GPT入门】第39课 OPENAI官方API调用方法
  • 【数据结构】2-2-2 顺序表的插入删除查找
  • 【Linux高级全栈开发】2.1.3 http服务器的实现
  • ngx_http_proxy_protocol_vendor_module 模块
  • FreeSWITCH 简单图形化界面43 - 使用百度的unimrcp搞个智能话务台,用的在线的ASR和TTS
  • STM32SPI通信基础及CubeMX配置
  • 从零开始实现大语言模型(十五):并行计算与分布式机器学习
  • symfonos: 1靶场
  • 算法第21天 | 第77题. 组合、216. 组合总和 III、17. 电话号码的字母组合
  • React方向:react的基本语法-数据渲染
  • 上海百年龙华码头开启新航线,弥补浦江游览南段空缺
  • 中国驻美大使:远离故土的子弹库帛书正随民族复兴踏上归途
  • “GoFun出行”订单时隔7年扣费后续:平台将退费,双方已和解
  • 土耳其、美国、乌克兰三边会议开始
  • 女子七年后才知银行卡被盗刷18万元,警方抓获其前男友
  • 舱位已排到月底,跨境电商忙补货!美线订单大增面临爆舱,6月运价或翻倍