gpt4 book ai didi

python - 从 pandas 数据帧加载 Keras 中的批量图像

转载 作者:行者123 更新时间:2023-12-01 20:05:09 25 4
gpt4 key购买 nike

我有一个包含两列的 pandas 数据框,一列具有图像路径,另一列具有字符串类标签。

我还编写了以下函数,这些函数从数据帧加载图像,重新规范化它们并将类标签转换为 one-hot 向量。

def prepare_data(df):
data_X, data_y = df.values[:,0], df.values[:,1]

# Load images
data_X = np.array([np.array(imread(fname)) for fname in data_X])

# Normalize input
data_X = data_X / 255 - 0.5

# Prepare labels
data_y = np.array([label2int[label] for label in data_y])
data_y = to_categorical(data_y)

return data_X, data_y

我想将此数据帧提供给 Keras CNN,但整个数据集太大,无法一次加载到内存中。

此站点中的其他答案告诉我,为此目的我应该使用 Keras ImageDataGenerator,但老实说,我不明白如何从文档中执行此操作。

将延迟加载批处理中的数据提供给模型的最简单方法是什么?

如果它是 ImageDataGenerator,如何创建一个 ImageDataGenerator 来初始化 Dataframe 并通过我的函数传递批处理以创建适当的 numpy 数组?如何使用 ImageDataGenerator 拟合模型?

最佳答案

ImageDataGenerator 是一个高级类,允许从多个源(从 np 数组、从目录...)生成数据,并且包括要执行的实用程序函数图像增强等。

更新

截至keras-preprocessing 1.0.4,ImageDataGenerator 附带 flow_from_dataframe method这解决了你的情况。它需要 dataframedirectory 参数定义如下:

dataframe: Pandas dataframe containing the filenames of the
images in a column and classes in another or column/s
that can be fed as raw target data.
directory: string, path to the target directory that contains all
the images mapped in the dataframe.

因此不再需要自己实现。

<小时/>

原始答案如下

在您的情况下,使用您所描述的数据帧,您还可以编写自己的自定义生成器,该生成器利用 prepare_data 函数中的逻辑作为更简约的解决方案。最好使用 Keras 的 Sequence 对象来执行此操作,因为它允许使用多处理(如果您使用的是 GPU,这将有助于避免 GPU 出现瓶颈)。

您可以查看docsSequence 对象上,它包含一个实现示例。最终,您的代码将是这样的(这是样板代码,您必须添加 label2int 函数或图像预处理逻辑等细节):

from keras.utils import Sequence
class DataSequence(Sequence):
"""
Keras Sequence object to train a model on larger-than-memory data.
"""
def __init__(self, df, batch_size, mode='train'):
self.df = df # your pandas dataframe
self.bsz = batch_size # batch size
self.mode = mode # shuffle when in train mode

# Take labels and a list of image locations in memory
self.labels = self.df['label'].values
self.im_list = self.df['image_name'].tolist()

def __len__(self):
# compute number of batches to yield
return int(math.ceil(len(self.df) / float(self.bsz)))

def on_epoch_end(self):
# Shuffles indexes after each epoch if in training mode
self.indexes = range(len(self.im_list))
if self.mode == 'train':
self.indexes = random.sample(self.indexes, k=len(self.indexes))

def get_batch_labels(self, idx):
# Fetch a batch of labels
return self.labels[idx * self.bsz: (idx + 1) * self.bsz]

def get_batch_features(self, idx):
# Fetch a batch of inputs
return np.array([imread(im) for im in self.im_list[idx * self.bsz: (1 + idx) * self.bsz]])

def __getitem__(self, idx):
batch_x = self.get_batch_features(idx)
batch_y = self.get_batch_labels(idx)
return batch_x, batch_y

您可以传递此对象来训练您的模型,就像自定义生成器一样:

sequence = DataSequence(dataframe, batch_size)
model.fit_generator(sequence, epochs=1, use_multiprocessing=True)

如下所述,不需要实现洗牌逻辑。只需在 fit_generator() 调用中将 shuffle 参数设置为 True 即可。来自 docs :

shuffle: Boolean. Whether to shuffle the order of the batches at the beginning of each epoch. Only used with instances of Sequence (keras.utils.Sequence). Has no effect when steps_per_epoch is not None.

关于python - 从 pandas 数据帧加载 Keras 中的批量图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51843149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com