微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Keras 中串联多输入深度神经网络的正确最后一层是什么?

如何解决Keras 中串联多输入深度神经网络的正确最后一层是什么?

我正在尝试使用 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,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,model3.output])

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

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

解决方法

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

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

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

但这些都不能提前告诉您哪一种最适合您的情况。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。