似乎 pytorch 确实有/公开了finfo
链接,但我在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)似乎是私有的,因为它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 链接并使用上述定义?