Tensorflow 模型无法完全删除,但仍占用 CPU 内存



我正致力于优化神经网络架构和超调器。出于这个原因,我构建了一个For循环来发送超测量仪,并在每次迭代中构建/训练/评估一个新模型。像这样的例子:

for k in range(10):
#full_model() function is used to build the new model with 
#hyperparameters l1,l2,l3
md=full_model(l1,l2,l3)
md.compile(optimizer='SGD',loss='categorical_crossentropy',metrics=['accuracy'])
md.fit(trads,validation_data=vds,epochs=3)
teloss,teacc=md.evaluate(teds)

我试图通过在循环中添加以下代码,完全删除创建的模型,并在循环中评估后释放占用的CPU内存:

del md
gc.collect()
tf.keras.backend.clear_session()
tf.compat.v1.reset_default_graph()

但我观察到,在循环中添加上述代码后,CPU内存将不会释放,并且在迭代过程中内存的使用量不断增加。最后,由于内存泄漏,进程将被系统终止。

顺便说一句,我使用了一些自定义层,它们将子层和张量保存在列表中。在构建整个模型的过程中,这种自定义层也包含在列表中。我不确定这是否是造成这个问题的原因之一。像这样的示例persudo代码:

class custom_layer(tf.keras.layers.Layer):
def __init__(self):
self.layer_li=[layers.conv(),layers.Maxpool2d()....]
...
def call(self,inputs):
self.out1,self.out2=self.layer_li[0](inputs),self.layer_li[1(inputs)
return [self.out1,self.out2]

class build_model(tf.keras.Model):
def __init__(self):
sub_layers_list=[sublayer_1(),sublayer2...]
def call(self,inputs):
self.x=self.sub_layers_list[0](inputs)
for k in range(1,len(sub_layers_list)):
self.out=sub_layers_list[k](self.out)
return self.out



有人能帮我这样工作而不漏记忆吗?提前感谢您的帮助!

编辑我的代码在tensorflow2.1中使用ubuntu 16.04 运行

最后,通过将操作系统更改为Windows来解决此问题。如果有人在Ubuntu中有更明智的处理方法,欢迎提出一些建议或评论。

最新更新