面对深度学习,你是否曾被复杂的环境配置、繁琐的包依赖困扰?是否想运行一段代码却不知从何下手?本文旨在为初入领域的
序言
搭建一个深度学习项目,分为如下板块
基于pytorch深度学习环境搭建python软件下载IDE(pycharm、vscode等)配置可运行的代码
降下来将按照板块顺序讲解。
基于pytorch深度学习环境搭建
在安装深度学习环境时,首先需要确定电脑是否有独立显卡(GPU),且GPU性能满足项目要求。
一般3060类似的显卡即可运行普通深度学习模型,如果是图像数据等占用现存较大的数据需要更大显存的显卡。确认电脑上是否有别人搭建过的环境,如果有的话可以直接用别人的环境生成一个副本作为自己的环境,事半功倍。
好的,已经收到您的补充内容。这段关于硬件检查和环境复用的建议非常实用,是新手很容易忽略的关键点。
我将把这段话整合到博客文章的 “1. 深度学习环境搭建” 部分的最开头,作为整个环境搭建过程的“预备检查”步骤,优化后的文章结构如下:
深度学习新手上路:从零搭建你的第一个PyTorch项目
1. 深度学习环境搭建 (Anaconda + CUDA)
在正式开始安装之前,有两点非常重要的预备检查,能让你事半功倍或避免走错方向:
检查你的硬件(GPU):深度学习项目,尤其是涉及图像、视频等数据时,通常需要GPU进行加速训练。首先需要确认电脑是否有NVIDIA独立显卡(GPU)。
显卡性能:一般来说,NVIDIA GTX 1060 / RTX 3060 或更高系列的显卡即可运行大多数深度学习模型。但对于图像等占用显存较大的任务,则需要更大显存的显卡(如12GB以上)。如何查看:在Windows上,可以通过任务管理器 -> 性能 -> GPU 查看你的显卡型号和显存大小。 检查现有的环境:如果你在实验室或公司的电脑上操作,可以先确认是否有同事或前辈已经搭建过Python环境。如果有的话,可以直接复用他们的Conda环境作为副本,这能省去大量配置和解决依赖冲突的时间。使用命令
可以查看当前系统上所有可用的环境。
conda env list
确认以上两点后,我们就可以开始下面的安装了。
步骤 1.1: 下载和安装 Anaconda
访问 Anaconda 官网。根据你的操作系统 (Windows/macOS/Linux) 下载 Python 3.9 或更新版本的安装包。推荐选择Python 3.x版本。按照安装向导进行安装。安装时注意勾选 “Add Anaconda to my PATH environment variable” (将其添加到系统环境变量)的选项,这样可以在系统终端或CMD中直接使用
命令。
conda
步骤 1.2: 验证 Anaconda 安装
安装完成后,打开你的命令提示符(CMD) 或 Anaconda Prompt (推荐使用后者)。
输入以下命令:
conda --version
如果正确显示版本号(如
),说明安装成功。
conda 24.5.0
步骤 1.3: 创建独立的虚拟环境
为你的深度学习项目创建一个独立的环境是个好习惯,可以避免不同项目间的库版本冲突。
在终端中运行:
# 创建一个名为 pytorch_env 的环境,并指定Python版本为3.9
conda create -n pytorch_env python=3.9
# 激活这个环境
# 在 Windows 上:
conda activate pytorch_env
# 在 macOS/Linux 上:
# source activate pytorch_env 或 conda activate pytorch_env
激活后,你会看到命令行提示符前的基础环境名 (
) 变成了你创建的环境名 (
base
)。
pytorch_env
步骤 1.4: 安装 PyTorch (GPU版本或CPU版本)
这是最关键的一步。请前往 PyTorch 官方网站,使用它提供的安装命令生成器。
选择你的配置:根据你的操作系统、包管理器(Conda或Pip)、编程语言(Python)和CUDA版本进行选择。确认CUDA版本:在安装GPU版本的PyTorch前,请确保你的电脑有NVIDIA显卡并已安装CUDA驱动。在CMD中输入
可以查看驱动信息和最高支持的CUDA版本。
nvidia-smi
如果你有NVIDIA显卡并想使用GPU加速:请选择对应的CUDA版本(如CUDA 11.8)。如果你没有NVIDIA显卡:请选择 CPU 版本。
博主不建议使用cpu进行模型训练,除非模型和数据量都很小,否则训练时间过长,且会造成电脑卡顿
例如,在Windows上使用Conda安装CUDA 11.8版本的PyTorch,命令可能如下:
【此处pytorch_env是虚拟环境的名称,可随意命名】
# 确保你已经激活了之前创建的虚拟环境 (pytorch_env)
conda activate pytorch_env
# 从PyTorch官网获取的最新命令(示例,请以官网为准)
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
安装需要一些时间,请耐心等待。
步骤 1.5: 验证PyTorch和GPU是否可用
安装完成后,在激活的
环境中启动Python解释器:
pytorch_env
python
然后依次输入以下Python代码:
import torch # 导入PyTorch
print(torch.__version__) # 打印PyTorch版本号,检查是否安装成功
print(torch.cuda.is_available()) # 输出True则表示GPU可用,False则不可用
如果最后一行打印出
,那么恭喜你,你的GPU版PyTorch环境已经配置成功!
True
2. Python软件下载
这一步其实已经在安装Anaconda时完成了。Anaconda是一个集成了Python和众多科学计算库的发行版。当你创建和激活Conda环境时,你使用的Python就是该环境下的独立Python解释器。
你可以通过以下命令检查当前环境下的Python位置和版本:
# 查看Python解释器的位置
which python # macOS/Linux)
where python # Windows
# 查看Python版本
python --version
3. IDE配置 (以PyCharm为例)
一个强大的IDE能极大提升编码效率。这里以 PyCharm (社区版免费) 为例。
注: 学生用户可通过学信网在线验证报告或教育邮箱申请专业版的一年使用证书
步骤 3.1: 下载和安装PyCharm
访问 JetBrains官网 下载社区版。运行安装程序完成安装。
步骤 3.2: 配置PyCharm解释器
打开/创建新项目:启动PyCharm,创建一个新项目(例如名为
)。选择先前配置的Conda环境:
my_first_dl_project
在创建新项目的界面上,展开
选项。选择 “Previously configured interpreter”。点击右侧的
Python Interpreter
按钮,点击
...
->
Add Interpreter
。在左侧选择
Add Local Interpreter...
->
Conda Environment
。在右侧的下拉菜单或路径选择中,找到你之前创建的
Use existing environment
环境下的
pytorch_env
(Windows) 或
python.exe
(macOS/Linux) 文件。
python
通常路径类似:
完成创建:点击OK,然后创建项目。现在,你的PyCharm项目就和你配置好的PyTorch Conda环境关联起来了。你可以在PyCharm的终端中直接使用
C:Users<你的用户名>anaconda3envspytorch_envpython.exe
而不会报错。
import torch
好的,我们已将第四节的代码示例替换为《动手学深度学习》(D2L)中经典的 LeNet 模型在 Fashion-MNIST 数据集上的训练代码。这是一个非常完整且具有教学意义的示例,涵盖了数据加载、模型定义、训练循环和评估测试的整个流程,能让读者真正上手运行一个完整的训练项目。
4. 可运行的代码:LeNet模型训练实战
现在,让我们运行一个完整的深度学习项目来验证环境。这段代码将使用经典的 Fashion-MNIST 数据集(一个比MNIST更具挑战性的衣物分类数据集),训练 LeNet 卷积神经网络(CNN)进行图像分类。它完整展示了数据加载、模型定义、训练、评估和保存模型的全流程。
代码来自于沐神《动手学深度学习》6.6节的LeNet网络
在你的项目目录下创建一个新的Python文件,例如
,然后粘贴以下代码:
train_lenet.py
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
import matplotlib.pyplot as plt
import time
# 1. 设置设备(检测GPU是否可用)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")
# 2. 定义数据预处理和加载数据
# 定义数据预处理流程:转换为Tensor,并做归一化(均值和方差来自Fashion-MNIST数据集)
data_transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=(0.2860,), std=(0.3530,)) # 单通道的均值和标准差
])
# 下载并加载训练数据集和测试数据集
train_dataset = datasets.FashionMNIST(root='./data', train=True, download=True, transform=data_transform)
test_dataset = datasets.FashionMNIST(root='./data', train=False, download=True, transform=data_transform)
# 创建数据加载器 (DataLoader),可以自动分批(shuffle)和批量加载数据
batch_size = 256
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=2)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=2)
# 定义类别名称(Fashion-MNIST的10个类别)
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
# 3. 定义LeNet模型结构
class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
# 卷积层和池化层
self.features = nn.Sequential(
# 输入通道1, 输出通道6, 卷积核5x5
nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(), # 使用Sigmoid激活函数
nn.AvgPool2d(kernel_size=2, stride=2), # 平均池化层
nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
)
# 全连接层(分类器)
self.classifier = nn.Sequential(
nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
nn.Linear(120, 84), nn.Sigmoid(),
nn.Linear(84, 10) # 输出10个类别
)
def forward(self, x):
x = self.features(x) # 提取特征 [batch, 1, 28, 28] -> [batch, 16, 5, 5]
x = torch.flatten(x, 1) # 展平特征图 [batch, 16, 5, 5] -> [batch, 16*5*5]
x = self.classifier(x) # 通过分类器得到最终输出
return x
# 实例化模型并将其移动到GPU(如果可用)
model = LeNet().to(device)
print(model)
# 4. 定义损失函数和优化器
criterion = nn.CrossEntropyLoss() # 交叉熵损失函数,适用于多分类问题
optimizer = torch.optim.SGD(model.parameters(), lr=0.9) # 随机梯度下降优化器,学习率0.9
# 5. 训练模型
num_epochs = 10
train_losses = []
train_accuracies = []
print("开始训练...")
start_time = time.time()
for epoch in range(num_epochs):
model.train() # 设置模型为训练模式
running_loss = 0.0
correct = 0
total = 0
for images, labels in train_loader:
# 将数据移动到设备
images, labels = images.to(device), labels.to(device)
# 清零梯度
optimizer.zero_grad()
# 前向传播
outputs = model(images)
loss = criterion(outputs, labels)
# 反向传播和优化
loss.backward()
optimizer.step()
# 统计损失和准确率
running_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
# 计算每个epoch的平均损失和准确率
epoch_loss = running_loss / len(train_loader)
epoch_acc = 100 * correct / total
train_losses.append(epoch_loss)
train_accuracies.append(epoch_acc)
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {epoch_loss:.4f}, Accuracy: {epoch_acc:.2f}%')
end_time = time.time()
print(f'训练完成!耗时:{end_time - start_time:.2f} 秒')
# 6. 在测试集上评估模型
model.eval() # 设置模型为评估模式
test_correct = 0
test_total = 0
with torch.no_grad(): # 在评估时不计算梯度,节省内存和计算
for images, labels in test_loader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
test_total += labels.size(0)
test_correct += (predicted == labels).sum().item()
print(f'测试集准确率: {100 * test_correct / test_total:.2f}%')
# 7. 保存训练好的模型
torch.save(model.state_dict(), 'fashion_mnist_lenet.pth')
print("模型已保存为 'fashion_mnist_lenet.pth'")
# 8. (可选) 绘制训练过程中的损失和准确率曲线
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(range(1, num_epochs+1), train_losses, 'b-', label='Training Loss')
plt.title('Training Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(range(1, num_epochs+1), train_accuracies, 'r-', label='Training Accuracy')
plt.title('Training Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy (%)')
plt.legend()
plt.tight_layout()
plt.savefig('training_metrics.png')
plt.show()
运行
在PyCharm中,右键点击代码编辑器,选择
。
Run 'train_lenet.py'
运行过程:
程序会自动下载Fashion-MNIST数据集(约35MB)。开始训练过程,可以看到每个epoch的损失(Loss)和训练准确率(Accuracy)在控制台打印出来。训练完成后,会输出模型在测试集上的准确率(通常在80%以上)。最后会绘制出训练过程中的损失和准确率曲线,并保存训练好的模型文件
。
fashion_mnist_lenet.pth
提示:
首次运行会下载数据:请保持网络通畅。训练时间:在CPU上可能需要几分钟,在GPU上会快很多。这是体验GPU加速的好机会!学习修改:你可以尝试调整
、
batch_size
或
num_epochs
(学习率) 等超参数,观察它们对训练过程和结果的影响。
lr
恭喜你,已经实现了一个简单的深度学习项目!!!