Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【动手学深度学习笔记】之PyTorch实现softmax回归

【动手学深度学习笔记】之PyTorch实现softmax回归

作者头像
树枝990
发布于 2020-08-19 23:52:03
发布于 2020-08-19 23:52:03
1.8K00
代码可运行
举报
文章被收录于专栏:拇指笔记拇指笔记
运行总次数:0
代码可运行

1. 使用pytorch实现softmax回归模型

使用pytorch可以更加便利的实现softmax回归模型。

1.1 获取和读取数据

读取小批量数据的方法:

  1. 首先是获取数据,pytorch可以通过以下代码很方便的获取Fashion-MNIST数据集。 mnist_train = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST',train=True,download=True,transform=transforms.ToTensor()) mnist_test = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST',train=False,download=True,transform=transforms.ToTensor()) #参数 #root : processed/training.pt 和 processed/test.pt 的主目录 #train : True = 训练集, False = 测试集 #download : True = 从互联网上下载数据集,并把数据集放在root目录下. 如果数据集之前下载过,将处理过的数据(minist.py中有相关函数)放在processed文件夹下 #transform = transforms.ToTensor():使所有数据转换为Tensor
  2. 然后是生成一个迭代器,用来读取数据 #生成迭代器 train_iter = torch.utils.data.DataLoader(mnist_train,batch_size=batch_size,shuffle = True,num_workers = 0) test_iter = torch.utils.data.DataLoader(mnist_test,batch_size = batch_size,shuffle=False,num_workers=0) #参数 #dataset:Dataset类型,从其中加载数据 #batch_size:int类型,每个批量加载多少个数 #shuffle:bool类型,每个学习周期都打乱顺序 #num_workers:int类型,加载数据时使用多少子进程。默认值为0. #collate_fn:定义如何取样本,可通过定义自己的函数来实现。 #pin_memory:锁页内存处理。 #drop_last:bool类型,如果有剩余的样本,True表示丢弃;Flase表示不丢弃

1.2 定义和初始化模型

由softmax回归模型的定义可知,softmax回归模型只有权重参数和偏差参数。因此可以使用神经网络子模块中的线性模块。

  1. 首先定义网络,softmax回归是一个两层的网络,所以只需要定义输入层和输出层即可。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
num_inputs = 784
num_outputs = 10

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):
        y = self.linear(x.view(x.shape[0],-1))
        #将x换形为y后,再继续向前传播
        return y
    
net = LinearNet(num_inputs,num_outputs)
  1. 初始化参数

使用torch.nn中的init可以快速的初始化参数。我们令权重参数为均值为0,标准差为0.01的正态分布。偏差为0。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
init.normal_(net.linear.weight, mean=0, std=0.01)
init.constant_(net.linear.bias, val=0)

1.3 softmax运算和交叉熵损失函数

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
loss = nn.CrossEntropyLoss()

1.4 定义优化算法

依然使用小批量随机梯度下降作为优化算法。定义学习率为0.1。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
optimizer = torch.optim.SGD(net.parameters(),lr=0.01)

1.5 计算分类准确率

计算准确率的原理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
我们把预测概率最大的类别作为输出类别,如果它与真实类别y一致,说明预测正确。分类准确率就是正确预测数量与总预测数量之比

首先我们需要得到预测的结果。

从一组预测概率(变量y_hat)中找出最大的概率对应的索引(索引即代表了类别)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#argmax(f(x))函数,对f(x)求最大值所对应的点x。我们令f(x)= dim=1,即可实现求所有行上的最大值对应的索引。
A = y_hat.argmax(dim=1)	
#最终输出结果为一个行数与y_hat相同的列向量

然后我们需要将得到的最大概率对应的类别与真实类别(y)比较,判断预测是否是正确的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
B = (y_hat.argmax(dim=1)==y).float()
#由于y_hat.argmax(dim=1)==y得到的是ByteTensor型数据,所以我们通过.float()将其转换为浮点型Tensor()

最后我们需要计算分类准确率

我们知道y_hat的行数就对应着样本总数,所以,对B求平均值得到的就是分类准确率

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(y_hat.argmax(dim=1)==y).float().mean()

上一步最终得到的数据为tensor(x)的形式,为了得到最终的pytorch number,需要对其进行下一步操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(y_hat.argmax(dim=1)==y).float().mean().item()
#pytorch number的获取统一通过.item()实现

整理一下,得到计算分类准确率函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def accuracy(y_hat,y):
    return (y_hat.argmax(dim=1).float().mean().item())

作为推广,该函数还可以评价模型net在数据集data_iter上的准确率。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def net_accurary(data_iter,net):
    right_sum,n = 0.0,0
    for X,y in data_iter:
    #从迭代器data_iter中获取X和y
        right_sum += (net(X).argmax(dim=1)==y).float().sum().item()
        #计算准确判断的数量
        n +=y.shape[0]
        #通过shape[0]获取y的零维度(列)的元素数量
    return right_sum/n

1.6 训练模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
num_epochs = 5
#一共进行五个学习周期

def train_softmax(net,train_iter,test_iter,loss,num_epochs,batch_size,optimizer,net_accurary):
    for epoch in range(num_epochs):
        #损失值、正确数量、总数 初始化。
        train_l_sum,train_right_sum,n= 0.0,0.0,0
        
        for X,y in train_iter:
            y_hat = net(X)
            l = loss(y_hat,y).sum()
            #数据集损失函数的值=每个样本的损失函数值的和。
            optimizer.zero_grad()			#对优化函数梯度清零
            l.backward()	#对损失函数求梯度
            optimizer(params,lr,batch_size)
            
            train_l_sum += l.item()
            train_right_sum += (y_hat.argmax(dim=1) == y).sum().item()
            n += y.shape[0]
            
        test_acc = net_accurary(test_iter, net)	#测试集的准确率
        print('epoch %d, loss %.4f, train right %.3f, test acc %.3f' % (epoch + 1, train_l_sum / n, train_right_sum / n, test_acc))
        
train_softmax(net,train_iter,test_iter,cross_entropy,num_epochs,batch_size,optimizernet_accurary,net_accurary)

训练属实是有点慢,只训练了五个周期。训练结果:

1.7 预测

使用训练好的模型对测试集进行预测

做一个模型的最终目的当然不是训练了,所以来预测一下试试。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#将样本的类别数字转换成文本
def get_Fashion_MNIST_labels(labels):
    text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat',
                   'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
    return [text_labels[int(i)] for i in labels]
    #labels是一个列表,所以有了for循环获取这个列表对应的文本列表

#显示图像
def show_fashion_mnist(images,labels):
    display.set_matplotlib_formats('svg')
    #绘制矢量图
    _,figs = plt.subplots(1,len(images),figsize=(12,12))
    #设置添加子图的数量、大小
    for f,img,lbl in zip(figs,images,labels):
        f.imshow(img.view(28,28).numpy())
        f.set_title(lbl)
        f.axes.get_xaxis().set_visible(False)
        f.axes.get_yaxis().set_visible(False)
    plt.show()

#从测试集中获得样本和标签
X, y = iter(test_iter).next()

true_labels = get_Fashion_MNIST_labels(y.numpy())
pred_labels = get_Fashion_MNIST_labels(net(X).argmax(dim=1).numpy())

#将真实标签和预测得到的标签加入到图像上
titles = [true + '\n' + pred for true, pred in zip(true_labels, pred_labels)]

show_fashion_mnist(X[0:9], titles[0:9])

预测结果:

完整程序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
from torch import nn
from torch.nn import init
import numpy as np
import sys
sys.path.append("..")

import torchvision
from IPython import display
from numpy import argmax
import torchvision.transforms as transforms
from time import time
import matplotlib.pyplot as plt
import numpy as np

batch_size =256

mnist_train = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST',train=True,download=True,transform=transforms.ToTensor())

mnist_test = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST',train=False,download=True,transform=transforms.ToTensor())

#生成迭代器
train_iter = torch.utils.data.DataLoader(mnist_train,batch_size=batch_size,shuffle = True,num_workers = 4)

test_iter = torch.utils.data.DataLoader(mnist_test,batch_size = batch_size,shuffle=False,num_workers=4)

num_inputs = 784
num_outputs = 10

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):
        y = self.linear(x.view(x.shape[0],-1))
        #将x换形为y后,再继续向前传播
        return y
    
net = LinearNet(num_inputs,num_outputs)

#初始化参数
init.normal_(net.linear.weight, mean=0, std=0.01)
init.constant_(net.linear.bias, val=0)

#损失函数
loss = nn.CrossEntropyLoss()

#优化函数
optimizer = torch.optim.SGD(net.parameters(),lr=0.01)

num_epochs = 5
#一共进行五个学习周期

#计算准确率
def net_accurary(data_iter,net):
    right_sum,n = 0.0,0
    for X,y in data_iter:
    #从迭代器data_iter中获取X和y
        right_sum += (net(X).argmax(dim=1)==y).float().sum().item()
        #计算准确判断的数量
        n +=y.shape[0]
        #通过shape[0]获取y的零维度(列)的元素数量
    return right_sum/n

def get_Fashion_MNIST_labels(labels):
    text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat',
                   'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
    return [text_labels[int(i)] for i in labels]
    #labels是一个列表,所以有了for循环获取这个列表对应的文本列表

def show_fashion_mnist(images,labels):
    display.set_matplotlib_formats('svg')
    #绘制矢量图
    _,figs = plt.subplots(1,len(images),figsize=(12,12))
    #设置添加子图的数量、大小
    for f,img,lbl in zip(figs,images,labels):
        f.imshow(img.view(28,28).numpy())
        f.set_title(lbl)
        f.axes.get_xaxis().set_visible(False)
        f.axes.get_yaxis().set_visible(False)
    plt.show()


def train_softmax(net,train_iter,test_iter,loss,num_epochs,batch_size,optimizer,net_accurary):
    for epoch in range(num_epochs):
        #损失值、正确数量、总数 初始化。
        train_l_sum,train_right_sum,n= 0.0,0.0,0
        
        for X,y in train_iter:
            y_hat = net(X)
            l = loss(y_hat,y).sum()
            #数据集损失函数的值=每个样本的损失函数值的和。
            optimizer.zero_grad()			#对优化函数梯度清零
            l.backward()	#对损失函数求梯度
            optimizer.step()
            
            train_l_sum += l.item()
            train_right_sum += (y_hat.argmax(dim=1) == y).sum().item()
            n += y.shape[0]
            
        test_acc = net_accurary(test_iter, net)	#测试集的准确率
        print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f' % (epoch + 1, train_l_sum / n, train_right_sum / n, test_acc))
        
train_softmax(net,train_iter,test_iter,loss,num_epochs,batch_size,optimizer,net_accurary)

X, y = iter(test_iter).next()

true_labels = get_Fashion_MNIST_labels(y.numpy())
pred_labels = get_Fashion_MNIST_labels(net(X).argmax(dim=1).numpy())
titles = [true + '\n' + pred for true, pred in zip(true_labels, pred_labels)]

show_fashion_mnist(X[0:9], titles[0:9])
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拇指笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从零开始学Pytorch(四)softmax及其实现
softmax运算符(softmax operator)解决了以上两个问题。它通过下式将输出值变换成值为正且和为1的概率分布:
墨明棋妙27
2022/09/23
1.3K0
【动手学深度学习笔记】之实现softmax回归模型
设置小批量数目为256。这一部分与之前的线性回归的读取数据大同小异,都是转换类型-->生成迭代器。
树枝990
2020/08/20
8750
从0到1,实现你的第一个多层神经网络
多层感知机在单层神经网络的基础上引入了一到多个隐藏层(hidden layer)。如图所示的隐藏层一共有5个隐藏单元。由于输入层不涉及计算,因此这个多层感知机的层数为2。如图所示的多层感知机中的隐藏层和输出层都是全连接层。
树枝990
2020/08/19
7900
线性神经网络——softmax 回归随笔【深度学习】【PyTorch】【d2l】
softmax 函数是一种常用的激活函数,用于将实数向量转换为概率分布向量。它在多类别分类问题中起到重要的作用,并与交叉熵损失函数结合使用。
来杯Sherry
2023/07/24
4640
线性神经网络——softmax 回归随笔【深度学习】【PyTorch】【d2l】
【动手学深度学习笔记】之PyTorch实现多层感知机
上一步最终得到的数据为tensor(x)的形式,为了得到最终的pytorch number,需要对其进行下一步操作
树枝990
2020/08/20
7840
【动手学深度学习】多层感知机之暂退法问题研究详情
如果更改第一层和第二层的暂退法概率,会发生什么情况?具体地说,如果交换这两个层,会发生什么情况?设计一个实验来回答这些问题,定量描述该结果,并总结定性的结论
SarPro
2024/06/06
1640
【动手学深度学习】多层感知机之暂退法问题研究详情
从零开始学Pytorch(三)之多层感知机的实现
我们将以多层感知机(multilayer perceptron,MLP)为例,介绍多层神经网络的概念。
墨明棋妙27
2022/08/24
1.2K0
从零开始学Pytorch(三)之多层感知机的实现
【深度学习基础】线性神经网络 | softmax回归的从零开始实现
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/01/22
1150
【深度学习基础】线性神经网络 | softmax回归的从零开始实现
【动手学深度学习笔记】之多层感知机实现
Fashion-MNIST数据集中的图像为28*28像素,也就是由784个特征值。Fashion-MNIST数据集一共有十个类别。因此模型需要784个输入,10个输出。假设隐藏单元为256(超参数,可调节)。
树枝990
2020/08/19
6430
pytorch学习笔记(十):MLP[通俗易懂]
多层感知机(multilayer perceptron, MLP) 在单层神经网络的基础上引入了一到多个隐藏层(hidden layer)。隐藏层位于输入层和输出层之间。图3.3展示了一个多层感知机的神经网络图,它含有一个隐藏层,该层中有5个隐藏单元。
全栈程序员站长
2022/07/04
1.6K0
pytorch学习笔记(十):MLP[通俗易懂]
【动手学深度学习笔记】之通过丢弃法缓解过拟合问题
除了上一篇文章介绍的权重衰减法,深度学习常用的缓解过拟合问题的方法还有丢弃法。本文介绍倒置丢弃法及其实现。
树枝990
2020/08/19
1K0
动手学深度学习(二) Softmax与分类模型
softmax运算符(softmax operator)解决了以上两个问题。它通过下式将输出值变换成值为正且和为1的概率分布:
致Great
2020/02/24
8480
动手学深度学习(三) 多层感知机
深度学习主要关注多层模型。在这里,我们将以多层感知机(multilayer perceptron,MLP)为例,介绍多层神经网络的概念。
致Great
2020/02/24
1.1K0
[MXNet逐梦之旅]练习四·使用MXNetFashionMNIST数据集分类简洁实现
[MXNet逐梦之旅]练习四·使用MXNetFashionMNIST数据集分类简洁实现 code #%% import sys import time from mxnet import gluon as gl import mxnet as mx from matplotlib import pyplot as plt from mxnet import autograd, nd import numpy as np mnist_train = gl.data.vision.FashionMNIST(r
小宋是呢
2019/06/27
6050
卷积神经网络——中篇【深度学习】【PyTorch】
全连接层是网络里参数比重最高的地方(参数=输入通道*高*宽*输出通道*高*宽),尤其是卷积后的第一个全连接层。而卷积层参数就小得多。所以用卷积层替代全连接层,参数会更少。
来杯Sherry
2023/08/24
3180
卷积神经网络——中篇【深度学习】【PyTorch】
[MXNet逐梦之旅]练习三·使用MXNetFashionMNIST数据集分类手动实现
[MXNet逐梦之旅]练习三·使用MXNetFashionMNIST数据集分类手动实现 code #%% import sys import time from mxnet import gluon as gl import mxnet as mx from matplotlib import pyplot as plt from mxnet import autograd, nd import numpy as np mnist_train = gl.data.vision.FashionMNIST(r
小宋是呢
2019/06/27
4240
【动手学深度学习笔记】之图像分类数据集(Fashion-MNIST)
这个数据集是我们在后面学习中将会用到的图形分类数据集。它的图像内容相较于手写数字识别数据集MINIST更为复杂一些,更加便于我们直观的观察算法之间的差异。
树枝990
2020/08/20
3.9K0
【动手学深度学习笔记】之图像分类数据集(Fashion-MNIST)
从零开始学Pytorch(十九)之Kaggle上的狗品种识别
在本节中,我们将解决Kaggle竞赛中的犬种识别挑战,比赛的网址是https://www.kaggle.com/c/dog-breed-identification 在这项比赛中,我们尝试确定120种不同的狗。该比赛中使用的数据集实际上是著名的ImageNet数据集的子集。
墨明棋妙27
2022/09/23
4050
【动手学深度学习】多层感知机之暂退法研究详情
启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:
SarPro
2024/06/14
1420
【动手学深度学习】多层感知机之暂退法研究详情
【动手学深度学习】softmax回归的简洁实现详情
启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:
SarPro
2024/06/06
2520
【动手学深度学习】softmax回归的简洁实现详情
推荐阅读
相关推荐
从零开始学Pytorch(四)softmax及其实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验