neural - Cómo leer Torch Tensor de C
torch tutorial (1)
No puedo encontrar la manera de convertir o escribir en un archivo los Tensors de la antorcha para que sean legibles en C. Idealmente, quiero convertir los Tensors en matrices de doble en C.
La forma más básica (y directa) es fread
directamente en C los datos que ha escrito previamente en un archivo binario. En tal caso, normalmente concatenaría los pesos y los sesgos (si los hubiera) para cada capa.
En el lado de Lua / Torch, puede usar las utilidades de Archivo para literalmente fwrite
cada dato de tensor. Por ejemplo, aquí hay una función básica que hace eso:
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
Por ejemplo, si m
refiere a un módulo de torch/nn
que contiene pesos, lo usaría de la siguiente manera:
local file = torch.DiskFile("net.bin", "w"):binary()
fwrite(m.weight, file)
fwrite(m.bias, file)
Por supuesto, necesita escribir su propia lógica para asegurarse de que escribe y concatena todos los pesos de todas sus capas. En el lado C, además de net.bin
, también necesita conocer la estructura de su red (n. ° capas, parámetros como el tamaño del kernel, etc.) para saber cuántos bloques de double
para fread
.
Como un ejemplo (en Lua) puedes echar un vistazo a overfeat-torch (proyecto no oficial) que ilustra cómo leer un archivo binario tan simple: mira la herramienta ParamBank .
Tenga en cuenta que una solución robusta consistiría en utilizar un formato de serialización binario adecuado, como msgpack o Protocol Buffers, que haría este proceso de exportación / importación limpio y portátil.
-
Aquí hay un ejemplo de juguete:
-- 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)
Luego en 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;
}
Tengo que entrenar una red neuronal convolucional usando el framework Torch y luego escribir la misma red en C. Para hacerlo, tengo que leer de alguna manera los parámetros aprendidos de la red de mi programa C, pero no puedo encontrar una manera de convierta o escriba en un archivo los Tensors de Antorcha para que sean legibles en C. Idealmente, quiero convertir los Tensors en matrices de doble en C.
¿Alguien sabe cómo hacer eso? Gracias por adelantado :)