foolbox 3.3.1下TensorFlow模型运行Carlini&Wagner攻击报错求解
错误原因
Foolbox 3.3.1属于3.x大版本,攻击API和旧版本逻辑不同:
- 攻击类初始化时不需要传入Foolbox封装后的模型,仅需在调用攻击实例时将
fmodel作为第一个参数传入 - 你现有代码错误地将
fmodel传入了L2CarliniWagnerAttack的构造函数,调用攻击实例时第一个参数传的是图片张量features_to_test,导致攻击内部将图片张量识别为模型对象,尝试读取bounds属性时触发报错。
修复方案
步骤1:修改攻击初始化与调用逻辑
把原来的攻击相关代码替换为以下内容:
epsilons = np.linspace(0.01, 1, num=2) # 初始化攻击不需要传入模型 attack = fb.attacks.L2CarliniWagnerAttack() # 调用攻击时第一个参数传封装好的fmodel adversarials = attack( fmodel, features_to_test, labels_to_test, criterion=Misclassification(labels=labels_to_test), epsilons=epsilons )
步骤2:补充兼容性检查(可选但推荐)
- 确认你的
features数组数值范围符合你设定的bounds=(0,1),如果原始数据是0-255的像素值,需要先除以255归一化 - 可以将numpy数组转为TensorFlow张量避免隐式转换出错:
features_to_test = tf.convert_to_tensor(features[i,:], dtype=tf.float32) labels_to_test = tf.convert_to_tensor(labels[i,:], dtype=tf.int64)
内容的提问来源于stack exchange,提问作者mad
相关产品推荐
相关产品推荐

