Как правильно спроектировать генератор данных для модели Keras с несколькими входами?

Я пытаюсь разработать модель keras с несколькими входами. Мы работаем с изображениями математических узлов (128х128х3). Я создал модель, которая требует трех входных данных. Три входа будут

1). Невернутое изображение узла

2). Тот же узел, что и 1, но повернут вокруг оси Y на 90 градусов

3). Тот же узел, что и узел 1, но повернутый вокруг оси x на 90 градусов

Модель хорошая, компилируется правильно. Проблема, с которой я столкнулся, заключается в том, что я использую fit_generator для обучения своей модели, и мне кажется, что я не могу заставить свой генератор данных работать должным образом. Вот мой код для моего генератора данных:

def DataGen(in1,in2,in3,in1_label,in2_label,in3_label, batch_size):

    in1 = np.array(in1)
    in1 = np.reshape(in1, (in1.shape[0],128,128,3))

    in2 = np.array(in2)
    in2 = np.reshape(in2, (in2.shape[0],128,128,3))

    in3 = np.array(in3)
    in3 = np.reshape(in3, (in3.shape[0],128,128,3))

    L = len(in1)

    batch_start = 0
    batch_end = batch_size


    gen = ImageDataGenerator(rescale=1.0/255)

    genX1 = gen.flow(in1, in1_label,  batch_size=batch_size, seed=1)
    genX2 = gen.flow(in2, in2_label, batch_size=batch_size, seed=1)
    genX3 = gen.flow(in3, in3_label, batch_size=batch_size, seed=1)
    #this line is just to make the generator infinite, keras needs that    
    while True:

        limit = min(batch_end, L)
        #in1
        X1i = genX1.next()
        print(X1i[0].shape)
        #in2
        X2i = genX2.next()
        #in3
        X3i = genX3.next()
        #print(Y.shape)
        #print(Y1.shape)
        #print(Y2.shape)
        label = np.concatenate([X1i[1],X2i[1],X3i[1]])
        #print(label.shape)
        #print(X1i[1].shape)
        yield [X1i[0],X2i[0],X3i[0]],np.array(label) #a tuple with two numpy arrays with batch_size samples     

        batch_start += batch_size   
        batch_end += batch_size

        if batch_start > L - batch_size:
            batch_start = 0
            batch_end = batch_size

Если я запустил нейронную сеть с этим кодом, она выдаст следующее сообщение об ошибке:

Input arrays should have the same number of samples as target arrays. Found 30 input samples and 90 target samples.

Это заставляет меня думать, что я не должен объединять метку, а просто возвращать список меток вместе со списком партий ... Если я получу следующее

yield [X1i[0],X2i[0],X3i[0]],[X1i[1],X2i[1],X3i[1]]

Я получаю следующее сообщение об ошибке:

Error when checking model target: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 array(s), but instead got the following list of 3 arrays: [array([[0., 1., 0.],
   [0., 0., 1.],
   [1., 0., 0.],
   [0., 1., 0.],
   [1., 0., 0.],
   [1., 0., 0.],
   [0., 0., 1.],
   [1., 0., 0.],
   [0., 1., 0.],
   [0....

Поэтому я не знаю, что делать, чтобы это исправить. Модель имеет 45 000 входных изображений, по 15 000 на каждый из трех входов. Модель также будет иметь 45 000 проверочных изображений, опять же, по 15 000 для каждого входа.

Каждый вход (набор из 15 000 изображений) имеет соответствующую метку со следующей структурой: первые 5 000 элементов списка = метка 0, вторые 5 000 элементов списка = метка 1, третьи 5 000 элементов списка = метка 2. Метки все One также горячо закодированы.

Любые предложения приветствуются.

Мой генератор данных основан на: https://stackoverflow.com/a/49405175/5432071

Мой код записной книжки Jupyter можно посмотреть здесь: https://uofstthomasmn-my.sharepoint.com/:u:/g/personal/ward0001_stthomas_edu/EcHhuXpXl1VJu8yKZaWRdKkBdwVrD6AEs3hd4Kuwk2Cl3g?e=tlQTGx

Для ссылки на записную книжку Jupyer вам нужно будет щелкнуть ссылку, а затем - загрузить ..., так как html-файл не будет отображаться на onedrive.

Подводя итог моему вопросу: что не так с моим генератором данных для моделей с несколькими входами?

Заранее спасибо.

Каков именно результат вашей модели? У вас один выход? Мое первое предположение будет заключаться в том, что вы объединяетесь по неправильной оси. См. docs.scipy.org/doc/numpy-1.14.0/reference/generated/…

sdcbr 09.08.2018 19:12

@sdcbr Последний слой основной нейронной сети - это просто выход relu, поэтому я хочу, чтобы каждый из трех входов передавал изображение через нейронную сеть, три выхода relu были объединены в один тензор, а затем этот тензор передается в softmax слой классификации. Слой классификации softmax классифицирует только три класса. Каждый ввод - это 15 000 изображений: по 5 000 каждого из трех классов. Вот изображение модели: uofstthomasmn-my.sharepoint.com/:i:/g/personal/… Подскажите, поможет ли это вам понять?

Matt Ward 09.08.2018 19:34

Я понимаю вашу архитектуру, но не понимаю, почему вы объединяете и получаете несколько меток. Кажется, у вас есть только одна метка на кортеж из трех изображений, верно? Итак, ваш генератор должен выдавать что-то вроде [X1, X2, X3], Y, где Y имеет форму (batch_size, 1). Нет?

sdcbr 09.08.2018 19:38

@sdcbr Это может быть потому, что я не понимаю, как работает ImageDataGenerator. Итак, в моем случае in1, in2, in3 имеют одинаковую метку. Поэтому, если я вызываю genX1 = gen.flow (in1, in1_label, 32) и genX2 = gen.flow (in2, in2_label, 32), а затем вызываю genX1.next () и genX2.next () ... будет genX1 .next () и genX2.next () имеют одинаковую метку? Или партии перемешиваются? Вы понимаете вопрос? Спасибо, кстати !!

Matt Ward 09.08.2018 19:47
Оптимизация производительности модели: Руководство по настройке гиперпараметров в Python с Keras
Оптимизация производительности модели: Руководство по настройке гиперпараметров в Python с Keras
Настройка гиперпараметров - это процесс выбора наилучшего набора гиперпараметров для модели машинного обучения с целью оптимизации ее...
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
Определение пород собак с помощью конволюционных нейронных сетей (CNN)
Определение пород собак с помощью конволюционных нейронных сетей (CNN)
В рамках финального проекта Udacity Data Scietist Nanodegree я разработал алгоритм с использованием конволюционных нейронных сетей (CNN) для...
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
1
4
231
0

Другие вопросы по теме