从零实现Softmax回归模型:Gluon教程详解
【免费下载链接】d2l-zh 项目地址: https://gitcode.com/gh_mirrors/d2l/d2l-zh
引言
Softmax回归是深度学习中用于多分类问题的基础模型。本文将基于Gluon教程,详细讲解如何从零开始实现Softmax回归模型,包括模型构建、训练过程和评估方法。
数据准备
我们使用Fashion-MNIST数据集,这是一个包含10类服装图像的分类数据集。每张图像大小为28×28像素,我们将它们展平为784维的向量作为输入。
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
模型参数初始化
Softmax回归模型需要初始化权重和偏置参数:
- 权重矩阵W:形状为784×10(输入维度×类别数)
- 偏置向量b:形状为10(类别数)
num_inputs = 784
num_outputs = 10
W = np.random.normal(0, 0.01, (num_inputs, num_outputs))
b = np.zeros(num_outputs)
W.attach_grad()
b.attach_grad()
Softmax运算实现
Softmax函数将原始分数转换为概率分布,实现分为三步:
- 对每个元素取指数
- 计算每行的和(规范化常数)
- 将每行除以其规范化常数
def softmax(X):
X_exp = d2l.exp(X)
partition = d2l.reduce_sum(X_exp, 1, keepdims=True)
return X_exp / partition # 广播机制
模型定义
将输入图像展平后,通过矩阵乘法和加法运算,再应用softmax函数:
def net(X):
return softmax(d2l.matmul(d2l.reshape(X, (-1, W.shape[0])), W) + b)
损失函数:交叉熵
交叉熵损失是多分类问题的常用损失函数,计算真实标签对应预测概率的负对数:
def cross_entropy(y_hat, y):
return - d2l.log(y_hat[range(len(y_hat)), y])
评估指标:分类精度
分类精度是正确预测数与总预测数的比值:
def accuracy(y_hat, y):
"""计算预测正确的数量"""
if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:
y_hat = d2l.argmax(y_hat, axis=1)
cmp = d2l.astype(y_hat, y.dtype) == y
return float(d2l.reduce_sum(d2l.astype(cmp, y.dtype)))
训练过程
训练过程包括以下步骤:
- 前向传播计算预测值
- 计算损失
- 反向传播计算梯度
- 使用优化器更新参数
def train_epoch_ch3(net, train_iter, loss, updater):
metric = Accumulator(3) # 训练损失总和、训练准确度总和、样本数
for X, y in train_iter:
# 计算梯度并更新参数
with autograd.record():
y_hat = net(X)
l = loss(y_hat, y)
l.backward()
updater(X.shape[0])
metric.add(float(l.sum()), accuracy(y_hat, y), y.size)
return metric[0] / metric[2], metric[1] / metric[2]
完整训练循环
使用小批量随机梯度下降优化器,设置学习率为0.1,训练10个epoch:
lr = 0.1
def updater(batch_size):
return d2l.sgd([W, b], lr, batch_size)
num_epochs = 10
train_ch3(net, train_iter, test_iter, cross_entropy, num_epochs, updater)
模型预测
训练完成后,我们可以用模型对新图像进行分类预测:
def predict_ch3(net, test_iter, n=6):
for X, y in test_iter:
break
trues = d2l.get_fashion_mnist_labels(y)
preds = d2l.get_fashion_mnist_labels(d2l.argmax(net(X), axis=1))
titles = [true +'\n' + pred for true, pred in zip(trues, preds)]
d2l.show_images(d2l.reshape(X[0:n], (n, 28, 28)), 1, n, titles=titles[0:n])
关键点总结
- Softmax回归是多分类问题的基础模型
- 实现过程包括:参数初始化、softmax运算、模型定义、损失函数和训练循环
- 交叉熵损失函数适合多分类问题
- 分类精度是评估模型性能的重要指标
- 小批量随机梯度下降是常用的优化方法
常见问题与优化
- 数值稳定性问题:直接计算指数可能导致数值溢出,可通过减去最大值来稳定计算
- 对数定义域问题:交叉熵损失中的对数计算需避免零值
- 优化建议:使用对数softmax技巧可同时解决上述两个问题
通过本教程,读者可以深入理解Softmax回归的实现细节,为后续学习更复杂的神经网络模型打下坚实基础。
【免费下载链接】d2l-zh 项目地址: https://gitcode.com/gh_mirrors/d2l/d2l-zh
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



