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))
只是一个简单的修复。但现在它对我有用。火炬exp
和sin
可能以前支持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 给出的建议对我有用。我修改了PositionalEncoding
的init
方法,在两个地方使用了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”实现的主要内容,如果未能解决你的问题,请参考以下文章
未为 InvoiceTemplateGet 类型定义方法 execute()