Dive-into-DL-PyTorch项目解析:从零实现Softmax回归

Dive-into-DL-PyTorch项目解析:从零实现Softmax回归

Dive-into-DL-PyTorch 本项目将《动手学深度学习》(Dive into Deep Learning)原书中的MXNet实现改为PyTorch实现。 Dive-into-DL-PyTorch 项目地址: https://gitcode.com/gh_mirrors/di/Dive-into-DL-PyTorch

引言

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  # 广播机制

这个实现包含三个关键步骤:

  1. 对每个元素做指数运算
  2. 计算每行的和(保持维度以便广播)
  3. 每个元素除以对应行的和

模型定义

将输入图像展平后通过线性变换和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)

训练过程包括:

  1. 前向传播计算预测值
  2. 计算损失
  3. 反向传播计算梯度
  4. 参数更新
  5. 定期评估模型性能

模型预测与可视化

训练完成后,我们可以对测试图像进行预测并可视化结果:

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])

关键知识点总结

  1. Softmax函数:将原始输出转换为概率分布,是多分类问题的核心组件
  2. 交叉熵损失:衡量预测概率分布与真实分布的差异
  3. 参数初始化:适当的初始化对模型训练至关重要
  4. 训练流程:前向传播、损失计算、反向传播、参数更新的循环
  5. 评估指标:准确率是最直观的分类任务评估指标

通过本教程,读者应该能够理解Softmax回归的完整实现流程,并掌握PyTorch实现的关键技术点。这个简单的模型为理解更复杂的神经网络奠定了基础。

Dive-into-DL-PyTorch 本项目将《动手学深度学习》(Dive into Deep Learning)原书中的MXNet实现改为PyTorch实现。 Dive-into-DL-PyTorch 项目地址: https://gitcode.com/gh_mirrors/di/Dive-into-DL-PyTorch

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咎晓嘉Fenton

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

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

抵扣说明:

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

余额充值