Neural network Dynet中的CPU内存分配失败

Neural network Dynet中的CPU内存分配失败,neural-network,nlp,dynet,Neural Network,Nlp,Dynet,我不知道为什么我的内存不足。以戈德堡为例,我所做的只是换一条线: 分数,表达式=自我评估(正确的句子) 并在其周围添加一个for循环以重复K次: for k in xrange(K): scores, exprs = self.__evaluate(conll_sentence, True) # do something 然后在中,我执行以下操作: samples_out = np.random.normal(0,0.001, (1, self.hidden_units)) s

我不知道为什么我的内存不足。以戈德堡为例,我所做的只是换一条线:

分数,表达式=自我评估(正确的句子)

并在其周围添加一个for循环以重复K次:

for k in xrange(K):
    scores, exprs = self.__evaluate(conll_sentence, True)
    # do something
然后在中,我执行以下操作:

samples_out = np.random.normal(0,0.001, (1, self.hidden_units))
samples_FOH = np.random.normal(0,0.001,(self.hidden_units, self.ldims * 2))
samples_FOM = np.random.normal(0,0.001,(self.hidden_units, self.ldims * 2))
samples_Bias = np.random.normal(0,0.001, (self.hidden_units))

XoutLayer = self.outLayer.expr()+inputTensor(samples_out)
XhidLayerFOH = self.hidLayerFOH.expr()+inputTensor(samples_FOH)
XhidLayerFOM = self.hidLayerFOM.expr()+inputTensor(samples_FOM)
XhidBias = self.hidBias.expr()+inputTensor(samples_Bias)

if sentence[i].headfov is None:
    sentence[i].headfov = XhidLayerFOH * concatenate([sentence[i].lstms[0], sentence[i].lstms[1]])
if sentence[j].modfov is None:
    sentence[j].modfov  = XhidLayerFOM * concatenate([sentence[j].lstms[0], sentence[j].lstms[1]])

output = XoutLayer * self.activation(sentence[i].headfov + sentence[j].modfov + XhidBias)
return output

从本质上讲,上述块中发生的事情是首先生成正态分布的噪声,然后将其添加到训练值中。但似乎在这一过程中的某个地方,所有生成的值都保留在内存中,并且内存不足。有人知道为什么吗?

Dynet表达式会一直保留在内存中,直到下次调用
续订\u cg()

因此,修复方法是在循环的每次迭代后调用它,前提是您已经从计算图中检索到了所需的所有信息

旁注:进行简单加法时,例如:

XoutLayer = self.outLayer.expr()+inputTensor(samples_out)
实际上没有执行任何添加。您只需创建一个新表达式,并指定如何从其他表达式对其求值。当调用
XoutLayer
上的
.forward()
(或
.value()
等)或其计算依赖于
XoutLayer
的表达式时,将执行实际计算。 因此,dynet需要为当前计算图中的所有表达式分配内存