PyTorch入门

本文介绍了PyTorch中的张量概念,包括标量、向量、矩阵、多维张量及GPU张量的创建与操作。此外,详细讲解了变量的使用,涉及反向传播和梯度计算。最后,概述了构建深度学习网络的步骤,包括网络架构、损失函数选择、优化器应用,并展示了如何定义自定义网络类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PyTorch 提供两种类型的数据抽象,称为张量和变量。张量类似于Numpy中的数组,它们也可以在GPU上使用,并能够改善性能。

常见张量如下:

  • 标量(0维张量)
  • 向量(1维张量)
  • 矩阵(2维张量)
  • 3维张量
  • 切片张量
  • 4维张量
  • 5维张量
  • GPU张量

标量(0维张量)

x = torch.rand(10)
x.size()

注:标量的类型通常是FloatTensor或LongTensor

向量(1维向量)

temp = torch.FloatT

矩阵(2维向量)

boston_tensor = torch.from_numpy(boston.data)
boston_tensor.size()

boston_tensor[:2]

注:torch.from_numpy将Numpy数组转换成torch张量
3维张量

from PIL import Image
# 使用PIL包从磁盘读入熊猫图像并转成numpy数组
panda = np.array(Image.open('image.jpg').resize((224,224)))
panda_tensor = torch.from_numpy(panda)
panda_tensor.size()

切片张量

sales = torch.FloatTensor([1000, 23, 213, 42, 12, 25, 231, 53])
sales[:5]

4维张量

# 从磁盘中读取图片文件
cats = glob(data_path + '*.jpg')
#将图片转换为numpy数组
cat_images = np.array([np.array(Image.open(cat).resize((224,224))) for cat in cats[:64]])
cat_imgs = cat_imgs.reshape(-1, 224, 224, 3)
cat_tensors = torch.from_numpy(cat_imgs)

5维张量

# 视频数据,帧数
1×30×224×224×3  一个视频30帧,每帧图片224×224×3

GPU上的张量

a = torch.rand(2, 2)
b = torch.rand(2, 2)
c = a + b
d = torch.add(a, b)

#CPU
a.matmul(b)
#GPU
a = a.cuda()
b = b.cuda()
a.matmul(b)

注:PyTorch提供了一个名为cuda()的简单函数,将张量从CPU赋值到GPU。

变量

# class中定义Variable: data, grad和creator
x = Variable(torch.ones(2, 2), requires_grad=True)
y = x.mean()

y.backward() # 反向传播

x.grad   # 梯度

x.grad_fn # 指向梯度函数

注:深度学习算法经常表示计算图。

训练深度学习算法步骤:

  1. 构建数据管道
  2. 构建网络框架
  3. 使用损失函数评估架构
  4. 使用优化算法优化网络架构的权重

1. PyTorch 构建深度学习算法的方式(网络架构)

PyTorch中所有网络都实现为类,创建PyTorch类的子类要调用nn.Module,并实现__init__forward方法。在init中初始化层,在forward中,利用输入数据传给init中的初始化层,并返回最终值,通俗的讲,就是前向传播。

class MyFirstNetwork(nn.Module):
	def __init__(self, input_size, hidden_size, output_size):
		super(MyFirstNetwork, self).__init__()
		self.layer1 = nn.Linear(input_size, hidden_size)
		self.layer2 = nn.Linear(hidden_size, output_size)

	def __forward__(self, input):
		out = self.layer1(input)
		out = nn.ReLU(out)
		out = self.layer2(out)
		return out

注:继承父类,super方法用于将子类的参数传给父类。

2. 不同机器学习问题的模型框架(last_Lay)

基于要解决的问题类别,最后一层是确定的。使用机器学习或深度学习算法解决的问题通常由三类,最后一层的情况通常如下。

  • 对于回归问题,如预测T恤衫的销售价格,最后使用的是一个输出的线性层,输出值是连续的。
  • 将一张给定的图片归类为T恤衫或者衬衫,用到的是sigmoid激活函数,因为他的输出值不是接近于1就是接近于0,这种问题通常为二分类问题。
  • 对于多类别分类问题,如必须把给定的图片归类为T恤、牛仔裤、衬衫或连衣裙,网络最后使用softmax层。

3. 损失函数

一旦定义好网络架构,还剩下最重要的两步。一步是评估网络执行特定的回归或分类任务时表现的优异程度(损失值),另一步时优化权重

优化器(梯度下降)通常接受一个标量值,因而loss函数应生成一个标量值,并在其训练期间最小化。

回归问题经常使用的Loss函数是均方误差(MSE)(torch.nn.MSELoss)。
分类问题,经常使用交叉熵损失函数(torch.nn.CrossEntropyLoss()).

4. 优化网络结构

计算出网络的损失值后,需要优化权重以减少损失,并改善算法的准确率。

PyTorch提供的一些常用的优化器如下:

  • ADADELTA
  • Adagrad
  • Adam
  • SparseAdam
  • Adamax
  • ASGD
  • LBFGS
  • RMSProp
  • Rprop
  • SGD

optimizer = optim.SGD(model.parameters(), lr = 0.01)

for input, target in dataset:
	optimizer.zero.grad()
	output = model(input)
	loss = loss_fn(output, target)
	loss.backward() # 计算梯度值
	optimizer.step() # 用于真正改变调整学习参数
### PyTorch 入门教程 #### 加载库并准备数据集 为了开始使用 PyTorch 进行机器学习模型训练,加载必要的库是第一步。这包括 `torch` 及其子模块 `nn`(神经网络),以及用于获取标准图像分类数据集的 `datasets` 和转换工具 `ToTensor`。 ```python import torch from torch import nn from torch.utils.data import DataLoader from torchvision import datasets, transforms ``` 接着定义如何预处理输入图片的数据变换链——这里仅简单地将其转成张量形式: ```python transform = transforms.ToTensor() ``` 创建一个实例化后的 Dataset 对象来存储样本及其对应标签,并通过指定根目录、是否作为测试集以及其他参数完成初始化工作;最后利用 DataLoader 来封装这个自定义或内置的数据源类以便后续取用批次化的训练/验证数据[^1]。 ```python training_data = datasets.FashionMNIST( root="data", train=True, download=True, transform=ToTensor(), ) test_data = datasets.FashionMNIST( root="data", train=False, download=True, transform=ToTensor(), ) ``` 构建好上述组件之后就可以轻松获得批量大小为 64 的迭代器了: ```python train_dataloader = DataLoader(training_data, batch_size=64) test_dataloader = DataLoader(test_data, batch_size=64) ``` #### 定义模型结构 接下来要做的就是设计具体的网络架构,在此以简单的全连接层为例展示基本操作方法。当然实际应用中可能还会涉及到卷积核池化等更复杂的运算单元组合方式。 ```python class NeuralNetwork(nn.Module): def __init__(self): super(NeuralNetwork, self).__init__() self.flatten = nn.Flatten() # 展平多维特征向量 self.linear_relu_stack = nn.Sequential( # 构建线性层序列 nn.Linear(28*28, 512), nn.ReLU(), # 非线性激活函数 nn.Linear(512, 512), nn.ReLU(), nn.Linear(512, 10), # 输出维度等于类别数 ) def forward(self, x): # 正向传播过程描述 x = self.flatten(x) logits = self.linear_relu_stack(x) return logits model = NeuralNetwork().to('cuda' if torch.cuda.is_available() else 'cpu') print(model) # 打印查看当前设备上的模型配置详情 ``` 这段代码实现了两件事:一是继承基类 `Module` 并重写构造函数与前馈计算逻辑;二是根据硬件条件自动选择运行平台从而提高效率。 #### 训练循环设置 有了前面几步打下的基础,现在可以着手编写完整的训练流程啦! ```python loss_fn = nn.CrossEntropyLoss() # 设置损失函数类型 optimizer = torch.optim.SGD(model.parameters(), lr=1e-3) def train(dataloader, model, loss_fn, optimizer): size = len(dataloader.dataset) for batch, (X, y) in enumerate(dataloader): X, y = X.to(device), y.to(device) pred = model(X) # 调用模型预测输出 loss = loss_fn(pred, y) # 计算误差值 optimizer.zero_grad() # 清除梯度缓存区中的旧记录以免累积影响新一次更新 loss.backward() # 自动求导机制反传误差信号调整权重参数 optimizer.step() if batch % 100 == 0: current = batch * len(X) print(f"loss: {loss:>7f} [{current:>5d}/{size:>5d}]") device = 'cuda' if torch.cuda.is_available() else 'cpu' for t in range(epochs): print(f"Epoch {t+1}\n-------------------------------") train(train_dataloader, model, loss_fn, optimizer) print("Done!") ``` 以上部分展示了怎样设定优化算法超参选项并通过遍历 epoch 数目实现多次迭代直至收敛稳定状态为止的过程。 #### 测试评估性能指标 当所有准备工作都完成后自然少不了检验成果好坏的重要环节咯~下面给出了一种简易版的方法供参考借鉴: ```python def test(dataloader, model, loss_fn): size = len(dataloader.dataset) num_batches = len(dataloader) model.eval() test_loss, correct = 0, 0 with torch.no_grad(): for X, y in dataloader: X, y = X.to(device), y.to(device) pred = model(X) test_loss += loss_fn(pred, y).item() correct += (pred.argmax(1)==y).type(torch.float).sum().item() test_loss /= num_batches correct /= size print(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n") test(test_dataloader, model, loss_fn) ``` 该片段主要围绕着关闭 dropout 等随机因素干扰的前提下统计正确率和平均交叉熵得分来进行最终评判。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Fighting_1997

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

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

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

打赏作者

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

抵扣说明:

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

余额充值