使用 PyTorch 手动实现softmax回归

📅 发布时间:2026/7/5 12:26:35 👁️ 浏览次数:
使用 PyTorch 手动实现softmax回归
在深度学习的学习过程中,理解模型的底层运作机制至关重要。本文将通过一个完整的示例,展示如何使用 PyTorch 手动定义模型参数、构建前向传播函数,并训练一个简单的线性分类器(即逻辑回归)来对 FashionMNIST 数据集进行分类。整个过程不依赖nn.Linear或自定义nn.Module类,而是直接操作张量和参数,有助于深入理解神经网络的基本组成。1. 数据加载与预处理首先,我们加载 FashionMNIST 数据集。该数据集包含 60,000 张训练图像和 10,000 张测试图像,每张图像为 28×28 的灰度图,共 10 个类别。importtorchfromtorchimportnnfromtorchvisionimporttransformsfromtorch.utils.dataimportDataLoaderfromtorchvision.datasetsimportFashionMNIST# 数据加载transform=transforms.ToTensor()train_dataset=FashionMNIST(root="../data",train=True,transform=transform,download=True)test_dataset=FashionMNIST(root="../data",train=False,transform=transform,download=True)batch_size=256train_iter=DataLoader(train_dataset,batch_size=batch_size,shuffle=True)test_iter=DataLoader(test_dataset,batch_size=batch_size,shuffle=False)transforms.ToTensor()将图像从 PIL 格式转换为torch.Tensor,并自动将像素值归一化到 [0, 1] 区间。每个样本的形状为(1, 28, 28),其中 1 表示单通道(灰度图)。使用DataLoader批处理数据,训练时打乱顺序,测试时不打乱。2. 定义模型参数FashionMNIST 图像展平后维度为 28 × 28 = 784,输出类别数为 10。我们手动创建权重矩阵W和偏置向量b,并将其注册为可学习参数:# 模型参数num_inputs,num_outputs=784,10W=nn.Parameter(torch.randn(num_inputs,num_outputs)*0.01)b=nn.Parameter(torch.zeros(num_outputs))params=[W,b]W初始化为均值为 0、标准差为 0.01 的正态分布,形状为(784, 10)。b初始化为全零,形状为(10,)。使用nn.Parameter包装,确保这些张量能被优化器识别并更新。3. 构建前向传播函数我们定义一个简单的前向传播函数net,实现线性变换:# 模型定义defnet(X):returnX.reshape(-1,num_inputs)@ W+b输入X的原始形状为(batch_size, 1, 28, 28)。X.reshape(-1, 784)将其展平为(batch_size, 784)。矩阵乘法@ W得到(batch_size, 10)的 logits。加上偏置b(通过广播机制),最终输出形状为(batch_size, 10)。这实际上是一个没有激活函数的单层线性模型,配合交叉熵损失即可完成多分类任务。4. 损失函数与优化器选择交叉熵损失函数和随机梯度下降(SGD)优化器:# 损失函数与优化器loss_fn=nn.CrossEntropyLoss(reduction='none')optimizer=torch.optim.SGD(params