我必须使用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] = %fn", i, j, w[N*i+j]); for (i = 0; i < N; i++) printf("b[%d] = %fn", i, b[i]); free(w); free(b); return 0; }
以上就是c/c++开发分享如何从C读取火炬张量相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549668.html