我是一名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 ...
答案 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, ... )