python - 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
任何人都可以帮助我以这种方式工作而不会泄漏内存吗?提前感谢您的帮助!
使用 ubuntu 16.04编辑 了我在 tensorflow2.1 中运行的代码
解决方案
最后,通过将操作系统更改为 Windows 来解决此问题。如果有人在 Ubuntu 中有更明智的处理方式,欢迎提出建议或评论。
推荐阅读
- c# - 如何解决一段音频后的调用导致音频延迟?
- android - 我想下载 jdk windows 32 位
- android - 如何在片段附加到活动之前执行后台任务?
- javascript - 如何使用 JavaScript 创建自定义弹出窗口
- jquery - 如何使用 jQuery 从 HTML 节点中选择文本内容?
- reactjs - 模型打开正在工作,但关闭功能在反应 js 中不起作用
- php - 发送包含来自表单输入和数据库数据的混合数据的电子邮件
- java - .class 文件是字节码吗?或 .class 文件是否包含字节码?
- node.js - 护照的身份验证功能如何知道要验证哪个请求?
- android-studio - 如何将库添加到 android studio 而不是单个项目