mindarmour.adv_robustness.evaluations
此模块包括各种指标,用于评估攻击或防御的结果。
- class mindarmour.adv_robustness.evaluations.AttackEvaluate(inputs, labels, adv_inputs, adv_preds, targeted=False, target_label=None)[源代码]
攻击方法的评估指标。
参数:
inputs (numpy.ndarray) - 原始样本。
labels (numpy.ndarray) - 原始样本的one-hot格式标签。
adv_inputs (numpy.ndarray) - 从原始样本生成的对抗样本。
adv_preds (numpy.ndarray) - 对抗样本的所有输出类的概率。
targeted (bool) - 如果为True,则为目标攻击。如果为False,则为无目标攻击。默认值:False。
target_label (numpy.ndarray) - 对抗样本的目标类,是大小为adv_inputs.shape[0]的一维。默认值:None。
异常:
ValueError - 如果targeted为True时,target_label为None。
样例:
>>> from mindarmour.adv_robustness.evaluations import AttackEvaluate >>> x = np.random.normal(size=(3, 512, 512, 3)) >>> adv_x = np.random.normal(size=(3, 512, 512, 3)) >>> y = np.array([[0.1, 0.1, 0.2, 0.6], ... [0.1, 0.7, 0.0, 0.2], ... [0.8, 0.1, 0.0, 0.1]]) >>> adv_y = np.array([[0.1, 0.1, 0.2, 0.6], ... [0.1, 0.0, 0.8, 0.1], ... [0.0, 0.9, 0.1, 0.0]]) >>> attack_eval = AttackEvaluate(x, y, adv_x, adv_y) >>> mr = attack_eval.mis_classification_rate() >>> acac = attack_eval.avg_conf_adv_class() >>> l_0, l_2, l_inf = attack_eval.avg_lp_distance() >>> ass = attack_eval.avg_ssim() >>> nte = attack_eval.nte() >>> actc = attack_eval.avg_conf_true_class()
- avg_lp_distance()[源代码]
计算平均lp距离(lp-dist)。
返回:
float - 返回所有成功对抗样本的平均’l0’、’l2’或’linf’距离,返回值包括以下情况。 如果返回值 \(>=\) 0,则为平均lp距离。值越低,攻击就越成功。 如果返回值为-1,则没有成功的对抗样本。
- avg_ssim()[源代码]
计算平均结构相似性(ASS)。
返回:
float - 平均结构相似性。 如果返回值在(0,1)之间,则值越高,攻击越成功。 如果返回值为-1,则没有成功的对抗样本。
- nte()[源代码]
计算噪声容量估计(NTE)。
参考文献:Towards Imperceptible and Robust Adversarial Example Attacks against Neural Networks。
返回:
float - 范围在(0,1)之间。值越高,攻击就越成功。
- class mindarmour.adv_robustness.evaluations.BlackDefenseEvaluate(raw_preds, def_preds, raw_query_counts, def_query_counts, raw_query_time, def_query_time, def_detection_counts, true_labels, max_queries)[源代码]
反黑盒防御方法的评估指标。
参数:
raw_preds (numpy.ndarray) - 预测原始模型上某些样本的结果。
def_preds (numpy.ndarray) - 预测防御模型上某些样本的结果。
raw_query_counts (numpy.ndarray) - 在原始模型上生成对抗样本的查询数,原始模型是大小为raw_preds.shape[0]的一维。对于良性样本,查询计数必须设置为0。
def_query_counts (numpy.ndarray) - 在防御模型上生成对抗样本的查询数,原始模型是大小为raw_preds.shape[0]的一维。对于良性样本,查询计数必须设置为0。
raw_query_time (numpy.ndarray) - 在原始模型上生成对抗样本的总持续时间,该样本是大小为raw_preds.shape[0]的一维。
def_query_time (numpy.ndarray) - 在防御模型上生成对抗样本的总持续时间,该样本是大小为raw_preds.shape[0]的一维。
def_detection_counts (numpy.ndarray) - 每次对抗样本生成期间检测到的查询总数,大小为raw_preds.shape[0]的一维。对于良性样本,如果查询被识别为可疑,则将def_detection_counts设置为1,否则将其设置为0。
true_labels (numpy.ndarray) - 大小为raw_preds.shape[0]的一维真标签。
max_queries (int) - 攻击预算,最大查询数。
样例:
>>> from mindarmour.adv_robustness.evaluations import BlackDefenseEvaluate >>> raw_preds = np.array([[0.1, 0.1, 0.2, 0.6], ... [0.1, 0.7, 0.0, 0.2], ... [0.8, 0.1, 0.0, 0.1]]) >>> def_preds = np.array([[0.1, 0.1, 0.1, 0.7], ... [0.1, 0.6, 0.2, 0.1], ... [0.1, 0.2, 0.1, 0.6]]) >>> raw_query_counts = np.array([0,20,10]) >>> def_query_counts = np.array([0,50,60]) >>> raw_query_time = np.array([0.1, 2, 1]) >>> def_query_time = np.array([0.2, 6, 5]) >>> def_detection_counts = np.array([1, 5, 10]) >>> true_labels = np.array([3, 1, 0]) >>> max_queries = 100 >>> def_eval = BlackDefenseEvaluate(raw_preds, ... def_preds, ... raw_query_counts, ... def_query_counts, ... raw_query_time, ... def_query_time, ... def_detection_counts, ... true_labels, ... max_queries) >>> qcv = def_eval.qcv() >>> asv = def_eval.asv() >>> fpr = def_eval.fpr() >>> qrv = def_eval.qrv()
- class mindarmour.adv_robustness.evaluations.DefenseEvaluate(raw_preds, def_preds, true_labels)[源代码]
防御方法的评估指标。
参数:
raw_preds (numpy.ndarray) - 原始模型上某些样本的预测结果。
def_preds (numpy.ndarray) - 防御模型上某些样本的预测结果。
true_labels (numpy.ndarray) - 样本的ground-truth标签,一个大小为ground-truth的一维数组。
样例:
>>> from mindarmour.adv_robustness.evaluations import DefenseEvaluate >>> raw_preds = np.array([[0.1, 0.1, 0.2, 0.6], ... [0.1, 0.7, 0.0, 0.2], ... [0.8, 0.1, 0.0, 0.1]]) >>> def_preds = np.array([[0.1, 0.1, 0.1, 0.7], ... [0.1, 0.6, 0.2, 0.1], ... [0.1, 0.2, 0.1, 0.6]]) >>> true_labels = np.array([3, 1, 0]) >>> def_eval = DefenseEvaluate(raw_preds, ... def_preds, ... true_labels) >>> cav = def_eval.cav() >>> crr = def_eval.crr() >>> csr = def_eval.csr() >>> ccv = def_eval.ccv() >>> cos = def_eval.cos()
- cos()[源代码]
参考文献:Calculate classification output stability (COS)。
返回:
float - 如果返回值>=0,则是有效的防御。值越低,防守越成功。如果返回值== -1, 则说明样本数量为0。
- class mindarmour.adv_robustness.evaluations.RadarMetric(metrics_name, metrics_data, labels, title, scale='hide')[源代码]
雷达图,通过多个指标显示模型的鲁棒性。
参数:
metrics_name (Union[tuple, list]) - 要显示的度量名称数组。每组值对应一条雷达曲线。
metrics_data (numpy.ndarray) - 多个雷达曲线的每个度量的(归一化)值,如[[0.5, 0.8, …], [0.2,0.6,…], …]。
labels (Union[tuple, list]) - 所有雷达曲线的图例。
title (str) - 图表的标题。
scale (str) - 用于调整轴刻度的标量,如’hide’、’norm’、’sparse’、’dense’。默认值:’hide’。
异常:
ValueError - scale值不在[‘hide’, ‘norm’, ‘sparse’, ‘dense’]中。
样例:
>>> from mindarmour.adv_robustness.evaluations import RadarMetric >>> metrics_name = ['MR', 'ACAC', 'ASS', 'NTE', 'ACTC'] >>> def_metrics = [0.9, 0.85, 0.6, 0.7, 0.8] >>> raw_metrics = [0.5, 0.3, 0.55, 0.65, 0.7] >>> metrics_data = np.array([def_metrics, raw_metrics]) >>> metrics_labels = ['before', 'after'] >>> rm = RadarMetric(metrics_name, ... metrics_data, ... metrics_labels, ... title='', ... scale='sparse') >>> #rm.show()