1. 深度学习入门:从零开始的第一天
作为一名计算机专业考研学生,我决定系统性地学习深度学习技术。这个系列将记录我的学习历程,希望能帮助到同样想入门深度学习的同学。第一天,我们先从最基础的概念和环境搭建开始。
深度学习是机器学习的一个分支,它通过模拟人脑神经网络的工作方式,让计算机能够从数据中自动学习特征和模式。与传统机器学习相比,深度学习最大的特点是能够自动提取数据的多层次特征,而不需要人工设计特征。
2. 环境准备与工具安装
2.1 Python环境配置
深度学习项目通常使用Python作为主要编程语言。我选择了Anaconda作为Python环境管理器,因为它能很好地解决不同项目间的依赖冲突问题。
安装步骤:
- 从Anaconda官网下载适合自己操作系统的安装包
- 按照向导完成安装(注意勾选"Add Anaconda to PATH"选项)
- 安装完成后,在命令行输入
conda --version验证安装是否成功
提示:建议安装Python 3.8或3.9版本,这是目前大多数深度学习框架最稳定的支持版本
2.2 深度学习框架选择
目前主流的深度学习框架有TensorFlow、PyTorch等。经过比较,我选择了PyTorch作为入门框架,因为它有更直观的API设计和活跃的社区支持。
安装PyTorch:
bash复制conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch
如果你的显卡支持CUDA,可以安装GPU版本以获得更快的训练速度。可以通过nvidia-smi命令查看显卡信息。
3. 第一个神经网络程序
3.1 MNIST手写数字识别
作为深度学习的"Hello World",我们从经典的MNIST手写数字识别开始。这个数据集包含6万张28x28像素的手写数字图片。
首先导入必要的库:
python复制import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
3.2 数据加载与预处理
PyTorch提供了方便的数据加载工具:
python复制# 下载并加载训练集和测试集
train_data = torchvision.datasets.MNIST(
root="data",
train=True,
download=True,
transform=torchvision.transforms.ToTensor()
)
test_data = torchvision.datasets.MNIST(
root="data",
train=False,
download=True,
transform=torchvision.transforms.ToTensor()
)
# 创建数据加载器
batch_size = 64
train_loader = DataLoader(train_data, batch_size=batch_size)
test_loader = DataLoader(test_data, batch_size=batch_size)
3.3 构建神经网络模型
我们构建一个简单的全连接神经网络:
python复制class NeuralNetwork(nn.Module):
def __init__(self):
super().__init__()
self.flatten = nn.Flatten()
self.linear_relu_stack = nn.Sequential(
nn.Linear(28*28, 512),
nn.ReLU(),
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, 10)
)
def forward(self, x):
x = self.flatten(x)
logits = self.linear_relu_stack(x)
return logits
model = NeuralNetwork()
这个网络结构包含:
- 一个Flatten层,将28x28的图片展平为784维向量
- 两个隐藏层,每层512个神经元,使用ReLU激活函数
- 一个输出层,10个神经元对应0-9十个数字类别
4. 模型训练与评估
4.1 定义损失函数和优化器
python复制learning_rate = 1e-3
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
4.2 训练循环
python复制def train(dataloader, model, loss_fn, optimizer):
size = len(dataloader.dataset)
model.train()
for batch, (X, y) in enumerate(dataloader):
# 前向传播
pred = model(X)
loss = loss_fn(pred, y)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
if batch % 100 == 0:
loss, current = loss.item(), batch * len(X)
print(f"loss: {loss:>7f} [{current:>5d}/{size:>5d}]")
4.3 测试循环
python复制def test(dataloader, model, loss_fn):
size = len(dataloader.dataset)
num_batches = len(dataloader)
model.eval()
test_loss, correct = 0, 0
with torch.no_grad():
for X, y in dataloader:
pred = model(X)
test_loss += loss_fn(pred, y).item()
correct += (pred.argmax(1) == y).type(torch.float).sum().item()
test_loss /= num_batches
correct /= size
print(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")
4.4 开始训练
python复制epochs = 5
for t in range(epochs):
print(f"Epoch {t+1}\n-------------------------------")
train(train_loader, model, loss_fn, optimizer)
test(test_loader, model, loss_fn)
print("Done!")
经过5个epoch的训练,这个简单模型在测试集上的准确率能达到约98%,对于第一天学习来说是个不错的开始。
5. 常见问题与解决方案
5.1 CUDA相关错误
如果遇到CUDA相关的错误,可以尝试以下步骤:
- 确认显卡支持CUDA
- 检查安装的PyTorch版本是否与CUDA版本匹配
- 可以通过
torch.cuda.is_available()检查CUDA是否可用
5.2 内存不足问题
在训练较大模型时可能会遇到内存不足的问题,解决方法包括:
- 减小batch size
- 使用更简单的模型结构
- 尝试混合精度训练
5.3 过拟合问题
当模型在训练集上表现很好但在测试集上表现不佳时,可能是过拟合了。可以尝试:
- 增加数据量(数据增强)
- 添加Dropout层
- 使用L2正则化
- 提前停止训练
6. 学习资源推荐
6.1 在线课程
- 吴恩达《深度学习》专项课程(Coursera)
- Fast.ai《Practical Deep Learning for Coders》
- PyTorch官方教程
6.2 书籍推荐
- 《深度学习入门:基于Python的理论与实现》
- 《动手学深度学习》(PyTorch版)
- 《Deep Learning with PyTorch》
6.3 实践建议
- 从简单的项目开始,逐步增加复杂度
- 多阅读优秀的开源代码
- 参与Kaggle竞赛或开源项目
- 保持写技术博客的习惯,记录学习过程
7. 第二天学习计划
在掌握了基础概念和简单模型后,我计划第二天学习:
- 卷积神经网络(CNN)的原理与实现
- 使用CNN改进MNIST识别准确率
- 学习常用的图像数据增强方法
- 了解模型保存与加载的方法
深度学习是一个需要长期积累的领域,我会保持每天学习并记录的习惯。如果你也对深度学习感兴趣,欢迎一起交流学习心得。
