Средний уровень в многоуровневом глубоком обучении - PullRequest
0 голосов
/ 29 ноября 2018

Я работаю над созданием модели множественных входов Convolutional Neural Network (CNN) в Keras для классификации изображений, которая берет два изображения и дает один вывод, который является классом двух изображений.

У меня есть дванаборы данных: type1 и type2, и каждый набор данных содержит одинаковые классы.Модель должна взять одно изображение из набора данных Type1 и одно изображение из набора данных Type2, а затем классифицировать эти изображения в один класс (ClassA или ClassB или ------).

Я хочу создатьмодель, которая предсказывает два изображения, а затем вычисляет среднее значение прогноза, аналогичное следующему изображению:

enter image description here

Как я могусоздать эту модель?Как я могу создать генератор в fit_generator?

1 Ответ

0 голосов
/ 29 ноября 2018

Вариант 1 - Обе стороны одной и той же модели, только с использованием разных входных данных

Предположим, у вас есть модель, которая подходит к "предикации" и называется predModel.
Создайте два входных тензора:

input1 = Input(shape)   
input2 = Input(shape)

Получить выходы для каждого входа:

pred1 = predModel(input1)
pred2 = predModel(input2)   

Усреднить выходы:

output = Average()([pred1,pred2])

Создать окончательную модель:

model = Model([input1,input2], output)

Вариант 2 - Обе стороны являются аналогичными моделями, но используют разные веса

По сути, то же самое, что и выше, но создайте слои индивидуально для каждой стороны.

def createCommonPart(inputTensor):
    out = ZeroPadding2D(...)(inputTensor)
    out = Conv2D(...)(out)

    ...
    out = Flatten()(out)
    return Dense(...)(out)

Сделайте два ввода:

input1 = Input(shape)   
input2 = Input(shape)

Получите два выхода:

pred1 = createCommonPart(input1)
pred2 = createCommonPart(input2)

Усредните значения:

output = Average()([pred1,pred2])

Создайте окончательную модель:

model = Model([input1,input2], output)

Генератор

Все, что дает [xTrain1,xTrain2], y.

Вы можете создать его следующим образом:

def generator(files1,files2, batch_size):

    while True: #must be infinite

        for i in range(len(files1)//batch_size)):
            bStart = i*batch_size
            bEnd = bStart+batch_size

            x1 = loadImagesSomehow(files1[bStart:bEnd])
            x2 = loadImagesSomehow(files2[bStart:bEnd])
            y = loadPredictionsSomeHow(forSamples[bStart:bEnd])

            yield [x1,x2], y

Вы также можете реализовать keras.utils.Sequence аналогичным способом.

class gen(Sequence):
    def __init__(self, files1, files2, batchSize):
        self.files1 = files1
        self.files2 = files2
        self.batchSize = batchSize

    def __len__(self):
        return self.len(files1) // self.batchSize

    def __getitem__(self,i):

        bStart = i*self.batchSize
        bEnd = bStart+self.batchSize 

        x1 = loadImagesSomehow(files1[bStart:bEnd])
        x2 = loadImagesSomehow(files2[bStart:bEnd])
        y = loadPredictionsSomeHow(forSamples[bStart:bEnd])

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