有没有办法集成两个为相同 类 训练的 keras (h5) 模型
Is there a way to ensemble two keras (h5) models trained for same classes
我已经为相同的 class 标签训练了两个具有不同数据集的 keras 模型。我如何将模型 keras_model.h5 和 keras_model2.h5 组合在一起并使另一个 keras 模型说 keras_ensemble.h5。我试过参考各种互联网资源,但没有运气。 有人可以帮我编写代码吗?
Here are the models I've trained
请通过this.Thank你帮助我。
编辑:
这是我的代码,我在回答我的问题的人的帮助下完成了 Frightera
import tensorflow.keras
import tensorflow as tf
from PIL import Image, ImageOps
import numpy as np
# Disable scientific notation for clarity
np.set_printoptions(suppress=True)
# Load the model
keras_model = tensorflow.keras.models.load_model('keras_model.h5', compile=False)
keras_model._name = 'model1'
keras_model2 = tensorflow.keras.models.load_model('keras_model2.h5', compile=False)
keras_model2._name = 'model2'
models = [keras_model, keras_model2]
#model_input = tf.keras.Input(shape=(125, 125, 3))
model_input = tf.keras.Input(shape=(224, 224, 3))
model_outputs = [model(model_input) for model in models]
ensemble_output = tf.keras.layers.Average()(model_outputs)
ensemble_model = tf.keras.Model(inputs=model_input, outputs=ensemble_output)
编辑
如何获取 h5 格式的 keras 集成模型?
您可以像这样对它们进行平均集成:
models = [keras_model, keras_model2]
model_input = tf.keras.Input(shape=(125, 125, 3))
model_outputs = [model(model_input) for model in models]
ensemble_output = tf.keras.layers.Average()(model_outputs)
ensemble_model = tf.keras.Model(inputs=model_input, outputs=ensemble_output)
编辑:如果你想创建加权合奏,你可以像这样创建一个自定义层:
class WeightedAverageLayer(tf.keras.layers.Layer):
def __init__(self, w1, w2, **kwargs):
super(WeightedAverageLayer, self).__init__(**kwargs)
self.w1 = w1
self.w2 = w2
def call(self, inputs):
return self.w1 * inputs[0] + self.w2 * inputs[1]
所以输出层应该是这样的:
ensemble_output = WeightedAverageLayer(0.6, 0.4)(model_outputs)
此处,第一个模型的输出按 0.6
因子缩放。同样的事情适用于第二个模型,系数为 0.4
.
注意:WeightedAverageLayer(0.5, 0.5)
等同于 tf.keras.layers.Average()
。
import tensorflow.keras
import tensorflow as tf
from PIL import Image, ImageOps
import numpy as np
# Disable scientific notation for clarity
np.set_printoptions(suppress=True)
# Load the model
keras_model = tensorflow.keras.models.load_model('APPLE/apple_model1.h5', compile=False)
keras_model._name = 'model1'
keras_model2 = tensorflow.keras.models.load_model('APPLE/apple_model2.h5', compile=False)
keras_model2._name = 'model2'
models = [keras_model, keras_model2]
#model_input = tf.keras.Input(shape=(125, 125, 3))
model_input = tf.keras.Input(shape=(224, 224, 3))
model_outputs = [model(model_input) for model in models]
ensemble_output = tf.keras.layers.Average()(model_outputs)
ensemble_model = tf.keras.Model(inputs=model_input, outputs=ensemble_output)
ensemble_model.save('APPLE/ensemble_apple.h5')
我已经为相同的 class 标签训练了两个具有不同数据集的 keras 模型。我如何将模型 keras_model.h5 和 keras_model2.h5 组合在一起并使另一个 keras 模型说 keras_ensemble.h5。我试过参考各种互联网资源,但没有运气。 有人可以帮我编写代码吗? Here are the models I've trained
请通过this.Thank你帮助我。
编辑: 这是我的代码,我在回答我的问题的人的帮助下完成了 Frightera
import tensorflow.keras
import tensorflow as tf
from PIL import Image, ImageOps
import numpy as np
# Disable scientific notation for clarity
np.set_printoptions(suppress=True)
# Load the model
keras_model = tensorflow.keras.models.load_model('keras_model.h5', compile=False)
keras_model._name = 'model1'
keras_model2 = tensorflow.keras.models.load_model('keras_model2.h5', compile=False)
keras_model2._name = 'model2'
models = [keras_model, keras_model2]
#model_input = tf.keras.Input(shape=(125, 125, 3))
model_input = tf.keras.Input(shape=(224, 224, 3))
model_outputs = [model(model_input) for model in models]
ensemble_output = tf.keras.layers.Average()(model_outputs)
ensemble_model = tf.keras.Model(inputs=model_input, outputs=ensemble_output)
编辑 如何获取 h5 格式的 keras 集成模型?
您可以像这样对它们进行平均集成:
models = [keras_model, keras_model2]
model_input = tf.keras.Input(shape=(125, 125, 3))
model_outputs = [model(model_input) for model in models]
ensemble_output = tf.keras.layers.Average()(model_outputs)
ensemble_model = tf.keras.Model(inputs=model_input, outputs=ensemble_output)
编辑:如果你想创建加权合奏,你可以像这样创建一个自定义层:
class WeightedAverageLayer(tf.keras.layers.Layer):
def __init__(self, w1, w2, **kwargs):
super(WeightedAverageLayer, self).__init__(**kwargs)
self.w1 = w1
self.w2 = w2
def call(self, inputs):
return self.w1 * inputs[0] + self.w2 * inputs[1]
所以输出层应该是这样的:
ensemble_output = WeightedAverageLayer(0.6, 0.4)(model_outputs)
此处,第一个模型的输出按 0.6
因子缩放。同样的事情适用于第二个模型,系数为 0.4
.
注意:WeightedAverageLayer(0.5, 0.5)
等同于 tf.keras.layers.Average()
。
import tensorflow.keras
import tensorflow as tf
from PIL import Image, ImageOps
import numpy as np
# Disable scientific notation for clarity
np.set_printoptions(suppress=True)
# Load the model
keras_model = tensorflow.keras.models.load_model('APPLE/apple_model1.h5', compile=False)
keras_model._name = 'model1'
keras_model2 = tensorflow.keras.models.load_model('APPLE/apple_model2.h5', compile=False)
keras_model2._name = 'model2'
models = [keras_model, keras_model2]
#model_input = tf.keras.Input(shape=(125, 125, 3))
model_input = tf.keras.Input(shape=(224, 224, 3))
model_outputs = [model(model_input) for model in models]
ensemble_output = tf.keras.layers.Average()(model_outputs)
ensemble_model = tf.keras.Model(inputs=model_input, outputs=ensemble_output)
ensemble_model.save('APPLE/ensemble_apple.h5')