Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Tensorflow图像分类-耗尽我的记忆_Python 3.x_Image Processing_Tensorflow - Fatal编程技术网

Python 3.x Tensorflow图像分类-耗尽我的记忆

Python 3.x Tensorflow图像分类-耗尽我的记忆,python-3.x,image-processing,tensorflow,Python 3.x,Image Processing,Tensorflow,我正在尝试写一个小程序,它能够将某些图片分类。我在主代码中创建了一个包含图片的列表,并将它们以循环的形式传递给函数。代码运行得非常好,除了它不能释放内存,而且每次迭代程序都会使用更多的内存,直到完全崩溃 已经尝试在函数中使用“gc.collect()”强制它清除内存,但这没有帮助。在检查一个文件后,内存是否应该自动清除,或者我是否遗漏了任何内容 def classify_pictures(self, files): os.environ['TF_CPP_MIN_LOG_LEVEL']

我正在尝试写一个小程序,它能够将某些图片分类。我在主代码中创建了一个包含图片的列表,并将它们以循环的形式传递给函数。代码运行得非常好,除了它不能释放内存,而且每次迭代程序都会使用更多的内存,直到完全崩溃

已经尝试在函数中使用“gc.collect()”强制它清除内存,但这没有帮助。在检查一个文件后,内存是否应该自动清除,或者我是否遗漏了任何内容

def classify_pictures(self, files):

    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

        # Read the image_data
        image_data = tf.gfile.FastGFile(files, 'rb').read()

        # Loads label file, strips off carriage return
        label_lines = [line.rstrip() for line
                   in tf.gfile.GFile("tf_files/retrained_labels.txt")]

        # Unpersists graph from file
        with tf.gfile.FastGFile("tf_files/retrained_graph.pb", 'rb') as f:
            graph_def = tf.GraphDef()
            graph_def.ParseFromString(f.read())
            _ = tf.import_graph_def(graph_def, name='')

        with tf.Session() as sess:
            # Feed the image_data as input to the graph and get first prediction
            softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')

            predictions = sess.run(softmax_tensor, \
                               {'DecodeJpeg/contents:0': image_data})

            # Sort to show labels of first prediction in order of confidence
            top_k = predictions[0].argsort()[-len(predictions[0]):][::-1]

        for each_picture in range(0, 10):

            human_string = label_lines[top_k[0]]

            if human_string == "selfie":
                return ("selfie")

            if "passport" in human_string:
                return("passport")

            if "statement" in human_string:
                return("bill")

如果在循环中调用此函数,则每次迭代都会重建计算图,当然,前面的图也仍然存在。这就是使用所有内存的原因

要解决此问题,只需在循环内执行
会话.run()
调用


通常,在编写Tensorflow代码时,应始终尝试将生成图形的代码与执行图形的代码分开。在您的情况下,这两个函数都是在一个函数中执行的,该函数被多次调用,因此每次都会重建一个新的图形。

谢谢,Alexander!我已经将部分代码(“with tf.gfile.FastGFile”和“label_lines”部分)移出了函数/循环,这确实有很大帮助,但仍然没有完全解决这个问题。它大大降低了内存使用率,但对于处理大量文件,它最终还是会在某个时候使用所有内存。有什么想法吗?我确信我仍然遗漏了一些东西?如果没有看到您的完整代码,我无法确定,但我怀疑这可能是Python泄漏,而不是Tensorflow。您可能希望尝试使用Python只将一组图像加载到CPU RAM中,并在一次又一次地对该图像集执行预测。如果这解决了内存泄漏问题,您就知道这是Python泄漏(假设您谈论的内存是CPU而不是GPU内存)。再次感谢。我还删除了:#将tf.Session()作为sess#softmax_张量=。。。。看来这解决了问题。我会再试试,但现在看起来不错。还有一个问题。我真的不明白这为什么会导致内存泄漏。会话结束时不应该自动释放内存吗?不客气。我不确定,但我认为这可能正是Python的方式。我的直觉告诉我,最好不要在每次循环迭代中重新创建一个新的会话对象(这是将
与tf.session()一起用作sess:
,而只需在循环之前使用
sess=tf.session()
创建一次会话对象,并在每次循环迭代中重用它。