【从零开始学习深度学习】8.Pytorch实现softmax回归模型训练
创始人
2024-03-19 07:05:29
0

上一篇文章我们自己手动实现了softmax回归模型,本文我们将直接使用Pytorch提供的模型实现softmax模型,这种方式更加简便快捷。

目录

  • 1. Pytorch实现softmax回归模型
    • 1.1 获取和读取数据
    • 1.2 定义和初始化模型
    • 1.3 softmax和交叉熵损失函数
    • 1.4 定义优化算法
    • 1.5 训练模型
    • 1.6 完整代码

1. Pytorch实现softmax回归模型

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

import torch
from torch import nn
from torch.nn import init
import numpy as np
import sys
import d2lzh_pytorch as d2l

1.1 获取和读取数据

我们仍然使用Fashion-MNIST数据集和上一篇文章中设置的批量大小。

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

1.2 定义和初始化模型

因为softmax回归的输出层是一个全连接层,所以我们用一个线性模块就可以了。因为前面我们数据返回的每个batch样本x的形状为(batch_size, 1, 28, 28), 所以我们要先用view()x的形状转换成(batch_size, 784)才送入全连接层。

num_inputs = 784
num_outputs = 10class 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)y = self.linear(x.view(x.shape[0], -1))return ynet = LinearNet(num_inputs, num_outputs)

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

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 OrderedDictnet = 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) 

1.3 softmax和交叉熵损失函数

PyTorch提供了一个包括softmax运算和交叉熵损失计算的函数CrossEntropyLoss。

loss = nn.CrossEntropyLoss()

1.4 定义优化算法

我们使用学习率为0.1的小批量随机梯度下降作为优化算法。

optimizer = torch.optim.SGD(net.parameters(), lr=0.1)

1.5 训练模型

接下来,我们使用上一节中定义的训练函数来训练模型。

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

1.6 完整代码

import torch
from torch import nn
from torch.nn import init
import numpy as np
import sys
import d2lzh_pytorch as d2lbatch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)num_inputs = 784
num_outputs = 10class 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)y = self.linear(x.view(x.shape[0], -1))return y# 将图片进行展开
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 OrderedDictnet = nn.Sequential(# FlattenLayer(),# nn.Linear(num_inputs, num_outputs)OrderedDict([('flatten', FlattenLayer()),('linear', nn.Linear(num_inputs, num_outputs))])
)# 初始化模型
init.normal_(net.linear.weight, mean=0, std=0.01)
init.constant_(net.linear.bias, val=0) # 损失函数
loss = nn.CrossEntropyLoss()# 使用学习率为0.1的小批量随机梯度下降作为优化算法
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)num_epochs = 5d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)

如果内容对你有帮助,感谢点赞+关注哦!

关注下方GZH,可获取更多干货内容~欢迎共同学习交流

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...