libtorch 中的 numpy.spacing(1) 等价于什么?

What's the equivalent of numpy.spacing(1) in libtorch?

pytorch 似乎 have/expose finfo link,但我在 libtorch 中找不到它。它甚至在 libtorch 中可用吗?使用 torch.finfo 我可以轻松做到:

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

我认为是 np.spacing(1) 的 counterpart/equivalent 但是在 libtorch 中我不能做同样的事情因为我找不到 finfo class 的任何痕迹.我该怎么办?

有一个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());
      });
}

但是,在相应的header中,有一个外部声明:

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 以某种方式 link 你的目标并利用上面的定义?

事实证明,我们可以简单地使用std::nextafter就可以了。最近还添加了 torch::nextafter (#42580) 并在后台使用它!

因此,如果您不使用 nighlybuilds,并且在 1.7 发布之前,您可以简单地使用 std::nextafter 就好了!关于 THPFinfo:

THPFInfo and THPFInfo_eps exist to make this information available in python

Source