【问题标题】:GPU performance during feature extraction (Tesla K80)特征提取期间的 GPU 性能 (Tesla K80)
【发布时间】:2018-12-23 17:27:57
【问题描述】:

我正在使用以下代码从大约 4000 张图像中提取特征,这些图像分为 30 个类别。

 for i, label in enumerate(train_labels):
        cur_path = train_path + "/" + label
        count = 1
        for image_path in glob.glob(cur_path + "/*.jpg"):
            img = image.load_img(image_path, target_size=image_size)
            x = image.img_to_array(img)
            x = np.expand_dims(x, axis=0)
            x = preprocess_input(x)
            feature = model.predict(x)
            flat = feature.flatten()
            features.append(flat)
            labels.append(label)
            print ("[INFO] processed - " + str(count))
        count += 1
    print ("[INFO] completed label - " + label)

虽然,我的整个数据集要大得多,多达 80,000 张图像。查看我的 GPU 内存时,这段代码在 Keras (2.1.2) 中适用于 4000 张图像,但几乎占用了我的 Tesla K80 的所有 5gig 视频 RAM。我想知道是否可以通过更改 batch_size 来提高性能,或者这段代码的工作方式对我的 GPU 来说太重了,我应该重写它吗?

谢谢!

【问题讨论】:

  • 您的意思是 80,000 张图片吗?能否请您更正一下是的。
  • 是的,我糟糕的 80,000。但是在使用 8000 张图像时已经出现了问题。我在想我应该使用 ImageDataGenerator,因为更改 batch_size 并不能解决我的问题。

标签: python-3.x keras gpu feature-extraction tesla


【解决方案1】:

有两种可能的解决方案。

1)我假设您以 Numpy 数组格式存储图像。这是非常占用内存的。相反,将其存储为普通列表。当应用程序需要将其转换为 numpy 数组时。就我而言,它将内存消耗减少了 10 倍。如果您已经将其存储为列表,那么 2 解决方案可能会解决您的问题。

2)将结果存储在块中,并在将其输入另一个模型时使用生成器。

chunk_of_features=[]
chunk_of_labels=[]
i=0
for i, label in enumerate(train_labels):
        cur_path = train_path + "/" + label
        count = 1
        for image_path in glob.glob(cur_path + "/*.jpg"):
            i+=1
            img = image.load_img(image_path, target_size=image_size)
            x = image.img_to_array(img)
            x = np.expand_dims(x, axis=0)
            x = preprocess_input(x)
            feature = model.predict(x)
            flat = feature.flatten()
            chunk_of_features.append(flat)
            chunk_of_labels.append(label)
            if i==4000:
                with open('useSomeCountertoPreventNameConflict','wb') as output_file:
                    pickle.dump(chunk_of_features,output_file)
                with open('useSomeCountertoPreventNameConflict','wb') as output_file:
                    pickle.dump(chunk_of_labels,output_file)
                chunk_of_features=[]
                chunk_of_labels=[]
                i=0

            print ("[INFO] processed - " + str(count))
        count += 1
    print ("[INFO] completed label - " + label)

【讨论】:

  • 实际上,我已经将它们存储在一个列表中,最后将它们保存为数组。因此,您建议将它们存储为列表(即 Pickle?),然后在需要时加载 pickle、转换为数组等等?我是否正确地看到您的第二个解决方案包含分块并保存为点亮。我不得不承认我对 Python 领域还很陌生,所以请注意我的愚蠢问题。感谢您的帮助!
  • 解决方案 2 怎么样?会不会有什么问题?
  • 我现在正在尝试,给我几分钟!
  • 是否有可能来自:'cur_path' 的所有内容都有太多缩进?它运行但真的很慢,我认为打印已经关闭,可能还有压痕。让我再看一会儿。缩进可能是我的错误,因为我粘贴了错误的代码。
  • 它现在以正常速度运行。不过我得比较一下内存使用情况,等我知道了再反馈给你
猜你喜欢
  • 2016-11-08
  • 1970-01-01
  • 2021-12-29
  • 2019-08-11
  • 2014-04-03
  • 2011-07-25
  • 2017-09-12
  • 2023-02-22
  • 2018-08-20
相关资源
最近更新 更多