R属性"。环境"在nnet包中消耗大量的RAM

时间:2015-04-06 23:30:38

标签: r attributes nnet

我有一段代码正在使用nnet包,我有兴趣计算一些不同的神经网络模型&然后将所有模型保存到磁盘(使用save())。

我遇到的问题是"术语"神经网络中的元素具有属性" .Environment"最终达到数百兆字节,而模型的其余部分只有几千字节。 (一旦删除拟合值和残差)

此外,删除" .Environment"在使用“预测”模型时,属性似乎不会导致问题。

有没有人知道R或nnet使用此属性做了什么?有没有人见过这样的东西?

1 个答案:

答案 0 :(得分:1)

tl; dr:这是好的,除了一些非常特殊的情况

背景

R中的.Environment属性包含对R closure (通常为公式的上下文的引用函数)已定义。 R环境是一个包含变量值的商店,类似于列表。这允许公式引用这些变量,例如:

> f = function(g) return(y ~ g(x))
> form = f(exp)
> lm(form, list(y=1:10, x=log(1:10)))
...
Coefficients:
(Intercept)     g(x)
3.37e-15        1.00e+00

在此示例中,公式form(如果定义为y~exp(x),则为g提供exp的值。为了能够找到g的值(函数f的参数),公式需要保持对函数f调用内构造的环境的引用

您可以使用attributes()environment()函数查看附加到公式的环境,如下所示:

> attributes(form)
$class
[1] "formula"

$.Environment
<environment: R_GlobalEnv>

> environment(form)
<environment: R_GlobalEnv>

您的问题

我相信你正在使用nnet()函数变量和公式(而不是矩阵),即

> nnet(y ~ x1 + x2, ...)

不幸的是,即使您的公式没有引用任何公式,R也会保留整个环境(包括定义公式所定义的所有变量)。语言无法轻易告诉您在环境中使用或不使用的内容。

One solution是明确保留环境所需的部分。特别是,如果您的公式没有引用环境中的任何内容(这是最常见的情况),则可以安全地删除它。

我建议您在致电nnet之前从公式中删除环境,如下所示:

    form = y~x + z
    environment(form) = NULL
    ...
    result = nnet(form, ...)