utils.py
结构
def Adding_Trigger(data):
def test_accuracy(net, parameters, testDataLoader):
def launch_tensor_board(log_path, port, host):
def mkdirs(dirpath):
第一块:def Adding_Trigger():-----特定位置添加触发器。
def Adding_Trigger(data):
if data.shape[0] == 3:
for i in range(3):
data[i][1][28] = 1
data[i][1][29] = 1
data[i][1][30] = 1
data[i][2][29] = 1
data[i][3][28] = 1
data[i][4][29] = 1
data[i][5][28] = 1
data[i][5][29] = 1
data[i][5][30] = 1
if data.shape[0] == 1:
data[0][1][24] = 1
data[0][1][25] = 1
data[0][1][26] = 1
data[0][2][24] = 1
data[0][3][25] = 1
data[0][4][26] = 1
data[0][5][24] = 1
data[0][5][25] = 1
data[0][5][26] = 1
return data
Adding_Trigger
根据数据的形状(第一维的长度)(张量行数),在数据的特定位置添加触发器。具体来说,如果数据的第一维长度为3或1,函数会在相应的位置将值设置为1,以便对数据进行标记或触发某些特定行为。
检查数据的第一维长度(data.shape[0]
)
-
长度为3的情况:!
对于每一个子数组(data[i]
,i
从0到2),在特定的索引位置(如[1][28]
,`[[1][29]
,[1][30]
等)将值设置为1。 -
长度为1的情况:
对于唯一的子数组(data[0]
),在不同的索引位置(如[1][24]
,`[[1][25]
,`[1[1][26]
等)将值设置为1。
数据预处理,后续的算法或模型中识别和使用这些标记。例如,这些触发器可能用于:
第二块:def test_accuracy():-----评估模型的性能
def test_accuracy(net, parameters, testDataLoader):
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
loss_collector = []
criterion = F.cross_entropy
with torch.no_grad():
net.load_state_dict(parameters, strict=True)'''加载模型参数'''
sum_accu = 0'''初始化准确率和批次计数'''
num = 0
loss_collector.clear()
# 载入测试集
for data, label in testDataLoader:'''遍历测试数据集'''
data, label = data.to(dev), label.to(dev)'''数据迁移: 将数据和标签迁移到指定的设备(GPU或CPU)。'''
preds = net(data)'''前向传播: 使用模型进行预测,得到 preds。'''
loss = criterion(preds, label.long())'''计算损失'''
# loss = 1
loss_collector.append(loss.item())
preds = torch.argmax(preds, dim=1)'''获取预测的类别标签'''
sum_accu += (preds == label).float().mean()
num += 1
accuracy = sum_accu / num
avg_loss = sum(loss_collector) / len(loss_collector)
return avg_loss, accuracy '''平均损失和准确率'''
test_accuracy
函数在给定的测试数据上评估神经网络模型的性能,包括计算平均损失和准确率。该函数用于在不进行梯度更新的情况下,验证模型在未见过的数据上的表现。
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
这行代码根据当前系统是否有GPU(通过CUDA)来决定使用GPU还是CPU进行计算。
-
初始化损失收集器和损失函数:
loss_collector = []
用于收集每个batch的损失值(列表)criterion = F.cross_entropy
交叉熵损失函数,适用于分类任务。 -
禁用梯度计算:在评估模型时不需要更新权重。
-
加载模型参数:
net.load_state_dict(parameters, strict=True) ``
将提供的参数加载到模型中,确保评估的是当前指定的模型状态。
第三块:def launch_tensor_board():-----
启动 TensorBoard,可视化实验
def launch_tensor_board(log_path, port, host):
os.system(f"tensorboard.exe --logdir={log_path} --port={port} --host={host}")
return True
启动 TensorBoard,一个用于可视化机器学习实验的工具。通过提供日志目录、端口号和主机地址,该函数可以方便地启动 TensorBoard 服务器,使用户能够在浏览器中查看训练过程中的各种指标和图表。
log_path
(
日志存储路径)、
port
:(
整数)
TensorBoard 服务将监听的端口号。
host
:(
字符串)
指定 TensorBoard 服务将绑定的主机名或 IP 地址。如
函数执行完毕后返回 True
,
你可以在浏览器中访问 http://localhost:6006
查看 TensorBoard 的可视化界面。
第四块:def mkdirs():-----创建目录路径并忽略异常
def mkdirs(dirpath):
try:
os.makedirs(dirpath)
except Exception as _:
pass
-
def mkdirs(dirpath):
dirpath
,表示要创建的目录路径。 mkdirs
函数的主要目的是确保指定的目录路径存在,无论路径中是否包含不存在的父目录。通过使用os.makedirs
,该函数能够递归创建所有必要的目录。如果目录已经存在,则捕获异常并忽略,使得函数在重复调用时不会出错。这在需要动态创建目录结构的脚本和应用程序中非常有用,确保文件操作可以顺利进行。用法示例: 假设你需要在脚本中创建一个路径./data/models
,可以这样调用该函数:-
try: os.makedirs(dirpath) os.makedirs os
os.makedirs(dirpath)
尝试创建指定路径的目录。os.makedirs
会递归地创建所有必要的父目录。如果目录已经存在,默认情况下会引发FileExistsError
异常。 -
except Exception as _: pa pass
Exception
捕获所有可能的异常。捕获到任何异常时,执行pass
,表示忽略该异常,不执行任何操作。这种处理方式确保了当目录已经存在时,不会引发错误并中断程序执行。
总代码:
import os
import numpy as np
import torch
import torch.nn.functional as F
from sklearn.manifold import TSNE
from sklearn.metrics import roc_auc_score
from sklearn.cluster import KMeans
import math
def Adding_Trigger(data):
if data.shape[0] == 3:
for i in range(3):
data[i][1][28] = 1
data[i][1][29] = 1
data[i][1][30] = 1
data[i][2][29] = 1
data[i][3][28] = 1
data[i][4][29] = 1
data[i][5][28] = 1
data[i][5][29] = 1
data[i][5][30] = 1
if data.shape[0] == 1:
data[0][1][24] = 1
data[0][1][25] = 1
data[0][1][26] = 1
data[0][2][24] = 1
data[0][3][25] = 1
data[0][4][26] = 1
data[0][5][24] = 1
data[0][5][25] = 1
data[0][5][26] = 1
return data
def test_accuracy(net, parameters, testDataLoader):
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
loss_collector = []
criterion = F.cross_entropy
with torch.no_grad():
net.load_state_dict(parameters, strict=True)
sum_accu = 0
num = 0
loss_collector.clear()
# 载入测试集
for data, label in testDataLoader:
data, label = data.to(dev), label.to(dev)
preds = net(data)
loss = criterion(preds, label.long())
# loss = 1
loss_collector.append(loss.item())
preds = torch.argmax(preds, dim=1)
sum_accu += (preds == label).float().mean()
num += 1
accuracy = sum_accu / num
avg_loss = sum(loss_collector) / len(loss_collector)
return avg_loss, accuracy
def launch_tensor_board(log_path, port, host):
os.system(f"tensorboard.exe --logdir={log_path} --port={port} --host={host}")
return True
def mkdirs(dirpath):
try:
os.makedirs(dirpath)
except Exception as _:
pass