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

如何解决PyTorch中DQN智能体传递自定义类型观测的报错?

自定义观测转Tensor报错修复方案

问题原因

你要传递给智能体的观测包含自定义Task类对象数组、电池电量、资源量、信道增益,但PyTorch的Tensor只能处理数值型数据,无法直接将自定义Task对象转换为张量,因此执行state = T.tensor([observation],dtype=T.float32).to(self.q_eval.device)时触发错误must be real number, not Task。

修复步骤

1. 给Task类添加数值特征提取方法

把Task对象中对智能体决策有用的属性(比如优先级、截止时间、数据量等)转换成数值数组,在Task类里新增一个方法:

class Task:
    def __init__(self, priority, deadline, data_size):
        self.priority = priority
        self.deadline = deadline
        self.data_size = data_size
    
    # 提取当前Task的数值特征
    def get_numeric_features(self):
        return [self.priority, self.deadline, self.data_size]

2. 重构观测为全数值型结构

将原来包含Task对象的观测,转换成纯数值数组:

  • 遍历Task数组,逐个提取数值特征
  • 把任务特征、电池电量、资源量、信道增益整合为一个统一的数值数组(按需调整维度)

示例代码:

# 假设原观测是包含Task数组的字典或类似结构
original_observation = {
    "tasks": [Task(1, 10, 5), Task(2, 8, 3)],
    "battery": 70,
    "resource": 5,
    "channel_gain": 20
}

# 提取任务数值特征
task_features = [task.get_numeric_features() for task in original_observation["tasks"]]
# 扁平化特征并合并其他数值项
flattened_features = []
for feat in task_features:
    flattened_features.extend(feat)
flattened_features += [original_observation["battery"], original_observation["resource"], original_observation["channel_gain"]]

# 转换为numpy数组(确保是数值型)
observation = np.array(flattened_features, dtype=np.float32)

3. 处理动态任务数量(可选)

如果每次观测中的Task数量不固定,需要做填充处理保证观测长度一致,否则无法批量转换为Tensor:

MAX_TASK_NUM = 10  # 设定最大任务数
task_features = [task.get_numeric_features() for task in original_observation["tasks"]]

# 填充到最大任务数,不足的用默认值(比如0)填充
while len(task_features) < MAX_TASK_NUM:
    task_features.append([0, 0, 0])

# 后续合并特征步骤同上

4. 确认select_action的输入有效性

确保传入select_action函数的observation已经是全数值型的numpy数组,此时执行T.tensor([observation],dtype=T.float32)就不会再触发类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:33:10