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

esp = torch.finfo(torch.float).eps
我相信它是np.spacing(1)的对应物/等效物,但是在libtorch中,我无法做相同的事情,因为我找不到finfo类的任何痕迹。我该怎么办?

最佳答案

有一个TypeInfo.cpp模块(pytorch / torch / csrc / TypeInfo.cpp),不幸的是,您提到的方法(torch.finfo(torch.float).eps)似乎是私有(private)的,因为它在翻译单元中标记为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声明:
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并利用上面的定义?

关于c++ - libtorch中的numpy.spacing(1)等效于什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63536093/

10-11 22:01
查看更多