首页 > 解决方案 > 多输入深度学习中的平均层

问题描述

我正在努力在 Keras 中创建一个用于图像分类的多输入卷积神经网络 (CNN) 模型,该模型采用两张图像并给出一个输出,即这两个图像的类别。

我有两个数据集:type1 和 type2,每个数据集都包含相同的类。模型应该从 Type1 数据集中获取一张图像,从 Type2 数据集中获取一张图像,然后将这些图像分类到一个类(ClassA 或 ClassB 或------)。

我想创建一个模型来预测这两个图像,然后计算类似于下图的预测平均值:

在此处输入图像描述

我怎样才能创建这个模型?如何在 fit_generator 中创建生成器?

标签: tensorflowmachine-learningkerasneural-networkdeep-learning

解决方案


选项 1 - 双方是相同的模型,只是使用不同的输入

假设您有一个模型可以上升到“谓词”,称为predModel.
创建两个输入张量:

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

获取每个输入的输出:

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

平均输出:

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

创建最终模型:

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

Option2 - 两边都是相似的模型,但使用不同的权重

与上面基本相同,但为每一面单独创建图层。

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以类似的方式实现 a 。

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

推荐阅读