RuntimeError:“exp”未为“torch.LongTensor”实现

Posted

技术标签:

【中文标题】RuntimeError:“exp”未为“torch.LongTensor”实现【英文标题】:RuntimeError: "exp" not implemented for 'torch.LongTensor' 【发布时间】:2019-03-26 02:54:37 【问题描述】:

我正在关注本教程:http://nlp.seas.harvard.edu/2018/04/03/attention.html 从“Attention Is All You Need”论文中实现 Transformer 模型。

但是我收到以下错误: RuntimeError: "exp" 没有为 'torch.LongTensor' 实现

这是 PositionalEnconding 类中导致错误的行:

div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model))

这里建造时:

pe = PositionalEncoding(20, 0)

有什么想法吗??我已经尝试将其转换为 Tensor Float 类型,但没有奏效。

我什至下载了带有随附文件的整个笔记本,但错误似乎仍然存在于原始教程中。

任何想法可能导致此错误?

谢谢!

【问题讨论】:

代码中的d_model是什么? @AkhileshPandey d_model 是初始化 PositionalEncoding 类的参数之一:def __init__(self, d_model, dropout, max_len=5000):也可以在这里找到整个笔记本:github.com/harvardnlp/annotated-transformer/blob/master/…跨度> 查看代码后,我发现 d_model 的值在某一时刻是 20。使用这个值我发现这条线对我来说很好 尝试将其转换为其他类型,例如 a= a.type(torch.float36) 然后调用 torch.exp(a) 我运行了代码,它对我来说很好用。看看你是否复制正确。 【参考方案1】:

我碰巧也跟着这个教程。

对我来说,我刚刚得到了torch.arange 来生成浮点型张量

来自

position = torch.arange(0, max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model))

position = torch.arange(0., max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0., d_model, 2) * -(math.log(10000.0) / d_model))

只是一个简单的修复。但现在它对我有用。火炬expsin 可能以前支持LongTensor,但现在不支持了(不太确定)。

【讨论】:

非常感谢,欢迎来到 Stack Overflow ! :)【参考方案2】:

似乎torch.arange 返回一个LongTensor,尝试torch.arange(0.0, d_model, 2) 强制torch 返回一个FloatTensor

【讨论】:

您好,感谢您的回复!但这似乎不起作用:( @noob 你确定这条线会产生这个错误吗?您能否验证(在调试中)torch.arage(0, d_model, 2)dtype 确实是 float 而不是 long【参考方案3】:

@shai 给出的建议对我有用。我修改了PositionalEncodinginit 方法,在两个地方使用了0.0

position = torch.arange(0.0, max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0.0, d_model, 2) * -(math.log(10000.0) / d_model))

【讨论】:

对我来说也是(相同的教程;代码复制到 *.py 脚本):需要将 0, 交换为 0.0,,如上所述。 :-)【参考方案4】:

对我来说,安装pytorch == 1.7.1 解决了这个问题。

【讨论】:

【参考方案5】:

就像 Rubens 说的,在更高版本的 Pytorch 中,你不需要担心这些东西。我可以在桌面的 1.8.0 Pytorch 上轻松运行它,但在我的服务器的 1.2.0 Pytorch 中无法通过它。不同版本之间有一些不兼容的地方。

【讨论】:

以上是关于RuntimeError:“exp”未为“torch.LongTensor”实现的主要内容,如果未能解决你的问题,请参考以下文章

未为 MyApp.MyStruct 实现协议可枚举

未为 InvoiceTemplateGet 类型定义方法 execute()

未为 API 侦听器调用 NSFetchedResultsController 委托

未为调试版本生成 Firebase 消息令牌

未为“对象”类型定义运算符“[]”[重复]

未为 UITextView 触发委托协议功能