第十五讲:Jupyter+PyTorch实战:开启你的"神经网络实验室"

[复制链接]
Aigc工程师
5 天前 54 0 看全部

微信扫码快速注册,学习AIGC更多知识

您需要 登录 才可以下载或查看,没有账号?立即注册

x
4月14日 (1)-封面.jpg

本集概要

  • 训练自己的神经网络前期准备
  • PyTorch核心功能
  • 开发环境配置
  • Jupyter Notebook使用
  • 实操演示卷积神经网络训练

视频教程
 


教程文档

1.torch安装

conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia

或者pip install

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121


2.其他库的安装

pip install numpy pandas matplotlib scikit-learn jupyterlab seaborn


3.生成 Jupyter 配置文件

jupyter notebook --generate-config

4.搜索“notebook_dir”


5.PyTorch入门示例 - MNIST数字识别

# MNIST 手写数字识别

## 1. 环境准备

# 导入必要的库
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
import matplotlib.pyplot as plt
%matplotlib inline

# 检查 GPU 是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用设备: {device}")

## 2. 数据加载与预处理

# 定义数据变换
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])

# 加载数据集
train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST('./data', train=False, transform=transform)

# 创建数据加载器
batch_size = 64
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size)

# 可视化一些样本
def show_samples(data_loader):
    examples = enumerate(data_loader)
    batch_idx, (example_data, example_targets) = next(examples)
    
    plt.figure(figsize=(12, 8))
    for i in range(6):
        plt.subplot(2, 3, i+1)
        plt.imshow(example_data[0], cmap='gray')
        plt.title(f"标签: {example_targets}")
        plt.axis('off')
    plt.tight_layout()
    
show_samples(train_loader)

## 3. 定义模型

# 定义神经网络模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 3, 1)
        self.conv2 = nn.Conv2d(32, 64, 3, 1)
        self.dropout1 = nn.Dropout2d(0.25)
        self.dropout2 = nn.Dropout2d(0.5)
        self.fc1 = nn.Linear(9216, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = self.conv2(x)
        x = F.relu(x)
        x = F.max_pool2d(x, 2)
        x = self.dropout1(x)
        x = torch.flatten(x, 1)
        x = self.fc1(x)
        x = F.relu(x)
        x = self.dropout2(x)
        x = self.fc2(x)
        output = F.log_softmax(x, dim=1)
        return output

# 创建模型实例并移至设备
model = Net().to(device)
print(model)

# 定义优化器和损失函数
optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = F.nll_loss

## 4. 训练模型

# 定义训练函数
def train(model, train_loader, optimizer, epoch):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
        if batch_idx % 100 == 0:
            print(f'训练轮次: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} '
                  f'({100. * batch_idx / len(train_loader):.0f}%)]\t损失: {loss.item():.6f}')
    return loss.item()

# 定义测试函数
def test(model, test_loader):
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for data, target in test_loader:
            data, target = data.to(device), target.to(device)
            output = model(data)
            test_loss += criterion(output, target, reduction='sum').item()
            pred = output.argmax(dim=1, keepdim=True)
            correct += pred.eq(target.view_as(pred)).sum().item()
            
    test_loss /= len(test_loader.dataset)
    accuracy = 100. * correct / len(test_loader.dataset)
    
    print(f'测试集: 平均损失: {test_loss:.4f}, 准确率: {correct}/{len(test_loader.dataset)} ({accuracy:.2f}%)')
    return test_loss, accuracy

# 训练模型
epochs = 5
train_losses = []
test_losses = []
test_accuracies = []

for epoch in range(1, epochs + 1):
    train_loss = train(model, train_loader, optimizer, epoch)
    test_loss, accuracy = test(model, test_loader)
    train_losses.append(train_loss)
    test_losses.append(test_loss)
    test_accuracies.append(accuracy)

## 5. 可视化结果

# 绘制训练和测试损失
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(range(1, epochs + 1), train_losses, label='训练损失')
plt.plot(range(1, epochs + 1), test_losses, label='测试损失')
plt.xlabel('轮次')
plt.ylabel('损失')
plt.legend()
plt.title('训练和测试损失')

plt.subplot(1, 2, 2)
plt.plot(range(1, epochs + 1), test_accuracies, label='测试准确率')
plt.xlabel('轮次')
plt.ylabel('准确率 (%)')
plt.legend()
plt.title('测试准确率')

plt.tight_layout()
plt.show()

# 可视化模型预测
def visualize_predictions(model, test_loader):
    # 获取一批数据
    examples = enumerate(test_loader)
    batch_idx, (example_data, example_targets) = next(examples)
    
    # 获取预测结果
    with torch.no_grad():
        example_data = example_data.to(device)
        output = model(example_data)
        example_data = example_data.cpu()
    
    # 获取预测的类别
    pred = output.argmax(dim=1, keepdim=True).cpu()
    
    # 显示结果
    plt.figure(figsize=(12, 8))
    for i in range(6):
        plt.subplot(2, 3, i+1)
        plt.imshow(example_data[0], cmap='gray')
        plt.title(f'预测: {pred[0]}, 实际: {example_targets}')
        plt.axis('off')
    plt.tight_layout()
    
visualize_predictions(model, test_loader)

## 6. 保存模型

# 保存模型
torch.save(model.state_dict(), 'mnist_cnn.pt')
print("模型已保存")

# 如何加载模型
# 创建一个新的模型实例
# new_model = Net().to(device)
# 加载保存的权重
# new_model.load_state_dict(torch.load('mnist_cnn.pt'))
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表

Aigc工程师当前离线
管理员

查看:54 | 回复:0

欢迎
快速回复 返回顶部 返回列表