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个衍生错误。
核心问题分析
- 变量命名冲突:代码中重复使用
self.q_target_total,先将其定义为placeholder,后续构建混合目标网络时又将其重新赋值为网络输出张量,导致计算图中loss_3的输入从预期的独立placeholder变成了依赖s_和ss_的网络输出,训练时未喂入这两个张量引发报错。 - 潜在数据类型不匹配:即使形状符合要求,若输入数据为整数类型,也会与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
相关产品推荐
相关产品推荐

