Dive-into-DL-PyTorch项目解析:从零实现Softmax回归
引言
Softmax回归是多分类问题中最基础的神经网络模型之一。本文将基于Dive-into-DL-PyTorch项目,详细讲解如何从零开始实现Softmax回归模型。通过本教程,读者不仅能理解Softmax回归的原理,还能掌握PyTorch实现的关键技术细节。
环境准备与数据加载
首先我们需要导入必要的库:
import torch
import torchvision
import numpy as np
这里使用了PyTorch作为深度学习框架,torchvision用于处理计算机视觉相关的数据集和模型,numpy则提供高效的数值计算支持。
我们将使用Fashion-MNIST数据集,这是一个包含10类服装物品的图像数据集,每张图片大小为28×28像素。设置批量大小为256:
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
模型参数初始化
Softmax回归模型的参数包括权重矩阵W和偏置向量b。对于Fashion-MNIST数据集:
- 输入维度:28×28=784(将图像展平为向量)
- 输出维度:10(对应10个类别)
初始化代码如下:
num_inputs = 784
num_outputs = 10
W = torch.tensor(np.random.normal(0, 0.01, (num_inputs, num_outputs)), dtype=torch.float)
b = torch.zeros(num_outputs, dtype=torch.float)
W.requires_grad_(requires_grad=True)
b.requires_grad_(requires_grad=True)
这里使用正态分布初始化权重,均值为0,标准差为0.01;偏置初始化为0。通过requires_grad_()
方法设置需要计算梯度。
Softmax运算实现
Softmax函数将原始输出转换为概率分布:
def softmax(X):
X_exp = X.exp()
partition = X_exp.sum(dim=1, keepdim=True)
return X_exp / partition # 广播机制
这个实现包含三个关键步骤:
- 对每个元素做指数运算
- 计算每行的和(保持维度以便广播)
- 每个元素除以对应行的和
模型定义
将输入图像展平后通过线性变换和softmax运算:
def net(X):
return softmax(torch.mm(X.view((-1, num_inputs)), W) + b)
view(-1, num_inputs)
将输入张量变形为二维矩阵,其中-1表示自动计算该维度大小。
损失函数实现
使用交叉熵损失函数:
def cross_entropy(y_hat, y):
return - torch.log(y_hat.gather(1, y.view(-1, 1)))
gather
函数用于根据真实标签y获取预测概率y_hat中对应类别的概率值。
评估指标:分类准确率
准确率是分类任务中最直观的评估指标:
def accuracy(y_hat, y):
return (y_hat.argmax(dim=1) == y).float().mean().item()
argmax(dim=1)
获取每行最大值的索引,即预测类别,然后与真实类别比较计算准确率。
模型训练
使用小批量随机梯度下降训练模型:
num_epochs, lr = 5, 0.1
def train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size,
params=None, lr=None, optimizer=None):
for epoch in range(num_epochs):
# 训练过程
# ...
# 评估测试集准确率
test_acc = evaluate_accuracy(test_iter, net)
print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f'
% (epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc))
train_ch3(net, train_iter, test_iter, cross_entropy, num_epochs, batch_size, [W, b], lr)
训练过程包括:
- 前向传播计算预测值
- 计算损失
- 反向传播计算梯度
- 参数更新
- 定期评估模型性能
模型预测与可视化
训练完成后,我们可以对测试图像进行预测并可视化结果:
X, y = iter(test_iter).next()
true_labels = d2l.get_fashion_mnist_labels(y.numpy())
pred_labels = d2l.get_fashion_mnist_labels(net(X).argmax(dim=1).numpy())
titles = [true + '\n' + pred for true, pred in zip(true_labels, pred_labels)]
d2l.show_fashion_mnist(X[0:9], titles[0:9])
关键知识点总结
- Softmax函数:将原始输出转换为概率分布,是多分类问题的核心组件
- 交叉熵损失:衡量预测概率分布与真实分布的差异
- 参数初始化:适当的初始化对模型训练至关重要
- 训练流程:前向传播、损失计算、反向传播、参数更新的循环
- 评估指标:准确率是最直观的分类任务评估指标
通过本教程,读者应该能够理解Softmax回归的完整实现流程,并掌握PyTorch实现的关键技术点。这个简单的模型为理解更复杂的神经网络奠定了基础。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考