0
点赞
收藏
分享

微信扫一扫

VUE3父子组件传值defineProps() 和 defineEmits()

目录

一、实验介绍

 二、实验环境

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:

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

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

977468b5ae9843c6a88005e792817cb1.png

 0. 导入必要的工具包

import torch
from sklearn.datasets import load_iris
from torch.utils.data import Dataset, DataLoader

  • DatasetDataLoader类用于处理数据集和数据加载

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

1. __init__(构造函数)

class Accuracy:
    def __init__(self, is_logist=True):
        self.num_correct = 0
        self.num_count = 0
        self.is_logist = is_logist

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

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

def update(self, outputs, labels):
    if outputs.shape[1] == 1:
        outputs = outputs.squeeze(-1)
        if self.is_logist:
            preds = (outputs >= 0).long()
        else:
            preds = (preds >= 0.5).long()
    else:
        preds = torch.argmax(outputs, dim=1).long()
        
    labels = labels.squeeze(-1)
    batch_correct = (preds==labels).float().sum()
    batch_count = len(labels)
    self.num_correct += batch_correct
    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(计算准确率)

def accumulate(self):
    if self.num_count == 0:
        return 0
    return self.num_correct / self.num_count

  • accumulate方法用于计算准确率。
    •  如果num_count为0,表示没有进行过更新,返回0。
    • 否则,返回正确样本个数除以总样本个数的比例,即准确率

4. reset(重置评价指标)

def reset(self):
    self.num_correct = 0
    self.num_count = 0

  • reset方法用于重置评价指标,将num_correctnum_count重置为0,以便进行下一轮评价

5. 构造数据进行测试

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

6. 代码整合

import torch


# 支持分批进行模型评价的 Accuracy 类
class Accuracy:
def __init__(self, is_logist=True):
# 正确样本个数
self.num_correct = 0
# 样本总数
self.num_count = 0
self.is_logist = is_logist

def update(self, outputs, labels):
# 判断是否为二分类任务
if outputs.shape[1] == 1:
outputs = outputs.squeeze(-1)
# 判断是否是logit形式的预测值
if self.is_logist:
preds = (outputs >= 0).long()
else:
preds = (preds >= 0.5).long()
else:
# 多分类任务时,计算最大元素索引作为类别
preds = torch.argmax(outputs, dim=1).long()

# 获取本批数据中预测正确的样本个数
labels = labels.squeeze(-1)
batch_correct = (preds == labels).float().sum()
batch_count = len(labels)
# 更新
self.num_correct += batch_correct
self.num_count += batch_count

def accumulate(self):
# 使用累计的数据,计算总的评价指标
if self.num_count == 0:
return 0
return self.num_correct / self.num_count

def reset(self):
self.num_correct = 0
self.num_count = 0


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

举报

相关推荐

0 条评论