我正在尝试使用 Cleverhans 中实现的 Elastic-Net 算法在分类任务中生成对抗样本。主要问题是我试图以某种方式使用它,以便在目标类(不同于原始类)的分类时获得更高的置信度,但我无法达到良好的结果。我试图愚弄的系统是一个在 10 个类上具有 softmax 输出的 DNN。
例如:
- 给定第 3 类的样本,我想生成第 0 类的对抗样本。
- 使用在cleverhans 的 ElasticNetMethod 中实现的默认超参数,我能够获得成功的攻击,因此分配给对抗样本的类变成了 0 类,但置信度很低(大约 30%)。尝试不同的超参数值也会发生这种情况。
- 我的目的是获得相当高的置信度(至少 90%)。
- 对于像“FGSM”或“MadryEtAl”这样的其他算法,我能够达到这个目的,创建一个循环,在该循环中应用算法,直到样本被分类为目标类,置信度大于 90%,但我不能将此迭代应用于 EAD 算法,因为在迭代的每一步它都会产生第一步生成的对抗样本,并且在接下来的迭代中它保持不变。(我知道这可能会发生,因为该算法与提到的其他两个不同,但我正在尝试找到一个解决方案来达到我的目的)。
这是我实际用来生成对抗样本的代码。
ead_params = { 'binary_search_steps':9, 'max_iterations':100 , 'learning_rate':0.001, 'clip_min':0,'clip_max':1,'y_target':target}
adv_x = image
founded_adv = False
threshold = 0.9
wrap = KerasModelWrapper(model)
ead = ElasticNetMethod(wrap, sess=sess)
while (not founded_adv):
adv_x = ead.generate_np(adv_x, **ead_params)
prediction = model.predict(adv_x).tolist()
pred_class = np.argmax(prediction[0])
confidence = prediction[0][pred_class]
if (pred_class == 0 and confidence >= threshold):
founded_adv = True
while 循环可能会生成一个样本,直到以大于 90% 的置信度达到目标类。此代码实际上适用于 FGSM 和 Madry,但使用 EAD 无限运行。
库版本:
张量流:2.2.0 Keras:2.4.3 Cleverhans:2.0.0-451ccecad450067f99c333fc53592201
任何人都可以帮助我吗?
非常感谢。