Keras自定义ImageDataGenerator

4

有没有办法在ImageDataGenerator中添加一些功能,让它可以接受文件名列表,并为每个小批量随机选取图像?

我知道我可以自定义一个继承ImageDataGenerator类的类,但我仍然不知道如何做到这一点的详细信息。

这是我所做的:

for epoch in range(epochs):
    print("epoch is: %d, total epochs: %f" % ((epoch+1), int(epochs)))
    print("prepare training batch...")
    train_batch = makebatch(filelist=self.train_files, img_num=img_num, slice_times=slice_times)
    print("prepare validation batch..")
    val_batch = makebatch(filelist=self.val_files, img_num=int(math.ceil(img_num*0.2)), slice_times=slice_times)

    x_train = train_batch
    y_train = x_train

    x_val = val_batch
    y_val = x_val

    print("generate training data...")

    train_datagen.fit(x_train)
    train_generator = train_datagen.flow(
        x=x_train,
        y=y_train,
        batch_size=16)
    val_datagen.fit(x_val)
    val_generator = val_datagen.flow(
        x=x_val,
        y=y_val,
        batch_size=16)

    print("start training..")

    history = model.fit_generator(
            generator=train_generator,
            steps_per_epoch=None,
            epochs=1,
            verbose=1,
            validation_data=val_generator,
            validation_steps=None,
            callbacks=self.callbacks)

我真正想要的是能够去除每批处理中的for循环和生成随机样本图像的生成器。

有人可以帮忙吗?


你是否有将所有图像分为训练集和验证集的路径? - talos1904
不,它们来自同一路径。 - Hao Chen
1个回答

3
这里,我要做的是:
假设我有一组路径存储在变量X_train、X_validation中,这些路径代表所有图像。标签被存储为y_train和y_validation。
首先,我会定义一个序列生成器(这来自于Keras网站)。
from skimage.io import imread
from skimage.transform import resize
import numpy as np

# Here, `x_set` is list of path to the images
# and `y_set` are the associated classes.    

class CIFAR10Sequence(Sequence):    
    def __init__(self, x_set, y_set, batch_size):
        self.x, self.y = x_set, y_set
        self.batch_size = batch_size

    def __len__(self):
        return int(np.ceil(len(self.x) / float(self.batch_size)))

    def __getitem__(self, idx):
        batch_x = self.x[idx * self.batch_size:(idx + 1) * self.batch_size]
        batch_y = self.y[idx * self.batch_size:(idx + 1) * self.batch_size]

        return np.array([
            resize(imread(file_name), (200, 200))
               for file_name in batch_x]), np.array(batch_y)

现在,我将定义用于训练和验证的生成器:
Xtrain_gen = detracSequence(X_train,y_train,batch_size=512) # you can choose your batch size.
Xvalidation_gen = detracSequence(X_validation,y_validation,batch_size=512)

现在,训练模型的最后一步。
model.fit_generator(generator=Xtrain_gen, epochs=100, validation_data=Xvalidation_gen,use_multiprocessing=True)

这将避免你使用for循环,非常高效,因为CPU可以同时获取数据。

我认为这可能与我正在寻找的相关。因为如果我运行我的脚本,它会耗尽内存。但是我们仍然可以使用ImageDataGenerator吗?因为我想使用它来进行图像数据增强。但是我希望添加一个功能,从文件路径列表中对每个批次进行随机数据采样。 - Hao Chen
还有一个问题是,我们如何设置idx?它是随机的吗? - Hao Chen
我会逐一回答: - talos1904
这将解决您的内存问题。是的,idx是随机的。 - talos1904
不要直接返回图像和标签批处理,而是可以在__get__方法中获取图像,进行转换,然后再返回它。基本上,不需要编写推导列表。 - talos1904
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接