Как включить множественный входной тензор в keras.model.fit_generator - PullRequest
0 голосов
/ 13 апреля 2019

Я новичок в керасе, и мне нужна помощь в работе с керасом после многих дней борьбы с этой проблемой.Пожалуйста, попросите дополнительную информацию, если есть какая-то двусмысленность.

В настоящее время я пытаюсь изменить код из ссылки . Согласно их сетевой модели, ожидается 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) и гендер_трейн), как указано выше, но это не помогло, и сообщения об ошибках оставались такими, как следующие,

ValueError: Ошибка при проверке ввода модели: список массивов Numpy, передаваемых в вашу модель, не соответствует размеру, ожидаемому моделью.Ожидается увидеть 2 массива (ов), но вместо этого получен следующий список из 1 массива: [массив ([[[[- - 0.26078433], [-0.26078433], [-0.26078433], ..., [-0.26078433], [-0,26078433], [-0,26078433]], [[-0,26078433], [-0,26 ...

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

После того, как не удалось слепо объединить 2 входа, или, как предложил другой участник, использовать словарь для сопоставления нескольких входов, я понял, что, похоже, проблема datagen.flow , который сохраняет я от объединения тензорного ввода изображения и категориального тензорного ввода. datagen.flow инициируется keras.preprocessing.image.ImageDataGenerator с целью предварительной обработки входных изображений. Поэтому есть вероятность, что нецелесообразно объединять 2 входа внутри datagen.flow . Кроме того, fit_generator, похоже, ожидает ввода типа генератора, и то, что я сделал, как предложено в моем вопросе, неверно, хотя я не до конца понимаю механизм этой функции.

Когда я внимательно посмотрел в других кодах, написанных командой , я понял, что мне нужно написать генератор, чтобы объединить их. Решение заключается в следующем,

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, ... )
0 голосов
/ 14 апреля 2019

Если я вас правильно понимаю, вы хотите иметь два входа для одной сети и одну метку для комбинированного выхода. В официальной документации для fit_generator есть пример с несколькими входами.

Использование словаря для сопоставления нескольких входов приведет к:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...