如何从C中读取Torch张量

我需要使用Torch框架训练卷积神经网络,然后在C中编写相同的网络。为此,我必须从我的C程序中读取网络的学习参数,但我找不到一种将Torch张量转换或写入文件以使它们在C中可读的方法。理想情况下,我希望将张量转换为C中的双精度数组。有谁知道如何做到这一点吗?提前感谢 :)

点赞
用户1688185
用户1688185

我找不到一种方法将Torch Tensors转换或写入文件,使它们在C中可读。理想情况下,我希望将Tensors转换为C中的双精度数组。

最基本(直接)的方法是在C中直接从之前写入二进制文件的数据中使用fread。在这种情况下,您通常会将每个层的权重和偏差(如果有)连接在一起。

在Lua / Torch方面,您可以使用File实用程序直接fwrite每个张量数据。例如,这是一个执行此操作的基本函数:

local fwrite = function(tensor, file)
  if not tensor then return false end
  local n = tensor:nElement()
  local s = tensor:storage()
  return assert(file:writeDouble(s) == n)
end

例如,如果m是一个包含权重的torch/nn模块,则可以按如下方式使用它:

local file = torch.DiskFile("net.bin", "w"):binary()
fwrite(m.weight, file)
fwrite(m.bias, file)

当然,您需要编写自己的逻辑以确保您fwrite和连接来自所有层的所有权重。在C端,除了net.bin之外,您还需要知道网络的结构(例如层数,像内核大小等的参数)以知道有多少块double-s可以使用fread

作为示例(在Lua中),您可以查看overfeat-torch(非官方项目),它说明了如何读取这样的纯二进制文件:请参见ParamBank工具。

请记住,一个强大的解决方案将包括使用合适的二进制序列化格式,例如msgpack协议缓冲区,以使此导出/导入过程干净可移植。

--

这是一个玩具示例:

-- EXPORT
require 'nn'

local fwrite = function(tensor, file)
  if not tensor then return false end
  local n = tensor:nElement()
  local s = tensor:storage()
  return assert(file:writeDouble(s) == n)
end

local m = nn.Linear(2, 2)

print(m.weight)
print(m.bias)

local file = torch.DiskFile("net.bin", "w"):binary()
fwrite(m.weight, file)
fwrite(m.bias, file)

然后在C中:

/* IMPORT */
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int
main(void)
{
  const int N = 2; /* nb. neurons */

  double *w = malloc(N*N*sizeof(*w)); /* weights */
  double *b = malloc(N*sizeof(*w));   /* biases */

  FILE *f = fopen("net.bin", "rb");
  assert(fread(w, sizeof(*w), N*N, f) == N*N);
  assert(fread(b, sizeof(*w), N, f) == N);
  fclose(f);

  int i, j;
  for (i = 0; i < N; i++)
    for (j = 0; j < N; j++)
      printf("w[%d,%d] = %f\n", i, j, w[N*i+j]);

  for (i = 0; i < N; i++)
      printf("b[%d] = %f\n", i, b[i]);

  free(w);
  free(b);

  return 0;
}
2015-05-05 16:29:50