我正在使用带有keras API的Tensorflow 2.0。在某些情况下,我需要在同一程序执行中生成多个模型(例如,交叉验证类型的情况)。当我在不指定输入形状的情况下生成这些模型时,如下面的代码片段所示,没有内存泄漏。
import time
from tensorflow import keras
for _ in range(100):
model = keras.model.Sequential()
model.add(keras.kayers.Dense(120, activation='relu'))
model.compile(loss='binary_crossentropy',
optimizer=keras.optimizers.SGD())
time.sleep(0.1)
但是,如果我在添加模型的第一层时指定了输入形状,则似乎模型正在堆积在内存中,并且在不需要时不会被破坏。似乎执行时间也增加了很多。
import time
from tensorflow import keras
for _ in range(100):
model = keras.model.Sequential()
model.add(keras.kayers.Dense(120, activation='relu', input_shape=(10, 10)))
model.compile(loss='binary_crossentropy',
optimizer=keras.optimizers.SGD())
time.sleep(0.1)
我还使用Pympler
生成了两个代码段的所有对象的列表。
from pympler import muppy
from pympler import summary
...
all_objects = muppy.get_objects()
occupancy = summary.summarize(all_objects)
summary.print_(occupancy)
对于没有输入形状生成的模型,结果如下:
types | # objects | total size
======================================================================== | =========== | ============
<class 'str | 79278 | 14.02 MB
<class 'dict | 14468 | 6.93 MB
<class 'code | 25252 | 3.49 MB
<class 'type | 2582 | 2.57 MB
<class 'list | 8573 | 944.06 KB
<class 'tuple | 12079 | 796.21 KB
<class 'set | 732 | 466.12 KB
<class 'weakref | 4475 | 349.61 KB
<class 'abc.ABCMeta | 341 | 346.27 KB
<class 'tensorflow.core.framework.op_def_pb2.ArgDef | 3822 | 328.45 KB
<class 'google.protobuf.pyext.cpp_message.GeneratedProtocolMessageType | 369 | 320.16 KB
<class 'cell | 5921 | 277.55 KB
function (__init__) | 1694 | 224.98 KB
<class 'property | 2466 | 192.66 KB
<class 'wrapper_descriptor | 2353 | 183.83 KB
这是使用输入形状生成的模型的快照。
types | # objects | total size
================================================================ | =========== | ============
<class 'tuple | 296304 | 26.77 MB
<class 'dict | 71296 | 16.14 MB
<class 'str | 84828 | 14.54 MB
<class 'int | 395032 | 10.55 MB
<class 'list | 98027 | 9.89 MB
<class 'code | 25281 | 3.49 MB
<class 'type | 2587 | 2.58 MB
<class 'set | 2944 | 975.00 KB
<class 'tensorflow.python.framework.ops.Operation | 14100 | 771.09 KB
<class 'tensorflow.python.framework.ops.Operation._InputList | 14100 | 771.09 KB
<class 'tensorflow.python.framework.ops.Tensor | 14100 | 771.09 KB
<class 'tensorflow.python.pywrap_tensorflow_internal.TF_Output | 13200 | 721.88 KB
<class 'SwigPyObject | 14100 | 660.94 KB
<class 'collections.OrderedDict | 1262 | 622.22 KB
<class 'weakref | 6127 | 478.67 KB
我在做错什么吗?根据相关的keras documentation,应该以某种方式将输入形状提供给图层(关于输入形状的Tensorflow documentation表示如果该图层具有多个输入,则不需要该形状),但是,我的代码仍能正常工作,而无需指定输入形状。恐怕这可能是Tensorflow 2中的错误,但老实说,我真的不知道出什么问题。
注释
memory_profiler
包生成的。Pympler
包生成的。感谢您的支持。
答案 0 :(得分:0)
发布后已经很长时间了,但是我发现通过添加以下代码可以解决TensorFlow.Keras的大量内存泄漏:
tf.keras.backend.clear_session()
到每次迭代的开始。 TensorFlow 2.0,Windows,Python 3.6 / Anaconda