【问题标题】:Merge multiple Models in Keras (tensorflow)在 Keras 中合并多个模型(张量流)
【发布时间】:2021-07-10 18:25:42
【问题描述】:

在这里做了很多努力之后是我的问题,

我有两个模型,两个模型都可以检测 2-2 个类。正如我们所知,我们可以使用 FunctionalAPI 合并两个模型。我试过了,但我没有得到想要的结果。

我的目标:我想合并这些模型,更新后的模型应该有(1 个输入,4 个输出)。

inputs = tf.keras.Input(shape=(50,50,1))
y_1 = f1_Model(inputs)
y_2 = f2(inputs)
outputs = tf.concat([y_1, y_2], axis=0)
new_model = keras.Model(inputs, outputs)
new_model.summary()
Model: "functional_5"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_2 (InputLayer)            [(None, 50, 50, 1)]  0                                            
__________________________________________________________________________________________________
sequential (Sequential)         (None, 2)            203874      input_2[0][0]                    
__________________________________________________________________________________________________
sequential_1 (Sequential)       (None, 2)            203874      input_2[0][0]                    
__________________________________________________________________________________________________
tf_op_layer_concat (TensorFlowO [(None, 2)]          0           sequential[1][0]                 
                                                                 sequential_1[1][0]               
==================================================================================================
Total params: 407,748
Trainable params: 407,748
Non-trainable params: 0
__________________________________________________________________________________________________

当我在其中传递图像时,它会给出错误的结果。我不知道我哪里出错了。

prediction = new_model.predict([prepare(img)]) 
prediction

# index_pred=np.argmax(prediction) (this should return from 0 to 3, but not happening)
 

array([[1., 0.],
       [1., 0.]], dtype=float32)

【问题讨论】:

  • 看起来您需要更改连接输出的轴。 outputs = tf.concat([y_1, y_2], axis=1) 应该可以工作。
  • array([[0., 1., 1., 0.]], 试过了,但这是错误的。我认为只有一个应该为 1,其余的应该为 0
  • 这对您有帮助吗? stackoverflow.com/questions/68036757/…
  • @Kaveh 我会尝试的。在此之前,请阅读我在以下答案中添加的 cmets。让我知道您建议的解决方案是否可行

标签: python tensorflow keras


【解决方案1】:

据我了解,您想对 4 个类别进行分类,为此,您有 2 个模型,每个模型可对 2 个类别进行分类。
截至目前,您的 f1 和 f2 模型输出 softmax activation 的结果,因此首先,您必须将其删除并仅输出 logits 或仅输出 relu activation。在@dmg2 提到的那之后,你必须在tf.concat 中设置axis=1 现在最后你必须通过一个新的softmax 激活来传递输出。在那之后,我希望你能训练你的模型。

【讨论】:

  • 两个模型都已经过训练。合并后,我需要再次训练吗?有没有别的办法?因为训练需要很多时间。我可以分别使用两个模型,但我想合并它们。
  • 别无他法。你必须训练。给你理由。第一个模型认为它是 1 类或 2 类,而第二个模型认为它是 3 类或 4 类,因此对于每个输入,第一个模型会说它的 1 类或 2 类,第二个模型会说 3 或 4,所以最后你将在 concat 之后有 2 个非常高的 logits。因此,softmax probas 会略有不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 2018-10-11
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
相关资源
最近更新 更多