9

StanfordNLP 的 TreeLSTM与具有 > 30K 实例的数据集一起使用时,会导致 LuaJit 出现“内存不足”错误。我正在使用LuaJit Data Structures解决这个问题。为了从 lua 的堆中获取数据集,需要将树放置在 LDS.Vector 中。

由于 LDS.Vector 保存 cdata,第一步是将 Tree 类型变成 cdata 对象:

local ffi = require('ffi')

ffi.cdef([[
typedef struct CTree {
   struct CTree* parent;
   int num_children;
   struct CTree* children [25];
   int idx;
   int gold_label;
   int leaf_idx;
} CTree;
]])

还需要在 read_data.lua 中进行一些小的更改来处理新的 cdata CTree 类型。到目前为止,使用 LDS 似乎是解决内存限制的合理方法。但是,CTree 需要一个名为“composer”的字段。

Composer 属于 nn.gModule 类型。要继续此解决方案,将涉及创建 nn.gModule 的 typedef 作为 cdata,包括为其成员创建 typedef。在继续之前,这似乎是正确的方向吗?有没有人有这个问题的经验?

4

1 回答 1

2

正如您所发现的,目前以 LuaJIT 堆友好的方式表示结构化数据有点痛苦。

在 Tree-LSTM 实现中,每个树表都包含一个指向 composer 实例的指针,主要是为了方便实现。

避免 typedef 的一种解决方法nn.gModule是使用现有idx字段来索引作曲家实例的表。在这种方法中,可以使用对 ( sentence_idx, node_idx) 唯一地标识作曲家实例的全局两级表中的作曲家。为避免内存问题,可以将当前的清理代码替换为将表中的相应索引设置为nil.

于 2015-08-03T05:37:59.833 回答