生成器“类型错误:‘生成器’对象不是迭代器”

由于 RAM 内存的限制,我按照这些说明构建了一个生成器,该生成器绘制小批量并将它们传递到 Keras 的 fit_generator 中。但是即使我继承了序列,Keras 也无法使用多处理准备队列。


这是我的多处理生成器。


class My_Generator(Sequence):

    def __init__(self, image_filenames, labels, batch_size):

        self.image_filenames, self.labels = image_filenames, labels

        self.batch_size = batch_size


    def __len__(self):

        return np.ceil(len(self.image_filenames) / float(self.batch_size))


    def __getitem__(self, idx):

        batch_x = self.image_filenames[idx * self.batch_size:(idx + 1) * self.batch_size]

        batch_y = self.labels[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)

主要功能:


batch_size = 100

num_epochs = 10

train_fnames = []

mask_training = []

val_fnames = [] 

mask_validation = []

我希望生成器按 ID 在不同线程中分别读取文件夹中的批次(其中 ID 看起来像:原始图像的 {number}.csv 和蒙版图像的 {number}_label.csv)。我最初构建了另一个更优雅的类,将每个数据存储在一个 .h5 文件而不是目录中。但是同样的问题被屏蔽了。因此,如果你有一个代码来做到这一点,我也是接受者。


for dirpath, _, fnames in os.walk('./train/'):

    for fname in fnames:

        if 'label' not in fname:

            training_filenames.append(os.path.abspath(os.path.join(dirpath, fname)))

        else:

            mask_training.append(os.path.abspath(os.path.join(dirpath, fname)))

for dirpath, _, fnames in os.walk('./validation/'):

    for fname in fnames:

        if 'label' not in fname:

            validation_filenames.append(os.path.abspath(os.path.join(dirpath, fname)))

        else:

            mask_validation.append(os.path.abspath(os.path.join(dirpath, fname)))



my_training_batch_generator = My_Generator(training_filenames, mask_training, batch_size)

my_validation_batch_generator = My_Generator(validation_filenames, mask_validation, batch_size)

num_training_samples = len(training_filenames)

num_validation_samples = len(validation_filenames)


繁星淼淼
浏览 198回答 3
3回答

喵喔喔

我收到了同样的错误,说我的生成器类继承自keras.utils.Sequenceobject is not an iterator。既没有添加__next__方法也没有改变keras.utils.Sequence和tf.keras.utils.Sequence帮助。对我来说,我的__getitem__课程没有正确实施。在尝试使用所有数据时,最后一批是部分批次,我没有正确处理。当我正确处理这个问题时,object is not an iterator错误就消失了。因此,我建议您仔细检查您的__getitem__()实现并考虑index传递给__getitem__().

慕尼黑8549860

我已经想通了。我的模型是from keras.models import Model 但是生成器是从这扩展而来的,class DataGenerator(tf.keras.utils.Sequence): 这会导致错误!因此,只需将 Generator 更改class DataGenerator(tf.keras.utils.Sequence)为class DataGenerator(keras.utils.Sequence):
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python