如何从 C 中读取 Torch 张量
How to read Torch Tensor from C
我必须使用 Torch 框架训练一个卷积神经网络,然后用 C 编写相同的网络。
为此,我必须以某种方式从我的 C 程序中读取网络的学习参数,但我找不到一种方法来转换或写入 Torch 张量文件以使其在 C 中可读。
理想情况下,我想将张量转换为 C 中的双精度数组。
有人知道怎么做吗?提前致谢:)
I can't find a way to convert or write to a file the Torch Tensors to make them readable in C. Ideally, I want to convert the Tensors into arrays of double in 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
,你还需要知道你的网络结构(nb.layers,内核大小等参数)来知道有多少块 double
-s fread
.
作为示例(在 Lua 中),您可以查看 overfeat-torch (non official project) that illustrates how to read such a plain binary file: see the ParamBank 工具。
请记住,稳健的解决方案包括使用适当的二进制序列化格式,如 msgpack or Protocol Buffers,这将使此 export/import 过程干净且可移植。
--
这是一个玩具示例:
-- 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;
}
我必须使用 Torch 框架训练一个卷积神经网络,然后用 C 编写相同的网络。 为此,我必须以某种方式从我的 C 程序中读取网络的学习参数,但我找不到一种方法来转换或写入 Torch 张量文件以使其在 C 中可读。 理想情况下,我想将张量转换为 C 中的双精度数组。
有人知道怎么做吗?提前致谢:)
I can't find a way to convert or write to a file the Torch Tensors to make them readable in C. Ideally, I want to convert the Tensors into arrays of double in 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
,你还需要知道你的网络结构(nb.layers,内核大小等参数)来知道有多少块 double
-s fread
.
作为示例(在 Lua 中),您可以查看 overfeat-torch (non official project) that illustrates how to read such a plain binary file: see the ParamBank 工具。
请记住,稳健的解决方案包括使用适当的二进制序列化格式,如 msgpack or Protocol Buffers,这将使此 export/import 过程干净且可移植。
--
这是一个玩具示例:
-- 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;
}