在Android Neural Network API中,文档说:从文件描述符创建共享内存对象。
但是在TFL源代码上找不到任何指定此文件格式的地方:
location.cc:
MMAPAllocation::MMAPAllocation(const char* filename,
ErrorReporter* error_reporter)
: Allocation(error_reporter), mmapped_buffer_(MAP_FAILED) {
mmap_fd_ = open(filename, O_RDONLY);
if (mmap_fd_ == -1) {
error_reporter_->Report("Could not open '%s'.", filename);
return;
}
struct stat sb;
fstat(mmap_fd_, &sb);
buffer_size_bytes_ = sb.st_size;
mmapped_buffer_ =
mmap(nullptr, buffer_size_bytes_, PROT_READ, MAP_SHARED, mmap_fd_, 0);
if (mmapped_buffer_ == MAP_FAILED) {
error_reporter_->Report("Mmap of '%s' failed.", filename);
return;
}
}
nnapi_delegate.cc
NNAPIAllocation::NNAPIAllocation(const char* filename,
ErrorReporter* error_reporter)
: MMAPAllocation(filename, error_reporter) {
if (mmapped_buffer_ != MAP_FAILED)
CHECK_NN(ANeuralNetworksMemory_createFromFd(buffer_size_bytes_, PROT_READ,
mmap_fd_, 0, &handle_));
}
这意味着,TFL将打开文件,然后将此文件提供给NNAPI。我需要的是存储张量的此文件的格式是什么,像TFL格式一样是flatbuffers文件吗?
编辑:
这是来自NNAPI文档的示例:
ANeuralNetworksMemory* mem1 = NULL;
int fd = open("training_data", O_RDONLY);
ANeuralNetworksMemory_createFromFd(file_size, PROT_READ, fd, 0, &mem1);
该文件
training_data
,其内容必须如何构造为NNAPI才能理解? 最佳答案
ANeuralNetworksMemory_createFromFd(file_size,PROT_READ,fd,0,&mem1)-此API将模型文件映射到ANeuralNetworksMemory。
映射的地址存储在mem1中(通过引用传递!)
此外,通过指向适当的偏移值读取存储在mem1(ANeuralNetworksMemory对象)中的训练值,并将其复制到NeuralNetwork模型的张量中。
ANeuralNetworksModel_setOperandValueFromMemory(model_, tensor0, mem1, offset, size);
ANeuralNetworksModel_setOperandValueFromMemory(model_, tensor1, mem1, offset+size, size);
tensor0-指向偏移量
tensor1-指向offset + size