【问题标题】:How to feed Keras model with multiple inputs through fit_generator如何通过 fit_generator 为 Keras 模型提供多个输入
【发布时间】:2019-03-02 15:42:50
【问题描述】:

我正在尝试解决一个机器学习问题,它同时接受图像输入和文本输入,为此我只是使用词袋模型进行矢量化。

我使用下面的函数为模型设置了两个生成器。这在很大程度上基于 simonst 在In keras, how to fit multiple input data with different type 中的回答,这真的很有帮助。

def create_generators(x_train_feat, x_val_feat, train_batch_size, val_batch_size):

    '''
    Training function
    '''

    train_datagen = ImageDataGenerator(
        featurewise_center=False,
        samplewise_center=False,
        featurewise_std_normalization=False,
        samplewise_std_normalization=False,
        zca_whitening=False,
        zca_epsilon=0,
        rotation_range=0.05,
        width_shift_range=0.05,
        height_shift_range=0.05,
        channel_shift_range=0,
        fill_mode='nearest',
        cval=0,
        vertical_flip=False,
        rescale=1./255,
        shear_range=0.,
        zoom_range=0.,
        horizontal_flip=False)


    val_datagen = ImageDataGenerator(
        rescale=1./255,
        featurewise_std_normalization=False,
        featurewise_center=False)


    train_generator=train_datagen.flow_from_dataframe(
        dataframe=subset_df_train,
        directory='./',
        x_col="image_path",
        y_col="Category_Name",
        batch_size=train_batch_size,
        seed=42,
        shuffle=True,
        class_mode="categorical",
        target_size=target_size)

    validation_generator = val_datagen.flow_from_dataframe(
        dataframe=subset_df_valid,
        directory="./",
        x_col="image_path",
        y_col="Category_Name",
        batch_size=val_batch_size,
        seed=42,
        shuffle=True,
        class_mode="categorical",
        target_size=target_size)

    def train_feat_gen(x_train_feat, train_batch_size):
        while True:
            for batch in range(len(x_train_feat) // train_batch_size + 1):
                if batch > max(range(len(x_train_feat) // train_batch_size)):
                    yield x_train_feat[batch*train_batch_size:]
                else:
                    yield x_train_feat[batch*train_batch_size:(1+batch)*train_batch_size]

    def val_feat_gen(x_val_feat, val_batch_size):
        while True:
            for batch in range(len(x_val_feat) // val_batch_size + 1):
                if batch > max(range(len(x_val_feat) // val_batch_size)):
                    yield x_val_feat[batch*val_batch_size:]
                else:
                    yield x_val_feat[batch*val_batch_size:(1+batch)*val_batch_size]

    def merge_generator(gen1, gen2):
        while True:
            X1 = gen1.__next__()
            X2 = gen2.__next__()
            yield [X1[0], X2], X1[1]



    final_train_gen = merge_generator(train_generator, train_feat_gen(x_train_feat, train_batch_size))
    final_val_gen = merge_generator(validation_generator, val_feat_gen(x_val_feat, val_batch_size))


    return (final_train_gen,final_val_gen)

final_train_gen,final_val_gen = create_generators(aux_train, aux_valid, 16, 16)

不幸的是,当我使用以下代码运行模型时,

hist = model.fit_generator(
    final_train_gen,
    steps_per_epoch=train_len // 16,
    epochs=3,
    validation_data=final_val_gen,
    validation_steps=valid_len // 16)

我遇到以下错误:ValueError: All input arrays (x) should have the same number of samples。得到数组形状:[(16, 128, 128, 3), (0, 2160)]。

不过,这只发生在第二个 epoch。第一个火车没问题。基于 (0,2160),看起来第二个 epoch 没有正确加载批次(我的批次大小为 16)。不幸的是,由于我对上述 create_generators 函数如何将两者合并的方式没有深入了解,因此我不太确定问题出在哪里,非常感谢您的帮助/指导。

道歉,因为代码是实验性的,因此有点混乱,并且缺少一些底层上下文 - 我希望我已经包含了足够的信息来理解这个问题。

提前致谢。

【问题讨论】:

    标签: python machine-learning keras


    【解决方案1】:

    您可以创建一个生成器来将每个图像与其关联的文本配对。只需将图像和文本的数据框或文件传递给您的 fit_generator 函数,并根据您拥有的标准(例如 ID)处理它们以匹配它们,并生成具有特定大小的数组,匹配您所需的批次尺寸。然后,您可以在代码中生成一个元组,但现在您可以保证批量大小匹配。 如果你真的想使用两个生成器,你可以看看这里: https://github.com/keras-team/keras/issues/8130

    【讨论】:

      猜你喜欢
      • 2019-09-17
      • 1970-01-01
      • 2021-02-07
      • 2019-08-28
      • 1970-01-01
      • 2021-03-04
      • 2020-11-15
      • 2020-01-12
      • 1970-01-01
      相关资源
      最近更新 更多