use*_*214 9 c lua stanford-nlp torch lstm
当StanfordNLP的TreeLSTM与具有> 30K实例的数据集一起使用时,会导致LuaJit错误地显示"Not Enough Memory".我正在使用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;
]])
Run Code Online (Sandbox Code Playgroud)
在read_data.lua中还需要进行一些小的更改来处理新的cdata CTree类型.到目前为止,使用LDS似乎是解决内存限制的合理方法; 但是,CTree需要一个名为"composer"的字段.
Composer的类型为nn.gModule.继续使用此解决方案将涉及将nn.gModule的typedef创建为cdata,包括为其成员创建typedef.在继续之前,这似乎是正确的方向吗?有没有人遇到过这个问题?
小智 2
正如您所发现的,以 LuaJIT 堆友好的方式表示结构化数据目前有点痛苦。
在 Tree-LSTM 实现中,每个树表都保存一个指向 Composer 实例的指针,主要是为了实现方便。
避免 typedef 的一种解决方法nn.gModule是使用现有idx字段对 Composer 实例表进行索引。在这种方法中,(sentence_idx, node_idx)对可以用于在作曲家实例的全局两级表中唯一地标识作曲家。为了避免内存问题,当前的清理代码可以替换为将表中相应索引设置为 的行nil。