• 【深度学习实验】前馈神经网络(八):模型评价(自定义支持分批进行评价的Accuracy类)


    目录

    一、实验介绍

     二、实验环境

    1. 配置虚拟环境

    2. 库版本介绍

    三、实验内容

     0. 导入必要的工具包

    1. __init__(构造函数)

    2. update函数(更新评价指标)

    5. accumulate(计算准确率)

    4. reset(重置评价指标)

    5. 构造数据进行测试

    6. 代码整合


     

     

     

     

    一、实验介绍

           本文将实现一个辅助功能——计算预测的准确率。Accuracy支持对每一个回合中每批数据进行评价,并将结果累积,最终获得整批数据的评价结果。

    • 在训练或验证过程中迭代地调用update方法来更新评价指标;
    • 使用accumulate方法获取累计的准确率;
    • 通过reset方法重置评价指标,以便进行下一轮的计算。

     

     二、实验环境

        本系列实验使用了PyTorch深度学习框架,相关操作如下:

    1. 配置虚拟环境

    conda create -n DL python=3.7 
    conda activate DL
    pip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
    
    conda install matplotlib
     conda install scikit-learn

    2. 库版本介绍

    软件包本实验版本目前最新版
    matplotlib3.5.33.8.0
    numpy1.21.61.26.0
    python3.7.16 
    scikit-learn0.22.11.3.0
    torch1.8.1+cu1022.0.1
    torchaudio0.8.12.0.2
    torchvision0.9.1+cu1020.15.2

     

    三、实验内容

    ChatGPT:

            前馈神经网络(Feedforward Neural Network)是一种常见的人工神经网络模型,也被称为多层感知器(Multilayer Perceptron,MLP)。它是一种基于前向传播的模型,主要用于解决分类和回归问题。

            前馈神经网络由多个层组成,包括输入层、隐藏层和输出层。它的名称"前馈"源于信号在网络中只能向前流动,即从输入层经过隐藏层最终到达输出层,没有反馈连接。

    以下是前馈神经网络的一般工作原理:

    1. 输入层:接收原始数据或特征向量作为网络的输入,每个输入被表示为网络的一个神经元。每个神经元将输入加权并通过激活函数进行转换,产生一个输出信号。

    2. 隐藏层:前馈神经网络可以包含一个或多个隐藏层,每个隐藏层由多个神经元组成。隐藏层的神经元接收来自上一层的输入,并将加权和经过激活函数转换后的信号传递给下一层。

    3. 输出层:最后一个隐藏层的输出被传递到输出层,输出层通常由一个或多个神经元组成。输出层的神经元根据要解决的问题类型(分类或回归)使用适当的激活函数(如Sigmoid、Softmax等)将最终结果输出。

    4. 前向传播:信号从输入层通过隐藏层传递到输出层的过程称为前向传播。在前向传播过程中,每个神经元将前一层的输出乘以相应的权重,并将结果传递给下一层。这样的计算通过网络中的每一层逐层进行,直到产生最终的输出。

    5. 损失函数和训练:前馈神经网络的训练过程通常涉及定义一个损失函数,用于衡量模型预测输出与真实标签之间的差异。常见的损失函数包括均方误差(Mean Squared Error)和交叉熵(Cross-Entropy)。通过使用反向传播算法(Backpropagation)和优化算法(如梯度下降),网络根据损失函数的梯度进行参数调整,以最小化损失函数的值。

            前馈神经网络的优点包括能够处理复杂的非线性关系,适用于各种问题类型,并且能够通过训练来自动学习特征表示。然而,它也存在一些挑战,如容易过拟合、对大规模数据和高维数据的处理较困难等。为了应对这些挑战,一些改进的网络结构和训练技术被提出,如卷积神经网络(Convolutional Neural Networks)和循环神经网络(Recurrent Neural Networks)等。

    本系列为实验内容,对理论知识不进行详细阐释

    (咳咳,其实是没时间整理,待有缘之时,回来填坑)

    977468b5ae9843c6a88005e792817cb1.png​​

     

     0. 导入必要的工具包

    1. import torch
    2. from sklearn.datasets import load_iris
    3. from torch.utils.data import Dataset, DataLoader
    • DatasetDataLoader类用于处理数据集和数据加载

     

    这段代码定义了一个名为Accuracy的类,用于支持分批进行模型评价,特别是在分类任务中计算准确率。

    1. __init__(构造函数)

    1. class Accuracy:
    2. def __init__(self, is_logist=True):
    3. self.num_correct = 0
    4. self.num_count = 0
    5. self.is_logist = is_logist
    • 构造函数在创建Accuracy对象时被调用。它接受一个可选的参数is_logist,默认为True,用于指示是否为logist形式的预测值。
    • self.num_correct用于记录正确预测的样本个数。
    • self.num_count用于记录总样本个数。
    • self.is_logist指示是否为logist形式的预测值。

     

    2. update函数(更新评价指标)

     

    1. def update(self, outputs, labels):
    2. if outputs.shape[1] == 1:
    3. outputs = outputs.squeeze(-1)
    4. if self.is_logist:
    5. preds = (outputs >= 0).long()
    6. else:
    7. preds = (outputs >= 0.5).long()
    8. else:
    9. preds = torch.argmax(outputs, dim=1).long()
    10. labels = labels.squeeze(-1)
    11. batch_correct = (preds==labels).float().sum()
    12. batch_count = len(labels)
    13. self.num_correct += batch_correct
    14. self.num_count += batch_count
    • update方法用于更新评价指标。它接受两个参数outputslabels,分别表示模型的预测输出和真实标签。
    • 根据outputs的形状判断任务类型。
      •  如果outputs是二维张量且第二维大小为1,那么表示是二分类任务。
        •   如果is_logist=True,则将outputs通过阈值(0)转换为预测值preds,并将其转换为整数类型。
        •   如果is_logist=False,则将outputs通过阈值(0.5)转换为预测值preds,并将其转换为整数类型。
      •  如果outputs是二维张量且第二维大小大于1,表示是多分类任务。此时,将outputs中概率最大的类别作为预测值preds
    • labels去除多余的维度,并计算本批数据中预测正确的样本个数batch_correct
    • 获取本批数据的样本个数batch_count
    • 更新num_correctnum_count,累积计算正确样本个数和总样本个数。

    5. accumulate(计算准确率)

    1. def accumulate(self):
    2. if self.num_count == 0:
    3. return 0
    4. return self.num_correct / self.num_count
    • accumulate方法用于计算准确率。
      •  如果num_count为0,表示没有进行过更新,返回0。
      • 否则,返回正确样本个数除以总样本个数的比例,即准确率

    4. reset(重置评价指标)

    1. def reset(self):
    2. self.num_correct = 0
    3. self.num_count = 0
    • reset方法用于重置评价指标,将num_correctnum_count重置为0,以便进行下一轮评价

     

    5. 构造数据进行测试

    1. y = torch.tensor([0, 2])
    2. y_hat = torch.tensor([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])
    3. acc = Accuracy()
    4. acc.update(y_hat, y)
    5. acc.num_correct

     

    6. 代码整合

    1. import torch
    2. # 支持分批进行模型评价的 Accuracy 类
    3. class Accuracy:
    4. def __init__(self, is_logist=True):
    5. # 正确样本个数
    6. self.num_correct = 0
    7. # 样本总数
    8. self.num_count = 0
    9. self.is_logist = is_logist
    10. def update(self, outputs, labels):
    11. # 判断是否为二分类任务
    12. if outputs.shape[1] == 1:
    13. outputs = outputs.squeeze(-1)
    14. # 判断是否是logit形式的预测值
    15. if self.is_logist:
    16. preds = (outputs >= 0).long()
    17. else:
    18. preds = (outputs >= 0.5).long()
    19. else:
    20. # 多分类任务时,计算最大元素索引作为类别
    21. preds = torch.argmax(outputs, dim=1).long()
    22. # 获取本批数据中预测正确的样本个数
    23. labels = labels.squeeze(-1)
    24. batch_correct = (preds == labels).float().sum()
    25. batch_count = len(labels)
    26. # 更新
    27. self.num_correct += batch_correct
    28. self.num_count += batch_count
    29. def accumulate(self):
    30. # 使用累计的数据,计算总的评价指标
    31. if self.num_count == 0:
    32. return 0
    33. return self.num_correct / self.num_count
    34. def reset(self):
    35. self.num_correct = 0
    36. self.num_count = 0
    37. y = torch.tensor([0, 2])
    38. y_hat = torch.tensor([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])
    39. acc = Accuracy()
    40. acc.update(y_hat, y)
    41. acc.num_correct

     

     

     

  • 相关阅读:
    uniapp h5 echarts 打包后图表点击失效/及其他失效
    自己写了个Java RMI(远程方法调用)的实现案例
    Spring Security 前后端分离(前端篇)
    C++Builder6.0 启动参数设置,不打开默认工程,不显示启动画面
    Raven2靶机渗透
    thrust工程化学习(五)----噪声滤除
    Mac上protobuf环境构建-java
    【windows】实战部署二(使用)SVNserver服务端+SVNclient客户端
    C++ Qt开发:PushButton按钮组件
    CleanMyMac X2024告别硬盘空间不足,让您的Mac电脑极速如新
  • 原文地址:https://blog.csdn.net/m0_63834988/article/details/133186305