关于Cleverhans中实现的ElasticNet算法的问题
Question on ElasticNet algorithm implemented in Cleverhans
我正在尝试使用 Cleverhans 中实现的 Elastic-Net 算法在 classification 任务中生成对抗样本。主要问题是我试图以一种方式使用它来在目标class(与原始目标不同)的class化时获得更高的置信度,但我无法达到很好的效果。
我试图愚弄的系统是一个 DNN,其 softmax 输出为 10 classes.
例如:
- 给定 class 3 的样本,我想生成一个 class 0.
的对抗样本
- 使用 cleverhans 的 ElasticNetMethod 中实现的默认超参数,我能够获得成功的攻击,因此分配给对抗样本的 class 变成了 class 0,但是置信度是相当低(约 30%)。为超参数尝试不同的值也会发生这种情况。
- 我的目的是获得相当高的置信度(至少 90%)。
- 对于其他算法,如“FGSM”或“MadryEtAl”,我能够达到此目的,创建一个循环,在该循环中应用算法,直到样本 class 被确定为目标 class 置信度大于 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% 的置信度达到目标 class。此代码实际上适用于 FGSM 和 Madry,但使用 EAD 可以无限运行。
库版本:
张量流:2.2.0
凯拉斯:2.4.3
聪明人:2.0.0-451ccecad450067f99c333fc53592201
谁能帮帮我?
非常感谢。
对于任何对此问题感兴趣的人,可以通过这种方式修改以前的代码以使其正常工作:
第一个解决方案:
prediction = model.predict(image)
initial_predicted_class = np.argmax(prediction[0])
ead_params = { 'binary_search_steps':9, 'max_iterations':100 , 'learning_rate':0.001,'confidence':1, '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 == initial_pred_class and confidence >= threshold):
founded_adv = True
else:
ead_params['confidence'] += 1
使用库中实现的置信度参数。实际上,如果目标 class 的概率没有增加,我们将置信度参数增加 1。
第二种解决方案:
prediction = model.predict(image)
initial_predicted_class = np.argmax(prediction[0])
ead_params = {'beta':5e-3 , 'binary_search_steps':6, 'max_iterations':10 , 'learning_rate':3e-2, 'clip_min':0,'clip_max':1}
threshold = 0.96
adv_x = image
founded_adv = False
wrap = KerasModelWrapper(model)
ead = ElasticNetMethod(wrap, sess=sess)
while (not founded_adv):
eps_hyp = 0.5
new_adv_x = ead.generate_np(adv_x, **ead_params)
pert = new_adv_x-adv_x
new_adv_x = adv_x - eps_hyp*pert
new_adv_x = (new_adv_x - np.min(new_adv_x)) / (np.max(new_adv_x) - np.min(new_adv_x))
adv_x = new_adv_x
prediction = model.predict(new_adv_x).tolist()
pred_class = np.argmax(prediction[0])
confidence = prediction[0][pred_class]
print(pred_class)
print(confidence)
if (pred_class == initial_predicted_class and confidence >= threshold):
founded_adv = True
方案二对原代码进行如下修改:
-Initial_predicted_class 是模型在良性样本上预测的 class(我们的示例为“0”)。
-在算法的参数中(ead_params)我们不插入目标class.
-然后我们可以得到算法计算pert = new_adv_x - adv_x给出的扰动 其中“adv_x”是原图(在for的第一步循环),new_adv_x为算法生成的扰动样本。
-前面的操作很有用,因为EAD原始算法计算扰动以最大化损失w.r.t class“0”,但在我们的例子中我们想最小化它。
-因此,我们可以将新的扰动图像计算为 new_adv_x = adv_x - eps_hyp*pert(其中 eps_hyp 是一个 epsilon 超参数,我'我们引入了减少扰动),然后我们将新的扰动图像归一化。
-我已经针对大量图像测试了代码,而且信心总是在增加,所以我认为这可能是一个很好的解决方案。
我认为第二种解决方案可以获得更好的扰动。
我正在尝试使用 Cleverhans 中实现的 Elastic-Net 算法在 classification 任务中生成对抗样本。主要问题是我试图以一种方式使用它来在目标class(与原始目标不同)的class化时获得更高的置信度,但我无法达到很好的效果。 我试图愚弄的系统是一个 DNN,其 softmax 输出为 10 classes.
例如:
- 给定 class 3 的样本,我想生成一个 class 0. 的对抗样本
- 使用 cleverhans 的 ElasticNetMethod 中实现的默认超参数,我能够获得成功的攻击,因此分配给对抗样本的 class 变成了 class 0,但是置信度是相当低(约 30%)。为超参数尝试不同的值也会发生这种情况。
- 我的目的是获得相当高的置信度(至少 90%)。
- 对于其他算法,如“FGSM”或“MadryEtAl”,我能够达到此目的,创建一个循环,在该循环中应用算法,直到样本 class 被确定为目标 class 置信度大于 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% 的置信度达到目标 class。此代码实际上适用于 FGSM 和 Madry,但使用 EAD 可以无限运行。
库版本:
张量流:2.2.0 凯拉斯:2.4.3 聪明人:2.0.0-451ccecad450067f99c333fc53592201
谁能帮帮我?
非常感谢。
对于任何对此问题感兴趣的人,可以通过这种方式修改以前的代码以使其正常工作:
第一个解决方案:
prediction = model.predict(image)
initial_predicted_class = np.argmax(prediction[0])
ead_params = { 'binary_search_steps':9, 'max_iterations':100 , 'learning_rate':0.001,'confidence':1, '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 == initial_pred_class and confidence >= threshold):
founded_adv = True
else:
ead_params['confidence'] += 1
使用库中实现的置信度参数。实际上,如果目标 class 的概率没有增加,我们将置信度参数增加 1。
第二种解决方案:
prediction = model.predict(image)
initial_predicted_class = np.argmax(prediction[0])
ead_params = {'beta':5e-3 , 'binary_search_steps':6, 'max_iterations':10 , 'learning_rate':3e-2, 'clip_min':0,'clip_max':1}
threshold = 0.96
adv_x = image
founded_adv = False
wrap = KerasModelWrapper(model)
ead = ElasticNetMethod(wrap, sess=sess)
while (not founded_adv):
eps_hyp = 0.5
new_adv_x = ead.generate_np(adv_x, **ead_params)
pert = new_adv_x-adv_x
new_adv_x = adv_x - eps_hyp*pert
new_adv_x = (new_adv_x - np.min(new_adv_x)) / (np.max(new_adv_x) - np.min(new_adv_x))
adv_x = new_adv_x
prediction = model.predict(new_adv_x).tolist()
pred_class = np.argmax(prediction[0])
confidence = prediction[0][pred_class]
print(pred_class)
print(confidence)
if (pred_class == initial_predicted_class and confidence >= threshold):
founded_adv = True
方案二对原代码进行如下修改:
-Initial_predicted_class 是模型在良性样本上预测的 class(我们的示例为“0”)。
-在算法的参数中(ead_params)我们不插入目标class.
-然后我们可以得到算法计算pert = new_adv_x - adv_x给出的扰动 其中“adv_x”是原图(在for的第一步循环),new_adv_x为算法生成的扰动样本。
-前面的操作很有用,因为EAD原始算法计算扰动以最大化损失w.r.t class“0”,但在我们的例子中我们想最小化它。
-因此,我们可以将新的扰动图像计算为 new_adv_x = adv_x - eps_hyp*pert(其中 eps_hyp 是一个 epsilon 超参数,我'我们引入了减少扰动),然后我们将新的扰动图像归一化。
-我已经针对大量图像测试了代码,而且信心总是在增加,所以我认为这可能是一个很好的解决方案。
我认为第二种解决方案可以获得更好的扰动。