Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何水平堆叠Keras模型?_Python_Python 3.x_Tensorflow_Keras - Fatal编程技术网

Python 如何水平堆叠Keras模型?

Python 如何水平堆叠Keras模型?,python,python-3.x,tensorflow,keras,Python,Python 3.x,Tensorflow,Keras,在Keras有可能这样做吗 除模型A、B、C外,所有模型是否水平堆放在一个模型中?我见过一些利用输入层的解决方案,但每当我使用输入层时,当我尝试加载模型时,似乎都会出错。 有没有办法加载所有模型,连接它们,并保存为一个新的更大的模型 编辑:我已经培训了所有的模特。我想在事后将它们结合起来。是的,这在keras中是可能的,但这需要一些API的高级知识。特别是,您需要考虑如何计算每个输出相对于输入的损失 我建议查看,也许从和开始 下面是如何使用函数式API创建此类网络的示意图 来自tensorflo

在Keras有可能这样做吗

除模型A、B、C外,所有模型是否水平堆放在一个模型中?我见过一些利用输入层的解决方案,但每当我使用输入层时,当我尝试加载模型时,似乎都会出错。 有没有办法加载所有模型,连接它们,并保存为一个新的更大的模型


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

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

我建议查看,也许从和开始

下面是如何使用函数式API创建此类网络的示意图

来自tensorflow导入keras的

输入形状:int=100
输入=keras.Input(形状=(输入形状)
单位:int=64
密度1=层。密度(单位)
密度2=层。密度(单位)
密度3=层。密度(单位)
out1=dense1(输入)
out2=dense2(输入)
out3=dense3(输入)

以下是我的想法,让我们假设您要堆叠以下模型:

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)
模型_输出给出:(此处通过3)

我不知道如何使用它们各自的输出,但这就是如何堆叠它们


编辑:您可以通过定义单独的损耗等来使用它们的输出。或者,由于它们是堆叠的,并且输入是共享的,因此您可以获得每个模型的输出,以使用其权重创建新模式。我不知道是否可以从堆叠模型中剪切它们,所以我说获取每个输出。

您是在尝试实现集成学习还是?我不明白每个模型都有单独的输出的目的。我想你可以通过
层来实现。连接
。不过我不确定,但你可以试试。@Frightera我正在做一个多标签分类问题,作为一系列二进制分类网络。在你问之前:是的,这是我100%想要解决问题的方法。我想将模型组合成一个大模型,这样我就可以加载单个模型,而不是等到测试时加载每个模型。我已经训练了所有模型,我只需要组合它们。抱歉不清楚,我将编辑原始问题。嗯。有没有可能做这样的事情,但重量?因为我的每个模型都有相同的体系结构,所以每次保存完整的模型是低效的。我开始认为,即使我合并了它,我也会用完VRAM。堆叠模型是一种新的模型,因此我不认为有更有效的方法来实现这一点,因为模型是经过训练的。我有一个次要问题,可以间接解决这个问题。我曾尝试使用多标签分类来解决这个问题,验证和训练损失都低于0.01,准确率大约为99%,但当我自己测试它时(使用model.predict),我得到的结果非常差。这就是我尝试组合多个模型的原因,因为每个模型都表现得很好。你可以平均每个模型的输出,并对它们进行预测?对于多标签或单独的二进制?
[<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')