【问题标题】:How to stack Keras models horizontally?如何水平堆叠 Keras 模型?
【发布时间】:2021-01-30 19:49:26
【问题描述】:

在 Keras 中可以做这样的事情吗? :

除了模型 A、B、C 都水平堆叠成一个模型?我见过一些使用输入层的解决方案,但是每当我使用输入层时,当我尝试加载模型时似乎都会出错。 有没有办法加载所有模型,将它们连接起来,然后保存为一个新的更大的模型?

编辑:我已经训练了所有模型。我想在事后将它们结合起来。

【问题讨论】:

  • 你是想实现集成学习还是?我不明白为每个模型分别输出的目的。
  • 我认为您可以通过layers.concatenate 做到这一点。不过不确定,但你可以试试。
  • @Frightera 我正在做一个多标签分类问题作为一系列二元分类网络。在你问之前:是的,这是我想 100% 解决问题的方式。我想将模型组合成一个大模型,这样我就可以加载单个模型,而不是在测试时等待每个模型都加载完毕。

标签: python python-3.x tensorflow keras


【解决方案1】:

这是我的想法,假设您有这些模型要堆叠:

model_1 = tf.keras.models.Model(inputs = model_1.input, outputs = model_1_out)

model_2 = tf.keras.models.Model(inputs = model_2.input, outputs = model_2_out)

model_3 = tf.keras.models.Model(inputs = model_3.input, outputs = model_3_out)

如果你想堆叠模型,而不是连接它们的输出:

models = [model_3 , model_2 , model_1]
stacked_model_input = tf.keras.Input(shape=(x, x, x))
model_outputs = [model(stacked_model_input) for model in models]
stacked_model = tf.keras.models.Model(inputs=stacked_model_input, outputs=model_outputs)

model_outputs 给出:(此处通过 3。)

[<KerasTensor: shape=(None, 3) dtype=float32 (created by layer 'model_2')>,
 <KerasTensor: shape=(None, 3) dtype=float32 (created by layer 'model_1')>,
 <KerasTensor: shape=(None, 3) dtype=float32 (created by layer 'model')>]

产生:

用于保存堆叠模型:

from tf.keras.models import save_model
save_model(stacked_model , 'model.h5')

我不确定如何使用它们的单独输出,但是,这就是你可以堆叠它们的方式。

编辑:您可以通过定义单独的损失等来使用它们的输出。或者由于它们是堆叠的并且输入是共享的,您可以获得每个模型的输出以创建具有其权重的新模式。我不知道你能不能把它们从堆叠模型中剪下来,所以这就是我说得到每个输出的原因。

【讨论】:

  • 嗯。是否有可能做这样的事情,但有重量?由于我的每个模型都具有相同的架构,因此每次都保存完整模型会效率低下。我开始认为,即使我把它结合起来,我也会用完 VRAM。
  • 堆叠模型是一个新模型,所以我认为没有更有效的方法可以做到这一点,因为模型是经过训练的。
  • 我有一个可以间接解决这个问题的附带问题。我尝试使用多标签分类来解决这个问题,验证和训练损失都低于 0.01,准确率大约为 99%,但是当我自己测试时(使用 model.predict),我得到的结果很差。这就是我尝试组合多个模型的原因,因为每个模型都表现良好。
  • 你可以对他们的每一个输出进行平均,然后对它们进行预测?
  • 对于多标签或单独的二进制文件?
【解决方案2】:

是的,这在keras 中是可能的,但需要一些API 的高级知识。特别是,您需要考虑如何计算每个输出相对于输入的损失。

我建议查看developer guides,也许从functional APIcustom training loops 开始。

以下是如何使用功能 API 创建此类网络的草图。

from tensorflow import keras

input_shape: int = 100
inputs = keras.Input(shape=(input_shape,))

units: int = 64
dense1 = layers.Dense(units)
dense2 = layers.Dense(units)
dense3 = layers.Dense(units)

out1 = dense1(inputs)
out2 = dense2(inputs)
out3 = dense3(inputs)

【讨论】:

  • 我已经把所有的模型都训练好了,我只需要把它们结合起来。抱歉不清楚,我将编辑原始问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2015-05-16
相关资源
最近更新 更多