如何从C中读取Torch张量
2015-5-5 14:43:3
收藏:0
阅读:108
评论:1
我需要使用Torch框架训练卷积神经网络,然后在C中编写相同的网络。为此,我必须从我的C程序中读取网络的学习参数,但我找不到一种将Torch张量转换或写入文件以使它们在C中可读的方法。理想情况下,我希望将张量转换为C中的双精度数组。有谁知道如何做到这一点吗?提前感谢 :)
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我找不到一种方法将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; }