Вариант 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