如何在keras.model.fit_generator

时间:2019-04-13 08:26:24

标签: python-3.x keras

我是一名keras菜鸟,经过数天的努力,我在与keras一起工作时需要一些帮助。如果有任何歧义,请询问更多信息。

当前,我正在尝试修改a link中的代码。根据他们的网络模型,预期有2个输入张量。现在我很难将2个输入张量包含在它们提供的源代码中。

函数Boneage_prediction_model()启动2个输入张量的模型。

def Boneage_prediction_model():
    i1 = Input(shape=(500, 500, 1), name='input_img') # the 1st input tensor
    i2 = Input(shape=(1,), name='input_gender')       # the 2nd input tensor
    ... ...
    model = Model(inputs=(i1, i2), outputs=o)         # define model input 
                                                        with both i1 and i2
... ... 

#using model.fit_generator to instantiate
# datagen is initiated by keras.preprocessing.image.ImageDataGenerator
# img_train is the 1st network input, and boneage_train is the training label
# gender_train is the 2nd network input  
model.fit_generator(
                     (datagen.flow(img_train, boneage_train, batch_size=10), 
                      gender_train),
                      ... ...
                    ) 

如上所述,我尝试了多种方法将两者(datagen.flow(img_train,boneage_train,batch_size = 10)和sex_train)组合在一起,但失败了,并不断报告错误  例如以下

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

2 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,那么您希望一个网络有两个输入,合并输出有一个标签。在fit_generator的官方documentation中,有一个带有多个输入的示例。

使用字典映射多个输入将导致:

model.fit_generator(
                    datagen.flow({'input_img':img_train, 'input_gender':gender_train}, boneage_train, batch_size=10),
                      ... 
                    ) 

答案 1 :(得分:0)

在失败后,要么盲目地简单地将2个输入组合起来,要么像另一个贡献者建议的那样,使用字典来映射多个输入,我意识到这似乎是 datagen.flow 的问题使我无法结合使用图像张量输入和分类张量输入。 datagen.flow keras.preprocessing.image.ImageDataGenerator 启动,目的是预处理输入图像。因此,很可能在 datagen.flow 中合并两个输入是不合适的。另外,fit_generator似乎期望生成器类型的输入,尽管我不完全了解此函数的机制,但我在问题中提出的建议是错误的。

当我仔细查看由the team编写的其他代码时,我了解到需要编写一个生成器来将两者结合起来。解决方法如下,

def combined_generators(image_generator, gender_data, batch_size):
    gender_generator = cycle(batch(gender_data, batch_size))
    while True:
        nextImage = next(image_generator)
        nextGender = next(gender_generator)
        assert len(nextImage[0]) == len(nextGender)
        yield [nextImage[0], nextGender], nextImage[1]


def batch(iterable, n=1):
    l = len(iterable)
    for ndx in range(0, l, n):
        yield iterable[ndx:min(ndx + n, l)]


train_gen_wrapper = combined_generators(train_gen_boneage, train_df_boneage['male'], BATCH_SIZE_TRAIN)

model.fit_generator(train_gen_wrapper, ... )