Files
2026-07-13 12:35:45 +08:00

109 lines
3.3 KiB
Python

import distutils.util
import numpy as np
from tqdm import tqdm
from loguru import logger
def print_arguments(args=None, configs=None, title=None):
if args:
logger.info("----------- 额外配置参数 -----------")
for arg, value in sorted(vars(args).items()):
logger.info(f"{arg}: {value}")
logger.info("------------------------------------------------")
if configs:
title = title if title else "配置文件参数"
logger.info(f"----------- {title} -----------")
for arg, value in sorted(configs.items()):
if isinstance(value, dict):
logger.info(f"{arg}:")
for a, v in sorted(value.items()):
if isinstance(v, dict):
logger.info(f"\t{a}:")
for a1, v1 in sorted(v.items()):
logger.info(f"\t\t{a1}: {v1}")
else:
logger.info(f"\t{a}: {v}")
else:
logger.info(f"{arg}: {value}")
logger.info("------------------------------------------------")
def add_arguments(argname, type, default, help, argparser, **kwargs):
type = distutils.util.strtobool if type == bool else type
argparser.add_argument("--" + argname,
default=default,
type=type,
help=help + ' 默认: %(default)s.',
**kwargs)
class Dict(dict):
__setattr__ = dict.__setitem__
__getattr__ = dict.__getitem__
def dict_to_object(dict_obj):
if not isinstance(dict_obj, dict):
return dict_obj
inst = Dict()
for k, v in dict_obj.items():
inst[k] = dict_to_object(v)
return inst
# 根据对角余弦值计算准确率和最优的阈值
def cal_accuracy_threshold(y_score, y_true):
y_score = np.asarray(y_score)
y_true = np.asarray(y_true)
best_accuracy = 0
best_threshold = 0
for i in tqdm(range(0, 100)):
threshold = i * 0.01
y_test = (y_score >= threshold)
acc = np.mean((y_test == y_true).astype(int))
if acc > best_accuracy:
best_accuracy = acc
best_threshold = threshold
return best_accuracy, best_threshold
# 根据对角余弦值计算准确率
def cal_accuracy(y_score, y_true, threshold=0.5):
y_score = np.asarray(y_score)
y_true = np.asarray(y_true)
y_test = (y_score >= threshold)
accuracy = np.mean((y_test == y_true).astype(int))
return accuracy
# 计算对角余弦值
def cosin_metric(x1, x2):
return np.dot(x1, x2) / (np.linalg.norm(x1) * np.linalg.norm(x2))
# 根据a的类型,将b转换为相应的类型
def convert_string_based_on_type(a, b):
if isinstance(a, int):
try:
b = int(b)
except ValueError:
logger.error("无法将字符串转换为整数")
elif isinstance(a, float):
try:
b = float(b)
except ValueError:
logger.error("无法将字符串转换为浮点数")
elif isinstance(a, str):
return b
elif isinstance(a, bool):
b = b.lower() == 'true'
else:
try:
b = eval(b)
except Exception as e:
logger.exception("无法将字符串转换为其他类型,将忽略该参数类型转换")
return b