Pytorch入门(上)

首先来介绍张量:

在数学中,一个单独的数可以称为标量,一列或者一行数组可以称为向量,一个二维数组称为矩阵,矩阵中的每一个元素都可以被行和列的索引位移确定,如果数组的维度超过2,那么我们可以称该数组为张量(Tensor)。但是在pytorch中,张量属于一种数据结构,他可以是一个标量、一个向量、一个矩阵,甚至是更高位的数组,所以pytorch中Tensor和Numpy中的数组(ndarray)非常相似,再使用时也经常将Pytorch中的张量和Numpy中的数组相互转化。在深度网络中,基于Pytorch的先关计算和优化都是在Tensor的基础上完成的。

在pytorch的0.4版本之前,Tensor是不能计算梯度的,所以在深度学习网络中,需要计算梯度的Tensor都需要使用Variable(Tensor)将张量进行封装,这样才能构件计算图。但是在Pytorch的0.4版本之后,合并了Tensor和Variable类,可直接计算Tensor的梯度,不再需要使用Variable封装Tensor,因此Variable()的使用逐渐从API中消失。

在torch中CPU和GPU张量分别有8种数据类型。

数据类型dtypeCPU TensorGPU Tensor
32位浮点型torch.float32或torch.floattorch.FloatTensortorch.cuda.FloatTensor
64位浮点型torch.float64或torch.doubletorch.DoubleTensortorch.cuda.DoubleTensor
16位浮点型torch.float16或torch.halftorch.HalfTensortorch.cuda.HalfTensor
8位无符号整数torch.unit8torch.ByteTensortorch.cuda.ByteTensor
8位有符号整数torch.int8torch.CharTensortorch.cuda.CharTensor
16位有符号整形torch.int16或torch.shorttorch.ShortTensortorch.cuda.ShortTensor
32位有符号整形torch.int32或torch.inttorch.IntTensortorch.cuda.intTensor
64位有符号整形torch.int64或torch.longtorch.LongTensortorch.cuda.LongTensor

在torch中默认的数据类型是32位浮点型(torch.FloatTensor),可以通过torch.set_default_tensor_type()函数设置默认的数据类型,但是该函数只支持设置浮点型数据类型,下面使用程序展示如何查看和设置张量的数据类型。

 在程序中使用torch.tensor()函数生成一个张量,然后使用.dtype方法获取张量的数据类型,结果为32位浮点型。

在上面的程序中,从张量的.type方法输出结果为torch.float64可知,通过torch.set_default_tensor_type(torch.DoubleTensor)已经将默认的数据类型设置为64位浮点型。

在torch中还有其它类型的数据,将浮点型转化为其它数据类型的方法如下:

 

由于在程序片段In[2]中已经将张量默认的数据类型设置为64位浮点型,所以生成的张量a的数据类型为torch.float64.针对张量a,可以使用a.long()方法将其转化为64位有符号整数,a.int()方法将其转化为32位有符号整型,a.float()方法将其转化为32位浮点型。

 如果想要恢复默认的32位浮点型数据类型,需要再次使用torch.set_default_tensor_type()函数,程序如下:

 在上面的程序中,从张量的.dtype方法输出结果为torch.float32可知,已经将默认的数据类型恢复为32位浮点型。

也可以使用torch.get_default_dtype()函数,获取默认的数据类型,如:

 在pytorch中有多种方式可以生成一个张量,下面使用具体的代码介绍如何生成深度学习过程需要的张量。

(1)使用torch.tensor()函数生成张量

Python的列表或序列可以通过torch.tensor()函数构造张量。

 上面程序使用torch.tensor()函数将Python的列表转化为张量。张量的维度可以通过.shape查看,并可使用.size()方法计算张量的形状大小,使用.numel()方法计算张量中包含元素的数量,例如:

在使用torch.tensor()函数时,可以使用参数dtype来指定张量的数据类型,使用参数requires_grad来指定张量是否需要计算梯度。只有计算了梯度的张量,才能在深度网络优化时根据梯度大小进行更新。 

程序中使用参数dtype=torch.float32指定张量B中的元素为32位浮点型,使用参数requires_grad=True表明张量B可以计算每个元素的梯度。下面针对张量B计算sum(B^2)在每个元素上的梯度大小:

 

 从输出结果可以看出每个位置上的梯度为2*b。这里需要注意的是,只有浮点型数据才能计算梯度,其它类型的数据是不能计算张量的梯度,下面的程序就会报错。

 根据报错信息我们就知道只有浮点类型的数据需要梯度。

(2)torch.Tensor()函数

在pytorch中也可以使用torch.Tensor()函数来生成张量,而且可以根据指定的形状生成张量。例如,根据Python列表生成张量。

也可以根据形状参数生成特定尺寸的张量。

 

 针对已经生成的张量可以使用torch.**_like()系列函数生成与指定张量维度相同、性质相似的张量,如使用torch.ones_like()函数生成与D维度相同的全1张量。

使用torch.zeros_like()函数生成与D维度相同的全0张量:

 

 使用torch.rand_like()函数生成与D维度相同的随机张量:

针对一个创建好的张量D,可以使用D.new_**()系列函数创建出新的张量,如使用D.new_tensor()将列表转化为张量:

 

 上面的程序使用D。new_tensor(e)将列表转化为32位浮点型的张量。还可以用其它函数得到新的张量。如下所示

函数描述
d.new_full((3,3),fill_value=1)3*3使用1填充的张量
d.new_zeros((3,3))3*3的全0张量
d.new_empty((3,3))3*3的空向量
d.new_ones((3,3))3*3的全1向量

<think>首先,用户的问题是:“我想获取PyTorch入门知识 请问PyTorch入门知识”。这直接表达了用户想了解PyTorch入门知识的需求。 系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户提供的引用: - 引用[1]:关于PyTorch入门基础知识,提到了dir()和help()函数。 - 引用[2]:关于Adam优化算法的参数。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 检查对话历史: - 上一次用户的问题是:“我想获取PyTorch入门知识 请问PyTorch入门知识”,这是第一个问题,所以没有上一次的问题和回答。 因此,我需要基于用户的直接问题来回答,同时参考提供的引用作为辅助。 用户可见层的额外指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 所以,我的回答应该: 1. 结构清晰地介绍PyTorch入门知识。 2. 参考引用[1]和[2],但主要基于我的知识。 3. 包括生成相关问题。 4. 使用中文。 5. 正确格式LaTeX。 PyTorch入门知识的关键点: - PyTorch是一个开源的深度学习框架。 - 入门知识包括: - 安装PyTorch。 - 基本概念:张量(Tensors)、自动微分(Autograd)、模块(Modules)。 - 核心组件:torch.nn、torch.optim、torch.utils.data。 - 常用函数:如dir()和help()函数(来自引用[1])。 - 优化器:如Adam优化器(来自引用[2])。 结构回答: - 逐步引导用户。 1. 介绍PyTorch。 2. 安装指南。 3. 基本操作:张量操作。 4. 构建模型:神经网络模块。 5. 优化器和损失函数。 6. 数据加载和训练循环。 - 自然地融入引用。 生成相关问题:在回答结束时,添加§§相关问题§§部分。 确保LaTeX:如果有数学表达式,如优化器公式,使用$...$或$$...$$。 - 例如,Adam优化器的更新规则:$$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t $$ - 但保持简单,只在必要时添加。 回答大纲: - 开头:直接回答问题。 - 主体: - PyTorch是什么? - 安装PyTorch。 - 基础:张量和操作(使用dir()和help())。 - 构建简单模型。 - 训练:优化器和损失函数(参考Adam)。 - 结束:生成相关问题。 引用标识:在相关的地方添加[^1]和[^2]。 最终回答: - 使用中文。 - 清晰结构。 </think>### PyTorch入门知识指南 PyTorch是一个开源的深度学习框架,由Facebook开发,广泛应用于研究和生产中。它以其动态计算图(Dynamic Computation Graph)和易用性著称,特别适合初学者入门深度学习。我将逐步介绍入门基础知识,包括安装、核心概念和关键组件,帮助你快速上手。回答基于提供的引用内容(如dir()和help()函数、Adam优化器等)进行扩展,确保内容的可靠性[^1][^2]。 #### 1. **PyTorch概述与安装** PyTorch的核心是处理张量(Tensors),它是多维数组的抽象,类似于NumPy的数组,但支持GPU加速。入门第一步是安装PyTorch: - **安装方法**:访问[PyTorch官网](https://pytorch.org/),选择你的操作系统和CUDA版本(GPU支持),然后运行推荐的pip命令。例如: ```bash pip install torch torchvision torchaudio ``` - **验证安装**:在Python中导入PyTorch并检查版本: ```python import torch print(torch.__version__) # 输出PyTorch版本,如'2.0.1' ``` #### 2. **基础操作:张量与工具函数** PyTorch的核心是张量操作。使用`dir()`和`help()`函数可以高效探索工具: - **`dir()` 函数**:列出模块中的所有属性和方法,帮助“打开”PyTorch的工具箱。例如: ```python import torch print(dir(torch)) # 列出torch模块的所有内容,如Tensor、nn、optim等分区 ``` - **`help()` 函数**:提供详细的使用说明,相当于“说明书”。例如: ```python help(torch.Tensor) # 查看张量类的文档,包括创建方法(如zeros()、rand()) ``` 引用中提到,这两个函数是Python学习的法宝,能让你快速上手PyTorch的API[^1]。 - **张量创建与操作**:PyTorch张量支持数学运算、自动微分等。例如: ```python # 创建一个2x3张量 x = torch.tensor([[1, 2, 3], [4, 5, 6]]) # 基本运算 y = x + 10 # 张量加法 print(y) ``` 张量操作是构建模型的基础,类似NumPy语法,易于理解。 #### 3. **构建神经网络模型** PyTorch使用`torch.nn`模块定义神经网络。每个模型继承自`nn.Module`类: - **简单模型示例**:定义一个线性回归模型。 ```python import torch.nn as nn import torch.nn.functional as F class SimpleModel(nn.Module): def __init__(self): super().__init__() self.linear = nn.Linear(1, 1) # 输入特征1维,输出1维 def forward(self, x): return self.linear(x) # 前向传播 ``` 这里,`nn.Linear`表示一个全连接层,输入和输出维度可自定义。 #### 4. **训练模型:优化器与损失函数** 训练涉及损失函数和优化器。PyTorch的`torch.optim`模块提供多种优化算法: - **损失函数**:常见如均方误差(MSE)用于回归: ```python loss_fn = nn.MSELoss() # 定义损失函数 ``` - **优化器**:如Adam优化器,引用中描述了其参数[^2]。Adam结合了动量(Momentum)和自适应学习率,适用于大多数场景。参数包括: - `lr`:学习率(默认0.001)。 - `betas`:梯度平均系数(默认(0.9, 0.999))。 - `eps`:数值稳定性项(默认1e-8)。 - `weight_decay`:权重衰减(L2正则化,防止过拟合)。 示例代码: ```python model = SimpleModel() optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=0.01) # 引用Adam参数[^2] # 训练循环 for epoch in range(100): optimizer.zero_grad() # 梯度清零 outputs = model(inputs) # 前向传播 loss = loss_fn(outputs, targets) # 计算损失 loss.backward() # 反向传播,计算梯度 optimizer.step() # 更新参数 ``` 优化器的数学原理涉及梯度下降的迭代公式。例如,Adam的更新规则为: $$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t $$ 其中$\theta_t$是参数,$\eta$是学习率,$\hat{m}_t$和$\hat{v}_t$是偏置校正后的梯度估计[^2]。 #### 5. **数据加载与预处理** 使用`torch.utils.data`模块加载和处理数据: - **Dataset和DataLoader**:自定义数据集并批量加载。 ```python from torch.utils.data import Dataset, DataLoader class CustomDataset(Dataset): def __init__(self, data): self.data = data def __len__(self): return len(self.data) def __getitem__(self, idx): return self.data[idx] dataset = CustomDataset(your_data) dataloader = DataLoader(dataset, batch_size=32, shuffle=True) # 批量训练 ``` #### 6. **调试与资源** - **调试技巧**:多使用`print()`或`dir()/help()`检查张量形状和模型结构。 - **学习资源**:PyTorch官方教程、社区论坛和书籍如《深度学习入门PyTorch》。 - **注意事项**:初学者从CPU开始,逐步过渡到GPU(使用`device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')`)。 通过以上步骤,你可以构建和训练简单模型。PyTorch的动态图机制让调试更直观,适合快速迭代。记住,实践是学习的关键——尝试运行这些代码片段!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mez_Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值