pytorch基础
1、使用PyTorch框架创建数据集(Dataset)和数据加载器(DataLoader)的基本流程,当前模式为训练模式(非测试模式),伪代码如下:
import torch
from torch.utils.data import Dataset, DataLoadeclass MyDataset(Dataset): # 创建自定义数据集对象def __init__(self, file):self.data = ... # 从file加载数据def __len__(self): # 返回数据集大小return len(self.data)def __getitem__(self, idx): # 根据索引返回样本return self.data[idx]# 训练阶段
dataset = MyDataset("train_data.txt")
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)for batch in dataloader:inputs, labels = batch# 训练模型...
2、pytorch 比 numpy 相比,优势在哪里:1.可以用GPU进行计算 2.方便计算梯度
3、接下来以一个代码为例,学习如何在 PyTorch 框架下实现的简单神经网络示例,包含数据生成、模型定义、训练和测试的完整流程:
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt# 1. 生成模拟数据
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
X = torch.tensor(X, dtype=torch.float32)
y = torch.tensor(y, dtype=torch.float32).view(-1, 1) # 调整为列向量# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 2. 定义神经网络模型
class NeuralNetwork(nn.Module):def __init__(self, input_size):super(NeuralNetwork, self).__init__()self.fc1 = nn.Linear(input_size, 64) # 第一全连接层self.relu = nn.ReLU()self.fc2 = nn.Linear(64, 32) # 第二全连接层self.fc3 = nn.Linear(32, 1) # 输出层self.sigmoid = nn.Sigmoid()def forward(self, x):x = self.fc1(x)x = self.relu(x)x = self.fc2(x)x = self.relu(x)x = self.fc3(x)x = self.sigmoid(x)return x# 初始化模型
model = NeuralNetwork(input_size=20)# 3. 定义损失函数和优化器
criterion = nn.BCELoss() # 二分类交叉熵损失
optimizer = optim.Adam(model.parameters(), lr=0.001)# 4. 训练模型
epochs = 100
train_losses = []
test_losses = []for epoch in range(epochs):# 训练阶段model.train()optimizer.zero_grad()outputs = model(X_train)loss = criterion(outputs, y_train)loss.backward()optimizer.step()train_losses.append(loss.item())# 测试阶段model.eval()with torch.no_grad():test_outputs = model(X_test)test_loss = criterion(test_outputs, y_test)test_losses.append(test_loss.item())if (epoch+1) % 10 == 0:print(f'Epoch [{epoch+1}/{epochs}], Train Loss: {loss.item():.4f}, Test Loss: {test_loss.item():.4f}')# 5. 绘制损失曲线
plt.plot(train_losses, label='Train Loss')
plt.plot(test_losses, label='Test Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.show()# 6. 模型评估
model.eval()
with torch.no_grad():y_pred = model(X_test)y_pred_class = (y_pred > 0.5).float()accuracy = (y_pred_class == y_test).float().mean()print(f'Test Accuracy: {accuracy.item()*100:.2f}%')
参考视频:2022最新版-李宏毅机器学习深度学习课程