You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Python中“必须为占位符张量Placeholder_2提供float类型[?,1,680,1]值”错误

解决TensorFlow占位符拼接后的喂值错误问题

咱们来拆解你遇到的InvalidArgumentError——这个错误的核心原因是你拼接后的张量concat_adv依赖一个未被喂值的占位符x_vul,而model_eval函数只会自动喂x和y这两个占位符,根本不知道还有x_vul需要数据输入。

问题根源分析

看你的代码逻辑就能找到问题所在:

  1. x_adv_sub是通过fgsm.generate(x_vul, **fgsm_par)生成的,它本质是依赖占位符x_vul的计算图节点;
  2. 你把x_adv_sub和常量张量x_test_rest_tf直接在计算图层面拼接成concat_adv;
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:37:08