联邦聚合算法代码详解(第二期utils.py部分)

 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]

  1. 长度为3的情况:

    对于每一个子数组(data[i]i从0到2),在特定的索引位置(如[1][28],`[[1][29], [1][30]等)将值设置为1。
  2. 长度为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
  1. def mkdirs(dirpath):
    函数接受一个参数 dirpath,表示要创建的目录路径。
  2. mkdirs 函数的主要目的是确保指定的目录路径存在,无论路径中是否包含不存在的父目录。通过使用 os.makedirs,该函数能够递归创建所有必要的目录。如果目录已经存在,则捕获异常并忽略,使得函数在重复调用时不会出错。这在需要动态创建目录结构的脚本和应用程序中非常有用,确保文件操作可以顺利进行。用法示例: 假设你需要在脚本中创建一个路径 ./data/models,可以这样调用该函数:
  3. try: os.makedirs(dirpath) os.makedirs os
    使用 os.makedirs(dirpath) 尝试创建指定路径的目录。os.makedirs递归地创建所有必要的父目录。如果目录已经存在,默认情况下会引发 FileExistsError 异常。
  4. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值