mindarmour.adv_robustness.detectors
此模块包括用于区分对抗样本和良性样本的检测器方法。
- class mindarmour.adv_robustness.detectors.ErrorBasedDetector(auto_encoder, false_positive_rate=0.01, bounds=(0.0, 1.0))[源代码]
检测器重建输入样本,测量重建误差,并拒绝重建误差大的样本。
参数:
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 - 重建样本和原始样本之间的距离。
- class mindarmour.adv_robustness.detectors.DivergenceBasedDetector(auto_encoder, model, option='jsd', t=1, bounds=(0.0, 1.0))[源代码]
基于发散的检测器学习通过js发散来区分正常样本和对抗样本。
参数:
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)
- 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 - 输入样本的原始预测结果和基于区域的预测结果。
- 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 - 距离。
- 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 - 此函数在集成中不可用。
- class mindarmour.adv_robustness.detectors.SimilarityDetector(trans_model, max_k_neighbor=1000, chunk_size=1000, max_buffer_size=10000, tuning=False, fpr=0.001)[源代码]
检测器测量相邻查询之间的相似性,并拒绝与以前的查询非常相似的查询。
参数:
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()
- 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!