首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANeuralNetworksMemory_createFromFd是如何工作的?

ANeuralNetworksMemory_createFromFd是如何工作的?
EN

Stack Overflow用户
提问于 2018-02-21 21:03:02
回答 2查看 391关注 0票数 0

在Android神经网络中,API文档说:从文件描述符创建共享内存对象。

但是,在TFL源代码中,我找不到指定此文件格式的任何位置:

allocation.cc:

代码语言:javascript
复制
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

代码语言:javascript
复制
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格式的平面缓冲文件吗?

编辑:这是NNAPI文档中的一个示例:

代码语言:javascript
复制
ANeuralNetworksMemory* mem1 = NULL;
int fd = open("training_data", O_RDONLY);
ANeuralNetworksMemory_createFromFd(file_size, PROT_READ, fd, 0, &mem1);

这个文件training_data,它的内容必须如何被NNAPI理解?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-08 10:56:23

ANeuralNetworksMemory_createFromFd(file_size,PROT_READ,fd,0,&mem1) -这个API将模型文件映射到ANeuralNetworksMemory。

映射地址存储在mem1 (通过引用传递!)

此外,存储在mem1 (ANeuralNetworksMemory对象)中的经过训练的值通过指向适当的偏移值并复制到NeuralNetwork模型的张量来读取。

代码语言:javascript
复制
 ANeuralNetworksModel_setOperandValueFromMemory(model_, tensor0, mem1, offset, size);
 ANeuralNetworksModel_setOperandValueFromMemory(model_, tensor1, mem1, offset+size, size);
  • tensor0 -指向偏移量
  • tensor1 -指向offset+size
票数 1
EN

Stack Overflow用户

发布于 2018-04-06 23:56:17

模型文件的加载和解析分别进行。这使得在不同的内存模型和不同的文件格式之间更容易混合和匹配。它还可以将这些构建块用于其他功能,比如从文件中加载输入。

ANeuralNetworksMemory_createFromFd()只是用来将模型文件加载到内存中。

FlatBufferModel::BuildFromFile()获取表示模型的分配(内存块)。这就是调用ANeuralNetworksMemory_createFromFd()的地方。然后,它对一个FlatBufferModel对象进行新闻报道。这将调用位于模式子目录中的tflite::GetModel()。架构子目录将加载到内存中的.tflite模型中的平面缓冲区模型反序列化。

当调用NNAPIDelegate::Invoke()时,使用模式模型对象在Android层中使用ANeuralNetworksModel_addOperand()之类的调用来构建模型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48915426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档