簡體   English   中英

如何通過fit_generator為Keras模型提供多個輸入

[英]How to feed Keras model with multiple inputs through fit_generator

我正在嘗試解決一個既接受圖像輸入又接受文本輸入的機器學習問題,為此,我只是使用詞袋模型來向量化。

我使用下面的函數為模型設置了兩個生成器。 這很大程度上是基於simonst在In keras中的回答,即如何使具有不同類型的多個輸入數據適合 ,這確實很有幫助。

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:所有輸入數組(x)應該具有相同數量的樣本。 得到的陣列形狀:[(16,128,128,3),(0,2160)]。

但是,這僅發生在第二個時期。 第一輛火車可以。 基於(0,2160),看來第二個時期未正確加載批次(我的批次大小為16)。 不幸的是,由於我不太了解上面的create_generators函數如何將兩者合並,因此我不太確定問題出在哪里,因此非常感謝您的幫助/指導。

抱歉,代碼是實驗性的,因此有些混亂,缺少一些底層上下文-我希望我提供的信息足以理解該問題。

提前致謝。

您可以創建一個生成器,以將每個圖像與其關聯的文本配對。 只需將圖像和文本的數據框或文件傳遞給fit_generator函數,並對其進行處理,以使其根據您具有的條件(例如ID)進行匹配,並產生具有一定大小的數組,即可與所需批次匹配尺寸。 然后,您可以像在代碼中那樣生成一個元組,但是現在您可以保證批處理大小匹配。 如果您真的想使用兩個生成器,可以在這里查看: https : //github.com/keras-team/keras/issues/8130

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM