
本文将实现一个辅助功能——计算预测的准确率。Accuracy支持对每一个回合中每批数据进行评价,并将结果累积,最终获得整批数据的评价结果。
update方法来更新评价指标;accumulate方法获取累计的准确率;reset方法重置评价指标,以便进行下一轮的计算。本系列实验使用了PyTorch深度学习框架,相关操作如下:
conda create -n DL python=3.7 conda activate DLpip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.htmlconda install matplotlib conda install scikit-learn软件包 | 本实验版本 | 目前最新版 |
|---|---|---|
matplotlib | 3.5.3 | 3.8.0 |
numpy | 1.21.6 | 1.26.0 |
python | 3.7.16 | |
scikit-learn | 0.22.1 | 1.3.0 |
torch | 1.8.1+cu102 | 2.0.1 |
torchaudio | 0.8.1 | 2.0.2 |
torchvision | 0.9.1+cu102 | 0.15.2 |
ChatGPT:
前馈神经网络(Feedforward Neural Network)是一种常见的人工神经网络模型,也被称为多层感知器(Multilayer Perceptron,MLP)。它是一种基于前向传播的模型,主要用于解决分类和回归问题。 前馈神经网络由多个层组成,包括输入层、隐藏层和输出层。它的名称"前馈"源于信号在网络中只能向前流动,即从输入层经过隐藏层最终到达输出层,没有反馈连接。 以下是前馈神经网络的一般工作原理:
前馈神经网络的优点包括能够处理复杂的非线性关系,适用于各种问题类型,并且能够通过训练来自动学习特征表示。然而,它也存在一些挑战,如容易过拟合、对大规模数据和高维数据的处理较困难等。为了应对这些挑战,一些改进的网络结构和训练技术被提出,如卷积神经网络(Convolutional Neural Networks)和循环神经网络(Recurrent Neural Networks)等。
本系列为实验内容,对理论知识不进行详细阐释
(咳咳,其实是没时间整理,待有缘之时,回来填坑)

import torch
from sklearn.datasets import load_iris
from torch.utils.data import Dataset, DataLoaderDataset和DataLoader类用于处理数据集和数据加载这段代码定义了一个名为Accuracy的类,用于支持分批进行模型评价,特别是在分类任务中计算准确率。
1. __init__(构造函数)class Accuracy:
def __init__(self, is_logist=True):
self.num_correct = 0
self.num_count = 0
self.is_logist = is_logistAccuracy对象时被调用。它接受一个可选的参数is_logist,默认为True,用于指示是否为logist形式的预测值。self.num_correct用于记录正确预测的样本个数。self.num_count用于记录总样本个数。self.is_logist指示是否为logist形式的预测值。def update(self, outputs, labels):
if outputs.shape[1] == 1:
outputs = outputs.squeeze(-1)
if self.is_logist:
preds = (outputs >= 0).long()
else:
preds = (outputs >= 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_countupdate方法用于更新评价指标。它接受两个参数outputs和labels,分别表示模型的预测输出和真实标签。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_correct和num_count,累积计算正确样本个数和总样本个数。def accumulate(self):
if self.num_count == 0:
return 0
return self.num_correct / self.num_countaccumulate方法用于计算准确率。 num_count为0,表示没有进行过更新,返回0。def reset(self):
self.num_correct = 0
self.num_count = 0reset方法用于重置评价指标,将num_correct和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_correctimport 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 = (outputs >= 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