第2章 - PyTorch基础操作实训操作手册

1. 张量操作

目标:掌握基本的张量操作,如索引、切片、连接和变换。

内容:

a. 张量索引和切片

张量的索引和切片操作与Numpy数组非常相似。可以使用方括号[]来选择特定的元素、行、列或区域。

实操:

import torch  


tensor = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])  


# 选择第1行 
print(tensor[0])  


# 选择第1列 
print(tensor[:, 0])  


# 选择2x2的子张量 
print(tensor[0:2, 0:2]) 

b. 张量连接

可以使用torch.cat来连接两个或多个张量。

实操:

tensor1 = torch.tensor([1, 2, 3]) 
tensor2 = torch.tensor([4, 5, 6]) 
concatenated = torch.cat((tensor1, tensor2), dim=0) 
print(concatenated) 
  • 注意点:确保在连接时张量的形状是兼容的。

2. 自动微分与计算图

目标:理解PyTorch中的自动微分机制和如何使用它进行反向传播。

内容:

a. 计算图简介

计算图是表示数学表达式的图,其中节点表示张量,边表示从输入到输出的函数。PyTorch使用这些图来自动计算复杂表达式的导数。

b. 使用autograd进行自动微分

PyTorch的autograd模块使得自动微分变得非常简单。只需设置requires_grad=True,PyTorch就会为该张量构建计算图。

实操:

x = torch.tensor(2.0, requires_grad=True) 
y = x**2  
# 计算梯度 
y.backward()  
# 输出梯度 
dy/dx = 2x = 2*2 = 4 print(x.grad) 
  • 注意点:只有浮点型的张量才能需要梯度。确保在进行自动微分操作时,张量的requires_grad属性设置为True

3. 基本神经网络构建

目标:了解如何使用PyTorch构建一个简单的神经网络。

内容:

a. 构建一个简单的全连接层

在PyTorch中,可以使用nn.Module来构建神经网络模型。

实操:

import torch.nn as nn  
class SimpleNet(nn.Module):
     def __init__(self, input_size, hidden_size, output_size):
              super(SimpleNet, self).__init__()
              self.fc1 = nn.Linear(input_size, hidden_size)
              self.fc2 = nn.Linear(hidden_size, output_size)
     def forward(self, x):
              x = torch.relu(self.fc1(x))
              x = self.fc2(x)
              return x  
model = SimpleNet(3, 5, 2) 
print(model) 
  • 注意点:确保模型中的forward方法定义了数据的前向传播方式。

4. 数据加载和处理:使用DataLoader和Dataset

目标:学会使用PyTorch的数据加载工具,为模型训练做准备。

内容:

a. 使用Dataset加载数据

Dataset是一个抽象类,可以用来表示一个数据集。

b. 使用DataLoader进行批处理

DataLoader是一个迭代器,可以用来为神经网络轻松地加载数据。

实操:

from torch.utils.data import Dataset, DataLoader  


class SimpleDataset(Dataset):
     def __init__(self, data):
         self.data = data
     def __len__(self):
         return len(self.data)
     def __getitem__(self, idx):
         return self.data[idx]
           
dataset = SimpleDataset([1, 2, 3, 4, 5]) 
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)
  
for batch in dataloader:
     print(batch) 
  • 注意点:DataLoaderbatch_size参数决定了每个批次的数据量。shuffle=True确保数据在每个epoch之间都会被打乱。

实战项目:构建一个简单的线性回归模型

目标:使用PyTorch构建、训练并评估一个线性回归模型。

操作步骤:

import torch.optim as optim  


# 1. 生成模拟数据 
x_train = torch.randn(100, 1) * 10 
y_train = x_train + 3*torch.randn(100, 1)  


# 2. 构建线性回归模型 
class LinearRegression(nn.Module):
     def __init__(self):
         super(LinearRegression, self).__init__()
         self.linear = nn.Linear(1, 1)
     def forward(self, x):
         return self.linear(x)  


model = LinearRegression()  


# 3. 定义损失函数和优化器 
criterion = nn.MSELoss() 
optimizer = optim.SGD(model.parameters(), lr=0.01)  


# 4. 训练模型 
epochs = 100 
for epoch in range(epochs):
     model.train()     
     optimizer.zero_grad()     
     outputs = model(x_train)     
     loss = criterion(outputs, y_train)     
     loss.backward()     
     optimizer.step()     
     if (epoch+1) % 10 == 0:         
       print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}') 
  • 注意点:在每次迭代之前,都需要使用optimizer.zero_grad()来清除旧的梯度。
Logo

汇聚原天河团队并行计算工程师、中科院计算所专家以及头部AI名企HPC专家,助力解决“卡脖子”问题

更多推荐