python - 在 Keras 中将模型合二为一
问题描述
我必须训练两个模型:modelA
和modelB
不同的optimizer
和hiddenLayers
。我想将输出作为它们之间的组合,结果为
# w = weight I give to each model
output_modelC = output_modelA * w + output_modelB * (1 - w)
两个模型共享相同的Input
,但是,创建它们之后compile
,我不知道如何遵循它。我的代码是这样的:
Input = keras.layers.Input(shape=(2,))
#modelA
Hidden_A_1 = keras.layers.Dense(units=20)(Input)
Hidden_A_2 = keras.layers.Dense(units=20)(Hidden_A_1)
Output_A = keras.layers.Dense(units=1, activation='sigmoid')(Hidden_A_2)
optimizer_A = keras.optimizers.SGD(lr=0.00001, momentum=0.09, nesterov=True)
model_A = keras.Model(inputs=Input, outputs=Output_A)
model_A.compile(loss="binary_crossentropy",
optimizer=optimizer_slow,
metrics=['accuracy'])
#modelB
Hidden1_B = keras.layers.Dense(units=10, activation='relu')(Input)
Output_B = keras.layers.Dense(units=1, activation='sigmoid')(Hidden1_B)
model_B = keras.Model(inputs=Input, outputs=Output_B)
optimizer_B = keras.optimizers.Adagrad()
model_B.compile(loss="binary_crossentropy",
optimizer=optimizer_B,
metrics=['accuracy'])
解决方案
假设您将提供w
以下代码的值可能会对您有所帮助:
import keras
Input = keras.layers.Input(shape=(784,))
#modelA
Hidden_A_1 = keras.layers.Dense(units=20)(Input)
Hidden_A_2 = keras.layers.Dense(units=20)(Hidden_A_1)
Output_A = keras.layers.Dense(units=1, activation='sigmoid')(Hidden_A_2)
optimizer_A = keras.optimizers.SGD(lr=0.00001, momentum=0.09, nesterov=True)
model_A = keras.Model(inputs=Input, outputs=Output_A)
model_A.compile(loss="binary_crossentropy",
optimizer=optimizer_A,
metrics=['accuracy'])
#modelB
Hidden1_B = keras.layers.Dense(units=10, activation='relu')(Input)
Output_B = keras.layers.Dense(units=1, activation='sigmoid')(Hidden1_B)
model_B = keras.Model(inputs=Input, outputs=Output_B)
optimizer_B = keras.optimizers.Adagrad()
model_B.compile(loss="binary_crossentropy",
optimizer=optimizer_B,
metrics=['accuracy'])
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
model_A.fit(x_train,y_train)
model_B.fit(x_train,y_train)
w = 0.8
output_modelC = model_A.predict(x_test) * w + model_B.predict(x_test) * (1 - w)
样本输出:
array([[0.98165023],
[0.9918817 ],
[0.93426293],
...,
[0.99940777],
[0.9960805 ],
[0.9992139 ]], dtype=float32)
我选择的样本数据可能不是正确的,但这只是为了展示如何结合这两个网络。
希望这可以帮助!
推荐阅读
- java - 如何在 x 轴上绘制时间,在图形的 y 轴上绘制传感器检测值
- azure - Azure 认知搜索 - 将完整的 json 作为 SearchDocument 返回?
- java - 适用于 Windows 应用程序的 Android 小部件和 SDK
- angular - 有没有办法在没有重定向/重新加载的情况下为 Pardot 提交() HTMLFormElement 表单?如果不是,那么 Angular 的模拟方式是什么?
- mysql - 当两个事务同时发生时,结果会是什么
- api - 通过 gitlab api 获取组的组成员身份
- amazon-web-services - 如何在 GitHub 自述文件 markdown 中显示静态网站
- date - 在 SharePoint Online 中计算日期字段
- vue.js - 由于 MixedContent 问题,前端云运行应用程序无法访问我的后端云运行应用程序
- javascript - 如何从javascript中的字符串数组中删除动态文本