Aigc工程师 发表于 2025-4-14 18:15:39

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

<div><br></div><div><br></div><p></p><font size="4" color="#8b0000"><b>        本集概要</b></font><div><br><div><ul><li><font size="3" style="">训练自己的神经网络前期准备</font></li><li><span style="color: rgb(64, 64, 64); font-family: DeepSeek-CJK-patch, Inter, system-ui, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Noto Sans&quot;, Ubuntu, Cantarell, &quot;Helvetica Neue&quot;, Oxygen, &quot;Open Sans&quot;, sans-serif;"><font size="3">PyTorch核心功能</font></span></li><li><span style="color: rgb(64, 64, 64); font-family: DeepSeek-CJK-patch, Inter, system-ui, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Noto Sans&quot;, Ubuntu, Cantarell, &quot;Helvetica Neue&quot;, Oxygen, &quot;Open Sans&quot;, sans-serif;"><font size="3">开发环境配置</font></span></li><li><span style="color: rgb(64, 64, 64); font-family: DeepSeek-CJK-patch, Inter, system-ui, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Noto Sans&quot;, Ubuntu, Cantarell, &quot;Helvetica Neue&quot;, Oxygen, &quot;Open Sans&quot;, sans-serif;"><font size="3">Jupyter Notebook使用</font></span></li><li><font size="3" style="">实操演示卷积神经网络训练</font></li></ul></div><div><div><br></div><div><b><font color="#8b0000" size="4">视频教程</font></b></div><div>&nbsp;
<iframe src="//1314335967.vod-qcloud.com/vod-player/1314335967/1397757909589096616/vod/vod-player-v4.html?autoplay=false&amp;width=720&amp;height=480&amp;psign=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6MTMxNDMzNTk2NywiZmlsZUlkIjoiMTM5Nzc1NzkwOTU4OTA5NjYxNiIsImN1cnJlbnRUaW1lU3RhbXAiOjE3NDQ2MjUxNTYsImNvbnRlbnRJbmZvIjp7ImF1ZGlvVmlkZW9UeXBlIjoiT3JpZ2luYWwiLCJpbWFnZVNwcml0ZURlZmluaXRpb24iOjEwfSwidXJsQWNjZXNzSW5mbyI6eyJkb21haW4iOiIxMzE0MzM1OTY3LnZvZC1xY2xvdWQuY29tIiwic2NoZW1lIjoiSFRUUFMifX0.2MNFP8N7DdNtWoq-JMZ8dfCsDOfS907wu7na5io8ECY&amp;lang=zh-CN" frameborder="0" scrolling="no" width="100%" height="480" allowfullscreen="">
</iframe></div></div></div>


<div><br></div><img src="static/image/hrline/1.gif" border="0" alt="" style="max-width:400px"><div><br><div><b><font color="#8b0000" size="4">教程文档</font></b></div><div><br>
<div><div><font size="3">1.torch安装</font></div><div><font size="3"><br></font></div><div><font size="3">conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia</font></div><div><font size="3"><br></font></div><div><font size="3">或者pip install</font></div><div><font size="3"><br></font></div><div><font size="3">pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121</font></div><div><font size="3"><br></font></div><div><font size="3"><br></font></div><div><font size="3">2.其他库的安装</font></div><div><font size="3"><br></font></div><div><font size="3">pip install numpy pandas matplotlib scikit-learn jupyterlab seaborn</font></div><div><font size="3"><br></font></div><div><font size="3"><br></font></div><div><font size="3">3.生成 Jupyter 配置文件</font></div><div><font size="3"><br></font></div><div><font size="3">jupyter notebook --generate-config</font></div><div><font size="3"><br></font></div><div><font size="3">4.搜索“notebook_dir”</font></div><div><font size="3"><br></font></div><div><font size="3"><br></font></div><div><font size="3">5.PyTorch入门示例 - MNIST数字识别</font></div><div><font size="3"><br></font></div><div><font size="3"># MNIST 手写数字识别</font></div><div><font size="3"><br></font></div><div><font size="3">## 1. 环境准备</font></div><div><font size="3"><br></font></div><div><font size="3"># 导入必要的库</font></div><div><font size="3">import torch</font></div><div><font size="3">import torch.nn as nn</font></div><div><font size="3">import torch.nn.functional as F</font></div><div><font size="3">import torch.optim as optim</font></div><div><font size="3">from torchvision import datasets, transforms</font></div><div><font size="3">import matplotlib.pyplot as plt</font></div><div><font size="3">%matplotlib inline</font></div><div><font size="3"><br></font></div><div><font size="3"># 检查 GPU 是否可用</font></div><div><font size="3">device = torch.device("cuda" if torch.cuda.is_available() else "cpu")</font></div><div><font size="3">print(f"使用设备: {device}")</font></div><div><font size="3"><br></font></div><div><font size="3">## 2. 数据加载与预处理</font></div><div><font size="3"><br></font></div><div><font size="3"># 定义数据变换</font></div><div><font size="3">transform = transforms.Compose([</font></div><div><font size="3">&nbsp; &nbsp; transforms.ToTensor(),</font></div><div><font size="3">&nbsp; &nbsp; transforms.Normalize((0.1307,), (0.3081,))</font></div><div><font size="3">])</font></div><div><font size="3"><br></font></div><div><font size="3"># 加载数据集</font></div><div><font size="3">train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform)</font></div><div><font size="3">test_dataset = datasets.MNIST('./data', train=False, transform=transform)</font></div><div><font size="3"><br></font></div><div><font size="3"># 创建数据加载器</font></div><div><font size="3">batch_size = 64</font></div><div><font size="3">train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)</font></div><div><font size="3">test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size)</font></div><div><font size="3"><br></font></div><div><font size="3"># 可视化一些样本</font></div><div><font size="3">def show_samples(data_loader):</font></div><div><font size="3">&nbsp; &nbsp; examples = enumerate(data_loader)</font></div><div><font size="3">&nbsp; &nbsp; batch_idx, (example_data, example_targets) = next(examples)</font></div><div><font size="3">&nbsp; &nbsp;&nbsp;</font></div><div><font size="3">&nbsp; &nbsp; plt.figure(figsize=(12, 8))</font></div><div><font size="3">&nbsp; &nbsp; for i in range(6):</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; plt.subplot(2, 3, i+1)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; plt.imshow(example_data, cmap='gray')</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; plt.title(f"标签: {example_targets}")</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; plt.axis('off')</font></div><div><font size="3">&nbsp; &nbsp; plt.tight_layout()</font></div><div><font size="3">&nbsp; &nbsp;&nbsp;</font></div><div><font size="3">show_samples(train_loader)</font></div><div><font size="3"><br></font></div><div><font size="3">## 3. 定义模型</font></div><div><font size="3"><br></font></div><div><font size="3"># 定义神经网络模型</font></div><div><font size="3">class Net(nn.Module):</font></div><div><font size="3">&nbsp; &nbsp; def __init__(self):</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; super(Net, self).__init__()</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; self.conv1 = nn.Conv2d(1, 32, 3, 1)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; self.conv2 = nn.Conv2d(32, 64, 3, 1)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; self.dropout1 = nn.Dropout2d(0.25)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; self.dropout2 = nn.Dropout2d(0.5)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; self.fc1 = nn.Linear(9216, 128)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; self.fc2 = nn.Linear(128, 10)</font></div><div><font size="3"><br></font></div><div><font size="3">&nbsp; &nbsp; def forward(self, x):</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; x = self.conv1(x)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; x = F.relu(x)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; x = self.conv2(x)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; x = F.relu(x)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; x = F.max_pool2d(x, 2)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; x = self.dropout1(x)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; x = torch.flatten(x, 1)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; x = self.fc1(x)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; x = F.relu(x)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; x = self.dropout2(x)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; x = self.fc2(x)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; output = F.log_softmax(x, dim=1)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; return output</font></div><div><font size="3"><br></font></div><div><font size="3"># 创建模型实例并移至设备</font></div><div><font size="3">model = Net().to(device)</font></div><div><font size="3">print(model)</font></div><div><font size="3"><br></font></div><div><font size="3"># 定义优化器和损失函数</font></div><div><font size="3">optimizer = optim.Adam(model.parameters(), lr=0.001)</font></div><div><font size="3">criterion = F.nll_loss</font></div><div><font size="3"><br></font></div><div><font size="3">## 4. 训练模型</font></div><div><font size="3"><br></font></div><div><font size="3"># 定义训练函数</font></div><div><font size="3">def train(model, train_loader, optimizer, epoch):</font></div><div><font size="3">&nbsp; &nbsp; model.train()</font></div><div><font size="3">&nbsp; &nbsp; for batch_idx, (data, target) in enumerate(train_loader):</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; data, target = data.to(device), target.to(device)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; optimizer.zero_grad()</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; output = model(data)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; loss = criterion(output, target)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; loss.backward()</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; optimizer.step()</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; if batch_idx % 100 == 0:</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print(f'训练轮次: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} '</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f'({100. * batch_idx / len(train_loader):.0f}%)]\t损失: {loss.item():.6f}')</font></div><div><font size="3">&nbsp; &nbsp; return loss.item()</font></div><div><font size="3"><br></font></div><div><font size="3"># 定义测试函数</font></div><div><font size="3">def test(model, test_loader):</font></div><div><font size="3">&nbsp; &nbsp; model.eval()</font></div><div><font size="3">&nbsp; &nbsp; test_loss = 0</font></div><div><font size="3">&nbsp; &nbsp; correct = 0</font></div><div><font size="3">&nbsp; &nbsp; with torch.no_grad():</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; for data, target in test_loader:</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data, target = data.to(device), target.to(device)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output = model(data)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test_loss += criterion(output, target, reduction='sum').item()</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pred = output.argmax(dim=1, keepdim=True)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; correct += pred.eq(target.view_as(pred)).sum().item()</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</font></div><div><font size="3">&nbsp; &nbsp; test_loss /= len(test_loader.dataset)</font></div><div><font size="3">&nbsp; &nbsp; accuracy = 100. * correct / len(test_loader.dataset)</font></div><div><font size="3">&nbsp; &nbsp;&nbsp;</font></div><div><font size="3">&nbsp; &nbsp; print(f'测试集: 平均损失: {test_loss:.4f}, 准确率: {correct}/{len(test_loader.dataset)} ({accuracy:.2f}%)')</font></div><div><font size="3">&nbsp; &nbsp; return test_loss, accuracy</font></div><div><font size="3"><br></font></div><div><font size="3"># 训练模型</font></div><div><font size="3">epochs = 5</font></div><div><font size="3">train_losses = []</font></div><div><font size="3">test_losses = []</font></div><div><font size="3">test_accuracies = []</font></div><div><font size="3"><br></font></div><div><font size="3">for epoch in range(1, epochs + 1):</font></div><div><font size="3">&nbsp; &nbsp; train_loss = train(model, train_loader, optimizer, epoch)</font></div><div><font size="3">&nbsp; &nbsp; test_loss, accuracy = test(model, test_loader)</font></div><div><font size="3">&nbsp; &nbsp; train_losses.append(train_loss)</font></div><div><font size="3">&nbsp; &nbsp; test_losses.append(test_loss)</font></div><div><font size="3">&nbsp; &nbsp; test_accuracies.append(accuracy)</font></div><div><font size="3"><br></font></div><div><font size="3">## 5. 可视化结果</font></div><div><font size="3"><br></font></div><div><font size="3"># 绘制训练和测试损失</font></div><div><font size="3">plt.figure(figsize=(12, 5))</font></div><div><font size="3">plt.subplot(1, 2, 1)</font></div><div><font size="3">plt.plot(range(1, epochs + 1), train_losses, label='训练损失')</font></div><div><font size="3">plt.plot(range(1, epochs + 1), test_losses, label='测试损失')</font></div><div><font size="3">plt.xlabel('轮次')</font></div><div><font size="3">plt.ylabel('损失')</font></div><div><font size="3">plt.legend()</font></div><div><font size="3">plt.title('训练和测试损失')</font></div><div><font size="3"><br></font></div><div><font size="3">plt.subplot(1, 2, 2)</font></div><div><font size="3">plt.plot(range(1, epochs + 1), test_accuracies, label='测试准确率')</font></div><div><font size="3">plt.xlabel('轮次')</font></div><div><font size="3">plt.ylabel('准确率 (%)')</font></div><div><font size="3">plt.legend()</font></div><div><font size="3">plt.title('测试准确率')</font></div><div><font size="3"><br></font></div><div><font size="3">plt.tight_layout()</font></div><div><font size="3">plt.show()</font></div><div><font size="3"><br></font></div><div><font size="3"># 可视化模型预测</font></div><div><font size="3">def visualize_predictions(model, test_loader):</font></div><div><font size="3">&nbsp; &nbsp; # 获取一批数据</font></div><div><font size="3">&nbsp; &nbsp; examples = enumerate(test_loader)</font></div><div><font size="3">&nbsp; &nbsp; batch_idx, (example_data, example_targets) = next(examples)</font></div><div><font size="3">&nbsp; &nbsp;&nbsp;</font></div><div><font size="3">&nbsp; &nbsp; # 获取预测结果</font></div><div><font size="3">&nbsp; &nbsp; with torch.no_grad():</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; example_data = example_data.to(device)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; output = model(example_data)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; example_data = example_data.cpu()</font></div><div><font size="3">&nbsp; &nbsp;&nbsp;</font></div><div><font size="3">&nbsp; &nbsp; # 获取预测的类别</font></div><div><font size="3">&nbsp; &nbsp; pred = output.argmax(dim=1, keepdim=True).cpu()</font></div><div><font size="3">&nbsp; &nbsp;&nbsp;</font></div><div><font size="3">&nbsp; &nbsp; # 显示结果</font></div><div><font size="3">&nbsp; &nbsp; plt.figure(figsize=(12, 8))</font></div><div><font size="3">&nbsp; &nbsp; for i in range(6):</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; plt.subplot(2, 3, i+1)</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; plt.imshow(example_data, cmap='gray')</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; plt.title(f'预测: {pred}, 实际: {example_targets}')</font></div><div><font size="3">&nbsp; &nbsp; &nbsp; &nbsp; plt.axis('off')</font></div><div><font size="3">&nbsp; &nbsp; plt.tight_layout()</font></div><div><font size="3">&nbsp; &nbsp;&nbsp;</font></div><div><font size="3">visualize_predictions(model, test_loader)</font></div><div><font size="3"><br></font></div><div><font size="3">## 6. 保存模型</font></div><div><font size="3"><br></font></div><div><font size="3"># 保存模型</font></div><div><font size="3">torch.save(model.state_dict(), 'mnist_cnn.pt')</font></div><div><font size="3">print("模型已保存")</font></div><div><font size="3"><br></font></div><div><font size="3"># 如何加载模型</font></div><div><font size="3"># 创建一个新的模型实例</font></div><div><font size="3"># new_model = Net().to(device)</font></div><div><font size="3"># 加载保存的权重</font></div><div><font size="3"># new_model.load_state_dict(torch.load('mnist_cnn.pt'))</font></div></div></div></div>
页: [1]
查看完整版本: 第十五讲:Jupyter+PyTorch实战:开启你的"神经网络实验室"