And*_*dre 1 c lua luajit neural-network torch
我必须使用Torch框架训练卷积神经网络,然后在C中编写相同的网络.为此,我必须以某种方式从我的C程序中读取网络的学习参数,但我找不到办法将Torch Tensors转换或写入文件以使其在C中可读.理想情况下,我想将Tensors转换为C中的double数组.
有谁知道这是怎么做到的吗?提前致谢 :)
我找不到一种方法来转换或写入Torch Tensors的文件,使它们在C中可读.理想情况下,我想将Tensors转换为C中的double数组.
最基本(也是直接)的方法是直接fread在C中将先前写入二进制文件的数据.在这种情况下,您通常会连接每个图层的权重和偏差(如果有).
在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
Run Code Online (Sandbox Code Playgroud)
例如,如果m引用torch/nn包含权重的模块,您可以按如下方式使用它:
local file = torch.DiskFile("net.bin", "w"):binary()
fwrite(m.weight, file)
fwrite(m.bias, file)
Run Code Online (Sandbox Code Playgroud)
当然,您需要编写自己的逻辑来确保fwrite并连接所有图层的所有权重.在C方面,除此之外net.bin,您还需要了解网络的结构(nb.层,内核大小等参数),以了解double-s的块数fread.
作为一个例子(在Lua中),你可以看看overfeat-torch(非官方项目),它说明了如何阅读这样一个普通的二进制文件:参见ParamBank工具.
请记住,一个强大的解决方案将包括使用适当的二进制序列化格式,如msgpack或Protocol Buffers,这将使此导出/导入过程清洁和可移植.
-
这是一个玩具示例:
-- 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)
Run Code Online (Sandbox Code Playgroud)
然后在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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2185 次 |
| 最近记录: |