【问题标题】:Average layer in multi input deep learning多输入深度学习中的平均层
【发布时间】:2019-05-01 21:18:39
【问题描述】:

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

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

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

如何创建此模型? 如何在 fit_generator 中创建生成器?

【问题讨论】:

    标签: tensorflow machine-learning keras neural-network deep-learning


    【解决方案1】:

    选项 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

    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
    

    【讨论】:

    • 非常感谢您的回复。我如何在fit_generator(generator, steps_per_epoch=None, epochs=1, verbose=1) 中创建fit_generator 并确定generator??
    • 查看新答案。
    猜你喜欢
    • 2019-04-25
    • 2021-01-18
    • 2021-06-17
    • 2019-10-13
    • 2019-06-27
    • 2019-04-13
    • 1970-01-01
    • 2021-01-20
    • 2020-03-06
    相关资源
    最近更新 更多