如何修复Python中“必须为占位符张量Placeholder_2提供float类型[?,1,680,1]值”错误
解决TensorFlow占位符拼接后的喂值错误问题
咱们来拆解你遇到的InvalidArgumentError——这个错误的核心原因是你拼接后的张量concat_adv依赖一个未被喂值的占位符x_vul,而model_eval函数只会自动喂x和y这两个占位符,根本不知道还有x_vul需要数据输入。
问题根源分析
看你的代码逻辑就能找到问题所在:
x_adv_sub是通过fgsm.generate(x_vul, **fgsm_par)生成的,它本质是依赖占位符x_vul的计算图节点;- 你把
x_adv_sub和常量张量x_test_rest_tf直接在计算图层面拼接成concat_adv; - 调用
model_eval时,传入model.get_logits(concat_adv)作为预测张量,但model_eval内部执行sess.run时,只会给x和y喂入x_test和y_test,完全没处理x_vul这个占位符,所以TensorFlow会报错说x_vul(也就是错误里的Placeholder_2)没有被喂值。
哪怕你拼接三个相同的x_adv_sub,只要x_adv_sub还依赖x_vul,这个问题就会一直存在。
解决方案:先生成对抗样本的数值,再拼接
你需要先把x_adv_sub对应的实际numpy数值计算出来,再和x_test_rest的数值拼接,而不是在计算图层面混合占位符和常量。具体步骤如下:
1. 先计算出x_adv_sub的实际numpy数组
# 喂入x_test_1(测试集的第一通道数据),得到实际的对抗样本数值 x_adv_sub_np = sess.run(x_adv_sub, feed_dict={x_vul: x_test_1})
2. 拼接numpy数组,得到完整的对抗样本
# x_test_rest本来就是numpy数组,直接用np.concatenate拼接 concat_adv_np = np.concatenate([x_adv_sub_np, x_test_rest], axis=1)
3. 修改model_eval的调用方式
现在直接用拼接好的numpy数组作为输入,传入model_eval,让它喂给黑盒模型的输入占位符x:
accuracy = model_eval(sess, x, y, model.get_logits(x), concat_adv_np, y_test, args=eval_params)
这里的关键是:model.get_logits(x)是基于黑盒模型的输入占位符x的计算图,model_eval会自动把concat_adv_np喂给x,这样就不会有未被喂值的占位符了。
完整修改后的关键代码片段
# 初始化FGSM攻击对象 fgsm_par = {'eps': 0.1, 'ord': np.inf, 'clip_min': 0., 'clip_max': 1.} fgsm = FastGradientMethod(model_sub, sess=sess) # 定义对抗样本的计算图节点 x_adv_sub = fgsm.generate(x_vul, **fgsm_par) # 计算出实际的对抗样本数值 x_adv_sub_np = sess.run(x_adv_sub, feed_dict={x_vul: x_test_1}) # 拼接得到完整的对抗测试集 x_test_rest = x_test[:,1:,:,:] concat_adv_np = np.concatenate([x_adv_sub_np, x_test_rest], axis=1) # 评估黑盒模型在对抗样本上的准确率 eval_params = {'batch_size': batch_size} accuracy = model_eval(sess, x, y, model.get_logits(x), concat_adv_np, y_test, args=eval_params) print('Test accuracy of oracle on adversarial examples generated using the substitute: ' + str(accuracy)) accuracies['bbox_on_sub_adv_ex'] = accuracy
这样修改后,就不会再出现占位符未喂值的错误了——我们把计算图层面的依赖转换成了实际的数值数组,直接喂给黑盒模型的输入占位符,逻辑就通顺了。
内容的提问来源于stack exchange,提问作者Iman Niazazari
相关产品推荐
相关产品推荐

