Keras 中串联多输入深度神经网络的正确最后一层是什么?
What is the correct last layer for a concatenate multi-input deep neural network in Keras?
我正在尝试使用 Keras 为具有 3 个可能输出的多classclass化问题实现一个多输入模型,但我无法理解将任何层保留为最后一个,还是要尊重class.
个数的限制
那么下面这两个之间的正确架构(如果可以定义一个正确的架构)是什么?
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 和深度学习,我可能误解了一些基础知识。
中间层不必输出 3 个类别(如模型 #2 中那样)。
在这种情况下没有“正确的方法”,它只是两种不同的方法。
在模型 #2 的情况下,添加的层将每个通道的信息压缩到 3 个单元格中。可以解释为好像每个通道都被要求进行自己的预测,而最后一个通道依靠中间预测来输出最终的 class.
而在模型 #1 的情况下,最后一层与通道层有更多的联系,但整体模型没有那么深。
但是 none 可以提前告诉您哪一个最适合您的情况。
我正在尝试使用 Keras 为具有 3 个可能输出的多classclass化问题实现一个多输入模型,但我无法理解将任何层保留为最后一个,还是要尊重class.
个数的限制
那么下面这两个之间的正确架构(如果可以定义一个正确的架构)是什么?
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 和深度学习,我可能误解了一些基础知识。
中间层不必输出 3 个类别(如模型 #2 中那样)。 在这种情况下没有“正确的方法”,它只是两种不同的方法。
在模型 #2 的情况下,添加的层将每个通道的信息压缩到 3 个单元格中。可以解释为好像每个通道都被要求进行自己的预测,而最后一个通道依靠中间预测来输出最终的 class.
而在模型 #1 的情况下,最后一层与通道层有更多的联系,但整体模型没有那么深。
但是 none 可以提前告诉您哪一个最适合您的情况。