如何从C读取火炬张量

我必须使用Torch框架训练卷积神经网络,然后在C中编写相同的网络。为此,我必须以某种方式从我的C程序中读取网络的学习参数,但我找不到办法将Torch Tensors转换或写入文件以使其在C中可读。理想情况下,我想将Tensors转换为C中的double数组。

有谁知道这是怎么做到的吗? 提前致谢 :)

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

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

在Lua / Torch端,您可以使用File实用程序来逐字写入每个张量数据。 例如,这是一个基本function:

 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) 

当然,您需要编写自己的逻辑,以确保您从所有图层中获取并连接所有权重。 在C方面,除了net.bin ,您还需要知道网络的结构(nb。层,参数,如内核大小等),以了解要传输多少块double -s。

作为一个例子(在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  #include  #include  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; }