使用自定义生成器在 Keras 中进行预测

Making prediction in Keras using a custom generator

我在 TensorFlow 中有一个图像分类器模型,我想用它进行预测。我创建了一个自定义生成器以避免同时将其全部加载到 RAM 中。

def load_and_preprocess_image(url_path_x):
        with requests.Session() as s:
            request_x=s.get(url_path_x).content
        img = Image.open(BytesIO(request_x))
        img = img.convert('RGB')
        img = img.resize((224,224), Image.NEAREST)
        img = tensorflow.keras.preprocessing.image.img_to_array(img)
        return(img)

def prediction_generator(urls_x):
    for url_x in urls_x:
        try:
            yield load_and_preprocess_image(path_x=url_x, is_url=True).reshape(1,224,224,3)
        except:
            yield load_and_preprocess_image(path_x=dummy_image_path, is_url=True).reshape(1,224,224,3)

my_path_gen = prediction_generator(df['url_path_column'])
preds_probas = model_i.predict(my_path_gen, batch_size=1, verbose=0, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False)

但是,我的代码似乎正在消耗大量 RAM,就好像代码同时将所有图像加载到 RAM 中一样。我的自定义生成器有什么问题吗?

我绝对不是这个主题的专家,但生成器不应该与 __len____getitem__ 一起工作吗? 来自 this link

    def __len__(self):
        'Denotes the number of batches per epoch'
        return int(np.floor(len(self.list_IDs) / self.batch_size))

    def __getitem__(self, index):
        'Generate one batch of data'
        # Generate indexes of the batch
        indexes = self.indexes[index*self.batch_size:(index+1)*self.batch_size]

        # Find list of IDs
        list_IDs_temp = [self.list_IDs[k] for k in indexes]

        # Generate data
        X, y = self.__data_generation(list_IDs_temp)

        return X, y

生成器非常好,他们没有使用过多的 RAM。问题出在其他地方。

无论如何,我把问题留在这里,这样代码可能对某人有用。