1

似乎 pytorch 确实有/公开了finfo 链接,但我在libtorch. 它甚至可以在 libtorch 中使用吗?使用 torch.finfo 我可以轻松做到:

esp = torch.finfo(torch.float).eps

我相信这是对应物/等价物,np.spacing(1)但在 libtorch 中我不能做同样的事情,因为我找不到任何finfo课程痕迹。我该怎么办?

4

2 回答 2

1

有一个 TypeInfo.cpp 模块(pytorch/torch/csrc/TypeInfo.cpp),不幸的是,您提到的方法(torch.finfo(torch.float).eps)似乎是私有的,因为它static在翻译单元中被标记:

static PyObject* THPFInfo_eps(THPFInfo* self, void*) {
  return AT_DISPATCH_FLOATING_AND_COMPLEX_TYPES_AND2(at::kHalf, at::ScalarType::BFloat16,
      self->type, "epsilon", [] {
        return PyFloat_FromDouble(
            std::numeric_limits<
                at::scalar_value_type<scalar_t>::type>::epsilon());
      });
}

但是,在相应的标题中,有一个 extern 声明:

extern PyTypeObject THPFInfoType;

THPFInfoType似乎是一个实例,其中包含以下函数的指针:THPFInfo_str. 另一方面,此函数打印以下内容:

PyObject* THPFInfo_str(THPFInfo* self) {
  std::ostringstream oss;
  oss << "finfo(resolution=" << PyFloat_AsDouble(THPFInfo_resolution(self, nullptr));
  oss << ", min=" << PyFloat_AsDouble(THPFInfo_min(self, nullptr));
  oss << ", max=" << PyFloat_AsDouble(THPFInfo_max(self, nullptr));
  oss << ", eps=" << PyFloat_AsDouble(THPFInfo_eps(self, nullptr));
  oss << ", tiny=" << PyFloat_AsDouble(THPFInfo_tiny(self, nullptr));
  oss << ", dtype=" << PyUnicode_AsUTF8(THPFInfo_dtype(self, nullptr)) << ")";

  return THPUtils_packString(oss.str().c_str());
}

这显然打印eps了信息。也许您可以以某种方式将您的目标与 TypeInfo.cpp 链接并使用上述定义?

于 2020-08-22T22:08:34.933 回答
0

事实证明,我们可以简单地使用std::nextafter就好了。并且torch::nextafter最近添加了(#42580)并在引擎盖下使用它!

所以如果你不使用 nighlybuilds,直到 1.7 发布,你可以简单地使用std::nextafter就好了!关于THPFinfo

THPFInfo 和 THPFInfo_eps 的存在是为了使这些信息在 python 中可用

来源

于 2020-08-25T08:11:10.177 回答