1. 从零构建CNN:MNIST手写数字识别实战
如果你刚接触深度学习,可能会觉得卷积神经网络(CNN)是个神秘的黑箱。但当我第一次用PyTorch实现CNN在MNIST数据集上跑出98%准确率时,才发现它的核心思想其实非常直观。今天我们就用不到100行代码,从零搭建一个能识别手写数字的CNN模型。
先看这个模型的整体结构:输入28x28的灰度图像,经过两个卷积层(分别用5x5卷积核提取特征)和最大池化层(2x2窗口下采样),最后通过全连接层输出0-9的分类结果。整个前向传播过程就像流水线一样清晰:
python复制class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5) # 第一层卷积
self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5) # 第二层卷积
self.pooling = torch.nn.MaxPool2d(2) # 池化层
self.fc = torch.nn.Linear(320, 10) # 全连接层
def forward(self, x):
x = F.relu(self.pooling(self.conv1(x))) # 卷积→池化→激活
x = F.relu(self.pooling(self.conv2(x)))
x = x.view(x.size(0), -1) # 展平
return self.fc(x)
关键细节:MNIST图像是单通道的,所以conv1的输入通道数为1。经过第一层卷积后,我们得到10个特征图(对应conv1的输出通道数),每个特征图都捕捉了不同的局部特征。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据准备与预处理实战技巧
处理图像数据时,合理的预处理能显著提升模型性能。对于MNIST数据集,我们采用以下标准化参数:
python复制transform = transforms.Comp
