PyTorch 错误与缩放器浮动的预期对象,而是得到缩放器长的对象

Posted

技术标签:

【中文标题】PyTorch 错误与缩放器浮动的预期对象,而是得到缩放器长的对象【英文标题】:PyTorch error with expected object of scaler float but instead got object of scaler Long 【发布时间】:2019-05-30 03:39:33 【问题描述】:

所以我正在学习关于 Udemy(人工智能 a-z)的课程,但我遇到了一个错误,其中显示以下内容: 返回地图(lambda x:变量(torch.cat(x,0)),样本) RuntimeError: 标量类型 Float 的预期对象,但在位置 #1“张量”的序列参数中的序列元素 1 获得标量类型 Long

元素似乎每次都在变化,所以我不知道问题可能出在哪里 有人可以帮我解决这个问题吗?

我已经尝试修改上一行(示例)以查看是否需要将其转换为 Long,但它不起作用,除非做错了

包含 ai.py 的第 43-45 行

def sample(self, batch_size):
    samples = zip(*random.sample(self.memory, batch_size))
    return map(lambda x: Variable(torch.cat(x, 0)), samples)

包含 ai.py 的第 74-87 行(调用示例方法的内容)

def update(self, reward, new_signal):
    new_state = torch.Tensor(new_signal).float().unsqueeze(0)
    self.memory.push((self.last_state, new_state, 
    torch.LongTensor([int(self.last_action)]), 
    torch.tensor([self.last_reward])))
    action = self.select_action(new_state)
    if len(self.memory.memory) > 100:
        batch_state, batch_next_state, batch_reward, batch_action = 
        self.memory.sample(100)
    self.learn(batch_state, batch_next_state, batch_reward, batch_action)
    self.last_action = action
    self.last_state = new_state
    self.last_reward = reward
    self.reward_window.append(reward)
    if len(self.reward_window) > 1000:
        del self.reward_window[0]
    return action

说实话,我希望程序的其余部分能够运行,但它似乎总是在这里崩溃,抱歉我不能更具体地说明我的期望,那是因为我不知道这是我第一次制作一个合适的人工智能

【问题讨论】:

我不知道代码没有格式化什么 试试torch.cat(x, 0.)吧。它不喜欢int 【参考方案1】:

根据https://pytorch.org/docs/stable/torch.html#torch.cat,您的x 中的return map(lambda x: Variable(torch.cat(x, 0)), samples) 中的所有张量都需要具有相同的类型。但是你在

中混合了张量类型
self.memory.push((self.last_state, new_state, 
    torch.LongTensor([int(self.last_action)]), 
    torch.tensor([self.last_reward])))

所以这就是它抛出异常的原因。

【讨论】:

以上是关于PyTorch 错误与缩放器浮动的预期对象,而是得到缩放器长的对象的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch基础与神经网络

在 Pytorch 中为 HDF5 文件创建数据集和数据加载器时出现问题:没有足够的值来解包(预期 2,得到 1)

Pytorch模型训练实用教程学习笔记:四优化器与学习率调整

PyTorch - RuntimeError:后端 CPU 的预期对象,但为参数 #2 'weight' 获得了后端 CUDA

设备类型 cuda 的预期对象,但在 Pytorch 中获得了设备类型 cpu

我更改了标量类型 float 的预期对象,但在 Pytorch 中仍然得到 Long