SOFTMAX回归的简洁实现

《动手学深度学习pytorch》部分学习笔记,仅用作自己复习。

SOFTMAX回归的简洁实现

使⽤Pytorch来实现⼀个softmax回归模型。首先导入所需的包或模块。

import torch
from torch import nn
from torch.nn import init
import numpy as np
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l

获取和读取数据

batch_size = 256 # 设置的批量大小
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size) # 使⽤Fashion-MNIST数据集

定义和初始化模型

num_inputs = 784
num_outputs = 10
# softmax回归的输出层是⼀个全连接层,所以我们⽤一个线性模块就可以了。
class LinearNet(nn.Module):
    def __init__(self, num_inputs, num_outputs):
        # 初始化
        super(LinearNet, self).__init__()
        self.linear = nn.Linear(num_inputs, num_outputs)
    def forward(self, x): # x shape: (batch, 1, 28, 28)
        # 因为前面我们数据返回的每个batch样本 x 的形状为(batch_size, 1, 28, 28)
        # 所以我们要先用 view() 将 x 的形状转换成(batch_size, 784)才送⼊全连接层。
        y = self.linear(x.view(x.shape[0], -1))
        return y
net = LinearNet(num_inputs, num_outputs)

将对 x 的形状转换的这个功能⾃定义一个 FlattenLayer

# 本函数已保存在d2lzh_pytorch包中⽅方便便以后使⽤用
class FlattenLayer(nn.Module):
    def __init__(self):
        super(FlattenLayer, self).__init__()
    def forward(self, x): # x shape: (batch, *, *, ...)
        return x.view(x.shape[0], -1)

这样我们就可以更方便地定义我们的模型:

from collections import OrderedDict
net = nn.Sequential(
        # FlattenLayer(),
        # nn.Linear(num_inputs, num_outputs)
        OrderedDict([('flatten', FlattenLayer()),('linear', nn.Linear(num_inputs, num_outputs))])
)

然后,我们使⽤均值为0、标准差为0.01的正态分布随机初始化模型的权重参数。

init.normal_(net.linear.weight, mean=0, std=0.01)
init.constant_(net.linear.bias, val=0)

SOFTMAX和交叉熵损失函数

分开定义softmax运算和交叉熵损失函数可能会造成数值不稳定。因此,PyTorch提供了一个包括softmax运算和交叉熵损失计算的函数。它的数值稳定性更好。

loss = nn.CrossEntropyLoss() 

定义优化算法

# 使学习率为0.1的⼩批量随机梯度下降作为优化算法。
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)

训练模型

# 使⽤用上⼀一节中定义的训练函数来训练模型。
num_epochs = 5
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs,batch_size, None, None, optimizer)

输出:

epoch 1, loss 0.0031, train acc 0.745, test acc 0.790
epoch 2, loss 0.0022, train acc 0.812, test acc 0.807
epoch 3, loss 0.0021, train acc 0.825, test acc 0.806
epoch 4, loss 0.0020, train acc 0.832, test acc 0.810
epoch 5, loss 0.0019, train acc 0.838, test acc 0.823

⼩结
PyTorch提供的函数往往具有更好的数值稳定性
可以使⽤PyTorch更简洁地实现softmax回归。

猜你喜欢

转载自blog.csdn.net/dujuancao11/article/details/108385783
今日推荐