使用自定义生成器在 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。问题出在其他地方。
无论如何,我把问题留在这里,这样代码可能对某人有用。
我在 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。问题出在其他地方。
无论如何,我把问题留在这里,这样代码可能对某人有用。