mindarmour.adv_robustness.detectors

此模块包括用于区分对抗样本和良性样本的检测器方法。

class mindarmour.adv_robustness.detectors.ErrorBasedDetector(auto_encoder, false_positive_rate=0.01, bounds=(0.0, 1.0))[源代码]

检测器重建输入样本,测量重建误差,并拒绝重建误差大的样本。

参考文献: MagNet: a Two-Pronged Defense against Adversarial Examples, by Dongyu Meng and Hao Chen, at CCS 2017.

参数:

  • auto_encoder (Model) - 一个(训练过的)自动编码器,通过减少编码表示输入。

  • false_positive_rate (float) - 检测器的误报率。默认值:0.01。

  • bounds (tuple) - (clip_min, clip_max)。默认值:(0.0, 1.0)。

样例:

>>> from mindspore.ops.operations import Add
>>> from mindspore import Model
>>> from mindarmour.adv_robustness.detectors import ErrorBasedDetector
>>> class Net(nn.Cell):
...     def __init__(self):
...         super(Net, self).__init__()
...         self.add = Add()
...     def construct(self, inputs):
...         return self.add(inputs, inputs)
>>> np.random.seed(5)
>>> ori = np.random.rand(4, 4, 4).astype(np.float32)
>>> np.random.seed(6)
>>> adv = np.random.rand(4, 4, 4).astype(np.float32)
>>> model = Model(Net())
>>> detector = ErrorBasedDetector(model)
>>> detector.fit(ori)
>>> adv_ids = detector.detect(adv)
>>> adv_trans = detector.transform(adv)
detect(inputs)[源代码]

检测输入样本是否具有对抗性。

参数:

  • inputs (numpy.ndarray) - 待判断的可疑样本。

返回:

  • list[int] - 样本是否具有对抗性。如果res[i]=1,则索引为i的输入样本是对抗性的。

detect_diff(inputs)[源代码]

检测原始样本和重建样本之间的距离。

参数:

  • inputs (numpy.ndarray) - 输入样本。

返回:

  • float - 重建样本和原始样本之间的距离。

fit(inputs, labels=None)[源代码]

查找给定数据集的阈值,以区分对抗样本。

参数:

  • inputs (numpy.ndarray) - 输入样本。

  • labels (numpy.ndarray) - 输入样本的标签。默认值:None。

返回:

  • float - 区分对抗样本和良性样本的阈值。

set_threshold(threshold)[源代码]

设置参数阈值。

参数:

  • threshold (float) - 检测阈值。

transform(inputs)[源代码]

重建输入样本。

参数:

  • inputs (numpy.ndarray) - 输入样本。

返回:

  • numpy.ndarray - 重建图像。

class mindarmour.adv_robustness.detectors.DivergenceBasedDetector(auto_encoder, model, option='jsd', t=1, bounds=(0.0, 1.0))[源代码]

基于发散的检测器学习通过js发散来区分正常样本和对抗样本。

参考文献: MagNet: a Two-Pronged Defense against Adversarial Examples, by Dongyu Meng and Hao Chen, at CCS 2017.

参数:

  • auto_encoder (Model) - 编码器模型。

  • model (Model) - 目标模型。

  • option (str) - 用于计算发散的方法。默认值:’jsd’。

  • t (int) - 用于克服数值问题的温度。默认值:1。

  • bounds (tuple) - 数据的上下界。以(clip_min, clip_max)的形式出现。默认值:(0.0, 1.0)。

样例:

>>> import mindspore.ops.operations as P
>>> from mindspore.nn import Cell
>>> from mindspore import Model
>>> from mindarmour.adv_robustness.detectors import DivergenceBasedDetector
>>> class PredNet(Cell):
...     def __init__(self):
...         super(PredNet, self).__init__()
...         self.shape = P.Shape()
...         self.reshape = P.Reshape()
...         self._softmax = P.Softmax()
...     def construct(self, inputs):
...         data = self.reshape(inputs, (self.shape(inputs)[0], -1))
...         return self._softmax(data)
>>> class Net(Cell):
...     def __init__(self):
...         super(Net, self).__init__()
...         self.add = P.Add()
...     def construct(self, inputs):
...         return self.add(inputs, inputs)
>>> np.random.seed(5)
>>> ori = np.random.rand(4, 4, 4).astype(np.float32)
>>> np.random.seed(6)
>>> adv = np.random.rand(4, 4, 4).astype(np.float32)
>>> encoder = Model(Net())
>>> model = Model(PredNet())
>>> detector = DivergenceBasedDetector(encoder, model)
>>> threshold = detector.fit(ori)
>>> detector.set_threshold(threshold)
>>> adv_ids = detector.detect(adv)
>>> adv_trans = detector.transform(adv)
detect_diff(inputs)[源代码]

检测原始样本和重建样本之间的距离。

距离由JSD计算。

参数:

  • inputs (numpy.ndarray) - 输入样本。

返回:

  • float - 距离。

异常:

  • NotImplementedError - 不支持参数 option

class mindarmour.adv_robustness.detectors.RegionBasedDetector(model, number_points=10, initial_radius=0.0, max_radius=1.0, search_step=0.01, degrade_limit=0.0, sparse=False)[源代码]

参考文献: Mitigating evasion attacks to deep neural networks via region-based classification

参数:

  • model (Model) - 目标模型。

  • number_points (int) - 从原始样本的超立方体生成的样本数。默认值:10。

  • initial_radius (float) - 超立方体的初始半径。默认值:0.0。

  • max_radius (float) - 超立方体的最大半径。默认值:1.0。

  • search_step (float) - 搜索半径期间增量。默认值:0.01。

  • degrade_limit (float) - 分类精度的可接受下降。默认值:0.0。

  • sparse (bool) - 如果为True,则输入标签为稀疏编码。如果为False,则输入标签为onehot编码。默认值:False。

样例:

>>> from mindspore.ops.operations import Add
>>> from mindspore import Model
>>> from mindarmour.adv_robustness.detectors import RegionBasedDetector
>>> class Net(nn.Cell):
...     def __init__(self):
...         super(Net, self).__init__()
...         self.add = Add()
...     def construct(self, inputs):
...         return self.add(inputs, inputs)
>>> np.random.seed(5)
>>> ori = np.random.rand(4, 4).astype(np.float32)
>>> labels = np.array([[1, 0, 0, 0], [0, 0, 1, 0], [0, 0, 1, 0],
...                   [0, 1, 0, 0]]).astype(np.int32)
>>> np.random.seed(6)
>>> adv = np.random.rand(4, 4).astype(np.float32)
>>> model = Model(Net())
>>> detector = RegionBasedDetector(model)
>>> radius = detector.fit(ori, labels)
>>> detector.set_radius(radius)
>>> adv_ids = detector.detect(adv)
detect(inputs)[源代码]

判断输入样本是否具有对抗性。

参数:

  • inputs (numpy.ndarray) - 待判断的可疑样本。

返回:

  • list[int] - 样本是否具有对抗性。如果res[i]=1,则索引为i的输入样本是对抗性的。

detect_diff(inputs)[源代码]

返回原始预测结果和基于区域的预测结果。

参数:

  • inputs (numpy.ndarray) - 输入样本。

返回:

  • numpy.ndarray - 输入样本的原始预测结果和基于区域的预测结果。

fit(inputs, labels=None)[源代码]

训练检测器来决定最佳半径。

参数:

  • inputs (numpy.ndarray) - 良性样本。

  • labels (numpy.ndarray) - 输入样本的ground truth标签。默认值:None。

返回:

  • float - 最佳半径。

set_radius(radius)[源代码]

设置半径。

参数:

  • radius (float) - 区域的半径。

transform(inputs)[源代码]

为输入样本生成超级立方体。

参数:

  • inputs (numpy.ndarray) - 输入样本。

返回:

  • numpy.ndarray - 超立方体对应于每个样本。

class mindarmour.adv_robustness.detectors.SpatialSmoothing(model, ksize=3, is_local_smooth=True, metric='l1', false_positive_ratio=0.05)[源代码]

基于空间平滑的检测方法。 使用高斯滤波、中值滤波和均值滤波,模糊原始图像。当模型在样本模糊前后的预测值之间有很大的阈值差异时,将其判断为对抗样本。

参数:

  • model (Model) - 目标模型。

  • ksize (int) - 平滑窗口大小。默认值:3。

  • is_local_smooth (bool) - 如果为True,则触发局部平滑。如果为False,则无局部平滑。默认值:True。

  • metric (str) - 距离方法。默认值:’l1’。

  • false_positive_ratio (float) - 良性样本上的假正率。默认值:0.05。

样例:

>>> import mindspore.ops.operations as P
>>> from mindspore import Model
>>> from mindarmour.adv_robustness.detectors import SpatialSmoothing
>>> class Net(nn.Cell):
...     def __init__(self):
...         super(Net, self).__init__()
...         self._softmax = P.Softmax()
...     def construct(self, inputs):
...         return self._softmax(inputs)
>>> input_shape = (50, 3)
>>> np.random.seed(1)
>>> input_np = np.random.randn(*input_shape).astype(np.float32)
>>> np.random.seed(2)
>>> adv_np = np.random.randn(*input_shape).astype(np.float32)
>>> model = Model(Net())
>>> detector = SpatialSmoothing(model)
>>> threshold = detector.fit(input_np)
>>> detector.set_threshold(threshold.item())
>>> detected_res = np.array(detector.detect(adv_np))
detect(inputs)[源代码]

检测输入样本是否为对抗样本。

参数:

  • inputs (numpy.ndarray) - 待判断的可疑样本。

返回:

  • list[int] - 样本是否具有对抗性。如果res[i]=1,则索引为i的输入样本是对抗性的。

detect_diff(inputs)[源代码]

返回输入样本与其平滑对应样本之间的原始距离值(在应用阈值之前)。

参数:

  • inputs (numpy.ndarray) - 待判断的可疑样本。

返回:

  • float - 距离。

fit(inputs, labels=None)[源代码]

训练检测器来决定阈值。适当的阈值能够确保良性样本上的实际假正率小于给定值。

参数:

  • inputs (numpy.ndarray) - 良性样本。

  • labels (numpy.ndarray) - 默认None。

返回:

  • float - 阈值,大于该距离的距离报告为正,即对抗性。

set_threshold(threshold)[源代码]

设置参数阈值。

参数:

  • threshold (float) - 检测阈值。

class mindarmour.adv_robustness.detectors.EnsembleDetector(detectors, policy='vote')[源代码]

参数:

  • detectors (Union[tuple, list]) - 检测器方法列表。

  • policy (str) - 决策策略,取值可为’vote’、’all’、’any’。默认值:’vote’

样例:

>>> from mindspore.ops.operations import Add
>>> from mindspore import Model
>>> from mindarmour.adv_robustness.detectors import ErrorBasedDetector
>>> from mindarmour.adv_robustness.detectors import RegionBasedDetector
>>> from mindarmour.adv_robustness.detectors import EnsembleDetector
>>> class Net(nn.Cell):
...     def __init__(self):
...         super(Net, self).__init__()
...         self.add = Add()
...     def construct(self, inputs):
...         return self.add(inputs, inputs)
>>> class AutoNet(Cell):
...     def __init__(self):
...         super(AutoNet, self).__init__()
...         self.add = Add()
...     def construct(self, inputs):
...         return self.add(inputs, inputs)
>>> np.random.seed(6)
>>> adv = np.random.rand(4, 4).astype(np.float32)
>>> model = Model(Net())
>>> auto_encoder = Model(AutoNet())
>>> random_label = np.random.randint(10, size=4)
>>> labels = np.eye(10)[random_label]
>>> magnet_detector = ErrorBasedDetector(auto_encoder)
>>> region_detector = RegionBasedDetector(model)
>>> region_detector.fit(adv, labels)
>>> detectors = [magnet_detector, region_detector]
>>> detector = EnsembleDetector(detectors)
>>> adv_ids = detector.detect(adv)
detect(inputs)[源代码]

从输入样本中检测对抗性示例。

参数:

  • inputs (numpy.ndarray) - 输入样本。

返回:

  • list[int] - 样本是否具有对抗性。如果res[i]=1,则索引为i的输入样本是对抗性的。

异常:

  • ValueError - 不支持策略。

detect_diff(inputs)[源代码]

此方法在此类中不可用。

参数:

  • inputs (Union[numpy.ndarray, list, tuple]) - 数据被用作创建对抗样本的引用。

异常:

  • NotImplementedError - 此函数在集成中不可用。

fit(inputs, labels=None)[源代码]

像机器学习模型一样拟合检测器。此方法在此类中不可用。

参数:

  • inputs (numpy.ndarray) - 计算阈值的数据。

  • labels (numpy.ndarray) - 数据的标签。默认值:None。

异常:

  • NotImplementedError - 此函数在集成中不可用。

transform(inputs)[源代码]

过滤输入样本中的对抗性噪声。 此方法在此类中不可用。

参数:

  • inputs (Union[numpy.ndarray, list, tuple]) - 数据被用作创建对抗样本的引用。

异常:

  • NotImplementedError - 此函数在集成中不可用。

class mindarmour.adv_robustness.detectors.SimilarityDetector(trans_model, max_k_neighbor=1000, chunk_size=1000, max_buffer_size=10000, tuning=False, fpr=0.001)[源代码]

检测器测量相邻查询之间的相似性,并拒绝与以前的查询非常相似的查询。

参考文献: Stateful Detection of Black-Box Adversarial Attacks by Steven Chen, Nicholas Carlini, and David Wagner. at arxiv 2019

参数:

  • trans_model (Model) - 一个MindSpore模型,将输入数据编码为低维向量。

  • max_k_neighbor (int) - 最近邻的最大数量。默认值:1000。

  • chunk_size (int) - 缓冲区大小。默认值:1000。

  • max_buffer_size (int) - 最大缓冲区大小。默认值:10000。默认值:False。

  • tuning (bool) - 计算k个最近邻的平均距离,如果’tuning’为true,k=K。如果为False,k=1,…,K。默认值:False。

  • fpr (float) - 合法查询序列上的误报率。默认值:0.001

样例:

>>> from mindspore.ops.operations import Add
>>> from mindspore.nn import Cell
>>> from mindspore import Model
>>> from mindarmour.adv_robustness.detectors import SimilarityDetector
>>> class EncoderNet(Cell):
...     def __init__(self, encode_dim):
...         super(EncoderNet, self).__init__()
...         self._encode_dim = encode_dim
...         self.add = Add()
...     def construct(self, inputs):
...         return self.add(inputs, inputs)
...     def get_encode_dim(self):
...         return self._encode_dim
>>> np.random.seed(5)
>>> x_train = np.random.rand(10, 32, 32, 3).astype(np.float32)
>>> perm = np.random.permutation(x_train.shape[0])
>>> benign_queries = x_train[perm[:10], :, :, :]
>>> suspicious_queries = x_train[perm[-1], :, :, :] + np.random.normal(0, 0.05, (10,) + x_train.shape[1:])
>>> suspicious_queries = suspicious_queries.astype(np.float32)
>>> encoder = Model(EncoderNet(encode_dim=256))
>>> detector = SimilarityDetector(max_k_neighbor=3, trans_model=encoder)
>>> num_nearest_neighbors, thresholds = detector.fit(inputs=x_train)
>>> detector.set_threshold(num_nearest_neighbors[-1], thresholds[-1])
>>> detector.detect(benign_queries)
>>> detections = detector.get_detection_interval()
>>> detected_queries = detector.get_detected_queries()
clear_buffer()[源代码]

清除缓冲区内存。

detect(inputs)[源代码]

处理查询以检测黑盒攻击。

参数:

  • inputs (numpy.ndarray) - 查询顺序。

异常:

  • ValueError - 阈值或num_of_neighbors的参数不可用。

detect_diff(inputs)[源代码]

从输入样本中检测对抗样本,如常见机器学习模型中的predict_proba函数。

参数:

  • inputs (Union[numpy.ndarray, list, tuple]) - 数据被用作创建对抗样本的引用。

异常:

  • NotImplementedError - 此函数在类 SimilarityDetector 中不可用。

fit(inputs, labels=None)[源代码]

处理输入训练数据以计算阈值。 适当的阈值应确保假正率低于给定值。

参数:

  • inputs (numpy.ndarray) - 用于计算阈值的训练数据。

  • labels (numpy.ndarray) - 训练数据的标签。

返回:

  • list[int] - 最近邻的数量。

  • list[float] - 不同K的计算阈值。

异常:

  • ValueError - 训练数据个数小于max_k_neighbor!

get_detected_queries()[源代码]

获取检测到的查询的索引。

返回:

  • list[int] - 检测到的恶意查询的序列号。

get_detection_interval()[源代码]

获取相邻检测之间的间隔。

返回:

  • list[int] - 相邻检测之间的查询数。

set_threshold(threshold, num_of_neighbors)[源代码]

设置参数num_of_neighbors和threshold。

参数:

  • num_of_neighbors (int) - 最近邻的数量。

  • threshold (float) - 检测阈值。

transform(inputs)[源代码]

过滤输入样本中的对抗性噪声。

参数:

  • inputs (Union[numpy.ndarray, list, tuple]) - 数据被用作创建对抗样本的引用。

异常:

  • NotImplementedError - 此函数在类 SimilarityDetector 中不可用。