我有mean.npy文件,我必须将其转换为张量。我发现tf.convert_to_tensor可以做到这一点,但在C ++中找不到与之等效的东西。 有人知道C ++中的等效功能吗?
答案 0 :(得分:2)
没有提供将.npy
文件读入tensorflow::Tensor
的方法。首先,您需要读取该文件,虽然不容易,但也不太难,请检出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()
对于张量应该是正确的,尽管afaik对于新张量应该总是正确的。
另一个选择是先创建张量,然后使用其缓冲区(tensor.flat<float>().data()
)写入读取值。但是,这需要做更多的工作,因为您需要首先读取文件中的张量的形状(或事先对其进行修复),创建张量,然后将文件读取到其缓冲区中(在这种情况下,读取功能会接收指针,并且不分配任何内存。
编辑:我刚刚意识到您说“假设我有一个实用程序函数来读取.npy文件,并且它返回指向数组的浮点指针”,而不是向量。好的想法应该是相同的,您仍然可以像这样使用memcpy
或copy
:
std::copy(npy_ptr, npy_ptr + tensor.NumElements(), tensor.flat<float>().data());