在keras层中指定`input_shape`时,Tensorflow 2.0泄漏内存

时间:2019-05-19 18:03:37

标签: python keras memory-leaks tensorflow2.0

我正在使用带有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)

Total memory with no input shape specified

但是,如果我在添加模型的第一层时指定了输入形状,则似乎模型正在堆积在内存中,并且在不需要时不会被破坏。似乎执行时间也增加了很多。

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)

Total memory with input shape specified

我还使用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包生成的。
  • 使用了Python 3.7.1。
  • 操作系统是Linux基本(Ubuntu)。

感谢您的支持。

1 个答案:

答案 0 :(得分:0)

发布后已经很长时间了,但是我发现通过添加以下代码可以解决TensorFlow.Keras的大量内存泄漏:

tf.keras.backend.clear_session()

到每次迭代的开始。 TensorFlow 2.0,Windows,Python 3.6 / Anaconda