【问题标题】:What does x[x!=x] mean?x[x!=x] 是什么意思?
【发布时间】:2021-08-02 13:56:32
【问题描述】:

我不明白this line

lprobs[lprobs != lprobs] = torch.tensor(-math.inf).to(lprobs)

没有评论,是不是一些著名的 Python(或 PyTorch?)习语?有人可以解释它的含义,或者展示一种使意图更清晰的不同方式吗?

lprobspytorch Tensor,它可以包含任何大小的浮点类型(我怀疑这段代码是为了支持 int 或复杂类型)。据我所知,张量类不会覆盖__ne__ 函数。

【问题讨论】:

标签: python python-3.x pytorch


【解决方案1】:

它是fancy indexing with a boolean mask"trick" 的组合(尽管是设计意图),以检查NaNx != x 成立,如果xNaN(即对于浮点数)。

他们也可以写

lprobs[torch.isnan(lprobs)] = torch.tensor(-math.inf).to(lprobs)

或者,可能更习惯用语,使用torch.nan_to_num(但要注意后者对无穷大也有特殊行为)。

上述的非更新变体是

torch.where(torch.isnan(lprobs), torch.tensor(-math.inf), lprobs)

【讨论】:

  • 谢谢。我习惯在 R 中使用 is.nan,在 JavaScript 中使用 isNaN(),所以我自然更喜欢你的替代版本!乍一看,torch.nan_to_num() 看起来非常漂亮且具有描述性,但它也替换了 -inf 和 +inf,这(恕我直言)完全破坏了这个好主意(函数名称具有误导性而不是描述性,并且还可能存在效率问题)。
  • 嗯,对。我今天才偶然发现nan_to_num,并没有意识到它有这种行为。
猜你喜欢
  • 2020-03-18
  • 2015-03-24
  • 2020-10-02
  • 2011-05-27
  • 2018-05-03
  • 1970-01-01
  • 2020-09-24
  • 2015-12-30
  • 2018-11-24
相关资源
最近更新 更多