Keras 中连接多输入深度神经网络的正确最后一层是啥?

Posted

技术标签:

【中文标题】Keras 中连接多输入深度神经网络的正确最后一层是啥?【英文标题】:What is the correct last layer for a concatenate multi-input deep neural network in Keras?Keras 中连接多输入深度神经网络的正确最后一层是什么? 【发布时间】:2021-07-25 08:33:29 【问题描述】:

我正在尝试使用 Keras 为具有 3 个可能输出的多类分类问题实现多输入模型,但我不明白将任何层保留为最后一层是否正确,或者它是否应该尊重班级人数。 那么下面这两个之间的正确(如果可以定义一个正确的)架构是什么?

1)

def createModel(numData, boolData, ordData):
    numIn = ks.Input(shape=numData.shape[1:3], name='numeric')
    x = ks.layers.Masking(mask_value=np.float64(0), input_shape=numData.shape[1:3])(numIn)
    mod1 = ks.layers.LSTM(128, return_sequences=True)(x)
    mod1 = ks.layers.LSTM(128)(mod1)
    model1 = ks.Model(numIn, mod1)

    boolIn = ks.Input(shape=boolData.shape[1], name='boolean')
    mod2 = ks.layers.Dense(128, activation='relu')(boolIn)
    mod2 = ks.layers.Dense(128, activation='relu')(mod2)
    model2 = ks.Model(boolIn, mod2)

    ordIn = ks.Input(shape=ordData.shape[1], name='ordinal')
    mod3 = ks.layers.Dense(128, activation='relu')(ordIn)
    mod3 = ks.layers.Dense(128, activation='relu')(mod3)
    model3 = ks.Model(ordIn, mod3)

    finMod = ks.layers.concatenate([model1.output, model2.output, model3.output])

    out = ks.layers.Dense(3, activation='softmax', name='out')(finMod)
    model = ks.Model(inputs=[model1.input, model2.input, model3.input], outputs=[out])
    return model
    def createModel(numData, boolData, ordData):
        numIn = ks.Input(shape=numData.shape[1:3], name='numeric')
        x = ks.layers.Masking(mask_value=np.float64(0), input_shape=numData.shape[1:3])(numIn)
        mod1 = ks.layers.LSTM(128, return_sequences=True)(x)
        mod1 = ks.layers.LSTM(128)(mod1)
        mod1 = ks.layers.Dense(3, activation='softmax')(mod1) #added layer
        model1 = ks.Model(numIn, mod1)

        boolIn = ks.Input(shape=boolData.shape[1], name='boolean')
        mod2 = ks.layers.Dense(128, activation='relu')(boolIn)
        mod2 = ks.layers.Dense(128, activation='relu')(mod2)
        mod2 = ks.layers.Dense(3, activation='softmax')(mod2) #added layer
        model2 = ks.Model(boolIn, mod2)

        ordIn = ks.Input(shape=ordData.shape[1], name='ordinal')
        mod3 = ks.layers.Dense(128, activation='relu')(ordIn)
        mod3 = ks.layers.Dense(128, activation='relu')(mod3)
        mod3 = ks.layers.Dense(3, activation='softmax')(mod3) #added layer
        model3 = ks.Model(ordIn, mod3)

        finMod = ks.layers.concatenate([model1.output, model2.output, model3.output])

        out = ks.layers.Dense(3, activation='softmax', name='out')(finMod)
        model = ks.Model(inputs=[model1.input, model2.input, model3.input], outputs=[out])
        return model

显然如果还有其他大错误请告诉我,因为我还在学习 Keras 和深度学习,我可能误解了一些基础知识。

【问题讨论】:

我觉得还可以。 哪一个?我报告了 2 个不同的模型 【参考方案1】:

中间层不必输出 3 个类别(如模型 #2)。 在这种情况下没有“正确的方式”,它只是两种不同的方式。

在模型 #2 的情况下,添加的层将每个通道的信息压缩为 3 个单元。这可以解释为每个通道都被要求进行自己的预测,而最后一个通道依赖于中间预测来输出最终类。

而在模型 #1 的情况下,最后一层与通道层的连接要多得多,但整体模型却不那么深。

但是这些都不能提前告诉你哪一个最适合你的情况。

【讨论】:

以上是关于Keras 中连接多输入深度神经网络的正确最后一层是啥?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 Keras 在卷积神经网络的最后一层特征上训练 SVM 或随机森林?

用于训练考虑 keras 中最后一层的网络

如何使用 keras 堆叠 LSTM 模型正确塑造多类分类的输入

深度学习-Keras-层及损失函数

深度学习-Keras-层及损失函数

连接 Keras 中的屏蔽输入