似乎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/