【问题标题】:How to use fit_generator with multiple inputs如何将 fit_generator 与多个输入一起使用
【发布时间】:2018-08-30 11:51:12
【问题描述】:

是否可以有两个fit_generator?

我正在创建一个有两个输入的模型, 模型配置如下图。

标签 Y 对 X1 和 X2 数据使用相同的标签。

以下错误会继续出现。

检查模型输入时出错:您传递给模型的 Numpy 数组列表不是模型预期的大小。预期的 查看 2 个数组,但得到了以下 1 个数组的列表: [数组([[[[0.75686276, 0.75686276, 0.75686276], [0.75686276, 0.75686276, 0.75686276], [0.75686276, 0.75686276, 0.75686276], ..., [0.65882355, 0.65882355, 0.65882355...

我的代码如下所示:

def generator_two_img(X1, X2, Y,batch_size):
    generator = ImageDataGenerator(rotation_range=15,
                                   width_shift_range=0.2,
                                   height_shift_range=0.2,
                                   shear_range=0.2,
                                   zoom_range=0.2,
                                   horizontal_flip=True,
                                   fill_mode='nearest')

    genX1 = generator.flow(X1, Y, batch_size=batch_size)
    genX2 = generator.flow(X2, Y, batch_size=batch_size)

    while True:
        X1 = genX1.__next__()
        X2 = genX2.__next__()
        yield [X1, X2], Y
  """
      .................................
  """
hist = model.fit_generator(generator_two_img(x_train, x_train_landmark, 
                y_train, batch_size),
                steps_per_epoch=len(x_train) // batch_size, epochs=nb_epoch,
                callbacks = callbacks,
                validation_data=(x_validation, y_validation),
                validation_steps=x_validation.shape[0] // batch_size, 
                `enter code here`verbose=1)

【问题讨论】:

  • 您的数据集是否包含许多类?因为我尝试了 sloution 但它不起作用,因为我有不同的类,我想创建一个模型来获取来自同一类的两个图像。而且我不知道该怎么做:/

标签: python machine-learning neural-network keras generator


【解决方案1】:

试试这个生成器:

def generator_two_img(X1, X2, y, batch_size):
    genX1 = gen.flow(X1, y,  batch_size=batch_size, seed=1)
    genX2 = gen.flow(X2, y, batch_size=batch_size, seed=1)
    while True:
        X1i = genX1.next()
        X2i = genX2.next()
        yield [X1i[0], X2i[0]], X1i[1]

3 个输入的生成器:

def generator_three_img(X1, X2, X3, y, batch_size):
    genX1 = gen.flow(X1, y,  batch_size=batch_size, seed=1)
    genX2 = gen.flow(X2, y, batch_size=batch_size, seed=1)
    genX3 = gen.flow(X3, y, batch_size=batch_size, seed=1)
    while True:
        X1i = genX1.next()
        X2i = genX2.next()
        X3i = genX3.next()
        yield [X1i[0], X2i[0], X3i[0]], X1i[1]

【讨论】:

  • 我不太明白最后一步yield [X1i[0], X2i[0]], X1i[1]的语法。例如,我怎样才能为 3 个输入做到这一点?
  • @Thanh Nguyen 刚刚为 3 个输入制作了一个生成器
  • 顺便说一下,应该是list,而不能是tuple(我掉进了这个坑……)你可以通过源代码:github.com/keras-team/keras/blob/master/keras/engine/…
  • 为什么生成器只返回X1i[1]而不返回X2i[1]Xi2[1]
  • X1[1] 是标签,因为 X1 和 X2 中的标签是相同的,所以你可以返回其中任何一个
【解决方案2】:

我有一个针对TimeseriesGenerator 的多个输入的实现,我已经对其进行了调整(不幸的是,我无法对其进行测试)以使用ImageDataGenerator 来满足这个示例。我的方法是从keras.utils.Sequence 为多个生成器构建一个包装类,然后实现它的基本方法:__len____getitem__

from keras.preprocessing.image import ImageDataGenerator
from keras.utils import Sequence


class MultipleInputGenerator(Sequence):
    """Wrapper of 2 ImageDataGenerator"""

    def __init__(self, X1, X2, Y, batch_size):
        # Keras generator
        self.generator = ImageDataGenerator(rotation_range=15, 
                                            width_shift_range=0.2,
                                            height_shift_range=0.2,
                                            shear_range=0.2,
                                            zoom_range=0.2,
                                            horizontal_flip=True, 
                                            fill_mode='nearest')

        # Real time multiple input data augmentation
        self.genX1 = self.generator.flow(X1, Y, batch_size=batch_size)
        self.genX2 = self.generator.flow(X2, Y, batch_size=batch_size)

    def __len__(self):
        """It is mandatory to implement it on Keras Sequence"""
        return self.genX1.__len__()

    def __getitem__(self, index):
        """Getting items from the 2 generators and packing them"""
        X1_batch, Y_batch = self.genX1.__getitem__(index)
        X2_batch, Y_batch = self.genX2.__getitem__(index)

        X_batch = [X1_batch, X2_batch]

        return X_batch, Y_batch

生成器实例化后,您可以将此生成器与model.fit_generator() 一起使用。

【讨论】:

  • 嘿,你在什么地方有 TimeseriesGenerator 的原始代码吗?
  • 没有人,对不起,很久以前... :(我只备份最新的项目
  • @JVGD 我的这篇文章迟到了几个月,但是,你知道如何让这个生成器与超过 1 个工人一起工作吗?我的生成器基于您的帖子(进行了修改),但是每当我在model.fit() 中为工作人员赋值时,它都会引发一些未知错误。提前谢谢你!!
  • @Wazaki,不是几个月,而是几年,自从我改用 pytorch 已经快 1 年半了,所以我现在已经脱离了这个网格。很抱歉没能帮到你:((但如果你能认真使用pytorch,我们收获很大,我们搬家了
  • @JVGD 哦,对不起,我的意思是说“年”,但写成了“月”。谢谢 !!我看看能不能改用 Pytorch。
猜你喜欢
  • 2016-12-22
  • 2023-03-31
  • 2019-04-20
  • 2021-03-04
  • 1970-01-01
  • 2018-08-20
  • 2023-03-15
  • 2013-08-13
  • 1970-01-01
相关资源
最近更新 更多