我有一个多输出 keras 模型。在我的模型训练中,我训练了 10 个相同的模型并按顺序平均它们的预测。我想同时进行所有这些模型训练以节省时间...
我有一个多输出 keras 模型。在我的模型训练中,我训练了 10 个相同的模型并按顺序平均它们的预测。我想同时进行所有这些模型训练以节省时间,而不需要循环。
以下是模型构建器功能的最小版本:
def test_build_mt(input_shape):
inputlayer = layers.Input(shape=input_shape)
shared_net = models.Sequential([layers.Dense(4, name='shared_0')], name='shared')(inputlayer)
outputs = []
for i in range(2):
task_net = models.Sequential(
[
layers.Dense(4, name='task_hidden_0'),
layers.Dense(1, name='task' + str(i) + '_output')
],
name='task' + str(i)
)(shared_net)
outputs.append(task_net)
model = models.Model(inputs=inputlayer, outputs=outputs)
return model
在查阅了网上的几篇文章后,我想出了以下函数来构建集成
def test_build_ensemble(build_func, params, n_estimators=10):
estimators = []
for i in range(n_estimators):
m = build_func(**params)
estimators.append(m)
for l in m.layers:
l.name = 'ensemble_' + str(i) + '_' + l.name
inputs = [m.input for m in estimators]
outputs = [out for m in estimators for out in m.output]
avg = layers.Average(name='ensemble_output')(outputs)
ensemble = models.Model(inputs=inputs, outputs=avg)
loss_dict = {
'ensemble_' + str(i) + '_' 'task' + str(j): 'mean_squared_error' for i in range(n_estimators) for j in range(2)
}
ensemble.compile(loss=loss_dict, optimizer='nadam')
return ensemble
当我训练模型时......
X = np.random.random((10,10))
y = X.sum(axis=1)
mt_y = {
'task0': y,
'task1': y
}
n_estimators = 2
ensemble = test_build_ensemble(test_build_mt, {'input_shape': X.shape[1:]}, n_estimators=n_estimators)
plot_model(ensemble, to_file='mt_test_ensemble.png', show_shapes=True)
ensemble.fit([X]*n_estimators,mt_y)
我收到以下错误:
ValueError: In the dict argument `loss`, key 'ensemble_0_task0' does not correspond to any model output. Received:
loss={'ensemble_0_task0': 'mean_squared_error', 'ensemble_0_task1': 'mean_squared_error', 'ensemble_1_task0': 'mean_squared_error', 'ensemble_1_task1': 'mean_squared_error'}
我已经重命名了我的输出。
另外,如果我使用, loss_dict = {'ensemble_output': 'mean_squared_error'}
我会得到错误: ValueError: No loss to compute. Provide a
loss argument in
compile() .
该模型的图表如下:
非常感谢您的帮助。但是,如果这不比循环训练模型更有效,或者有更好的方法可以实现我想要的效果,请告诉我。我查看了 keras
分布式计算的文档,但它似乎更适合划分数据或模型训练,而不是并行训练多个相同的模型。