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

TensorFlow中ss_ placeholder未喂数据报错求助(数据形状已确认正确)

多智能体混合DQN网络中TensorFlow占位符ss_输入错误的解决方法

错误信息

self.ss_ = tf.placeholder(tf.float32, shape=self.X_shape, name='ss_')  # input Next State
Node: 'ss_'
发现2个根错误。
  (0) INVALID_ARGUMENT: 必须为placeholder张量'ss_'喂入dtype为float、形状为[?,30,30,2]的值
[[{{node ss_}}]]
[[loss/Mean_2/_83]]
  (1) INVALID_ARGUMENT: 必须为placeholder张量'ss_'喂入dtype为float、形状为[?,30,30,2]的值
[[{{node ss_}}]]
0个操作成功执行。
忽略0个衍生错误。

核心问题分析

  1. 变量命名冲突:代码中重复使用self.q_target_total,先将其定义为placeholder,后续构建混合目标网络时又将其重新赋值为网络输出张量,导致计算图中loss_3的输入从预期的独立placeholder变成了依赖s_和ss_的网络输出,训练时未喂入这两个张量引发报错。
  2. 潜在数据类型不匹配:即使形状符合要求,若输入数据为整数类型,也会与placeholder的tf.float32类型要求冲突。

解决步骤

1. 修复变量命名冲突(关键)

修改代码中的变量命名,避免覆盖placeholder:

  • 修改占位符定义:
    # 重命名占位符,避免与网络输出冲突
    self.q_target_total_ph = tf.placeholder(tf.float32, [None, self.n_actions], name='q_target_network')
    
  • 修改混合网络结构赋值:
    mix_target_params,q_target_total = mix_network(self.q1_next,self.q2_next,'mix_target')
    self.q_target_total_net = q_target_total  # 用新名称存储网络输出
    
  • 修改loss_3的定义:
    self.loss_3 = tf.reduce_mean(tf.squared_difference(self.q_target_total_ph, self.q_eval_total, name='TD_error_3'))
    
  • 修改混合网络训练的feed_dict:
    self.cost_mix = self.sess.run([self._train_op_3, self.loss_3],
                                  feed_dict={self.s: state_uav1_batch,
                                             self.ss: state_uav2_batch,
                                             self.q_target_total_ph: q_mix_target})
    

2. 强制转换输入数据类型为float32

在批次数据提取阶段,将所有状态数据转换为np.float32类型:

batch_memory = random.sample(self.memory, self.batch_size)
# 转换为numpy数组并指定float32类型
state_uav1_batch = np.array([data[0] for data in batch_memory], dtype=np.float32)
next_state_uav1_batch = np.array([data[3] for data in batch_memory], dtype=np.float32)
state_uav2_batch = np.array([data[4] for data in batch_memory], dtype=np.float32)
next_state_uav2_batch = np.array([data[7] for data in batch_memory], dtype=np.float32)

# 其余数据处理保持不变
action_uav1_batch = [data[1] for data in batch_memory]
reward_uav1_batch = [data[2] for data in batch_memory]
action_uav2_batch = [data[5] for data in batch_memory]
reward_uav2_batch = [data[6] for data in batch_memory]

reward_uav1_array = np.array(reward_uav1_batch)
reward_uav2_array = np.array(reward_uav2_batch)
stacked_rewards = np.vstack((reward_uav1_array, reward_uav2_array))
reward_total = np.sum(stacked_rewards, axis=0)

3. 验证计算图依赖(可选)

若问题仍存在,可通过以下代码查看ss_的依赖节点,确认是否有其他未处理的计算依赖:

print(tf.get_default_graph().get_tensor_by_name('ss_:0').consumers())

内容的提问来源于stack exchange,提问作者Krisdar001

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:24:54