从零实现Softmax回归模型:Gluon教程详解

从零实现Softmax回归模型:Gluon教程详解

【免费下载链接】d2l-zh 【免费下载链接】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函数将原始分数转换为概率分布,实现分为三步:

  1. 对每个元素取指数
  2. 计算每行的和(规范化常数)
  3. 将每行除以其规范化常数
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)))

训练过程

训练过程包括以下步骤:

  1. 前向传播计算预测值
  2. 计算损失
  3. 反向传播计算梯度
  4. 使用优化器更新参数
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])

关键点总结

  1. Softmax回归是多分类问题的基础模型
  2. 实现过程包括:参数初始化、softmax运算、模型定义、损失函数和训练循环
  3. 交叉熵损失函数适合多分类问题
  4. 分类精度是评估模型性能的重要指标
  5. 小批量随机梯度下降是常用的优化方法

常见问题与优化

  1. 数值稳定性问题:直接计算指数可能导致数值溢出,可通过减去最大值来稳定计算
  2. 对数定义域问题:交叉熵损失中的对数计算需避免零值
  3. 优化建议:使用对数softmax技巧可同时解决上述两个问题

通过本教程,读者可以深入理解Softmax回归的实现细节,为后续学习更复杂的神经网络模型打下坚实基础。

【免费下载链接】d2l-zh 【免费下载链接】d2l-zh 项目地址: https://gitcode.com/gh_mirrors/d2l/d2l-zh

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值