我有mean.npy文件,我必须将其转换为张量。我发现tf.convert_to_tensor可以做到这一点,但是在C++中找不到与之等效的东西。
有人知道C++中的等效功能吗?
最佳答案
没有提供将.npy
文件读取为tensorflow::Tensor
的方法。首先,您需要读取文件,这不是很简单,但也不太难,请 check out NPY format documentation。一旦有了它,最简单的事情就是将数据复制到张量:
// Existing NPY reading function, assuming float type
bool read_npy(const char* file, std::vector<float>& npy_values, std::vector<int64_t>& shape);
// Read file
std::vector<float> npy_values;
std::vector<int64_t> shape;
if (!read_npy("data.npy", npy_values, shape))
{
// error...
}
// Make tensor
tensorflow::TensorShape tensorShape;
for (int64_t dim : shape)
{
tensorShape.AddDim(dim);
}
tensorflow::Tensor tensor(DT_FLOAT, tensorShape);
// Copy data
std::copy(npy_values.begin(), npy_values.end(), tensor.flat<float>().data());
// Or with memcpy
std::memcpy(tensor.flat<float>().data(), npy_values.data(), tensor.NumElements() * sizeof(float));
请注意,这假设NPY数据缓冲区像TensorFlow张量那样处于行主要顺序,并且我认为
IsAligned()
对于张量应为true,尽管afaik对于新张量应始终为true。另一个选择是先创建张量,然后使用其缓冲区(
tensor.flat<float>().data()
)写入读取值。但是,这需要做更多的工作,因为您需要首先读取文件中的张量的形状(或事先对其进行修复),创建张量,然后将文件读取到其缓冲区中(在这种情况下,读取功能会接收指针而不分配任何内存)。编辑:我刚刚意识到你说“假设我有一个实用程序函数来读取.npy文件,它返回一个指向数组的浮点指针”,而不是 vector 。好主意应该是一样的,您仍然可以像下面这样使用
memcpy
或copy
:std::copy(npy_ptr, npy_ptr + tensor.NumElements(), tensor.flat<float>().data());