8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何创建具有多个输出的集成 Keras 模型

hashrocket 2月前

22 0

我有一个多输出 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 分布式计算的文档,但它似乎更适合划分数据或模型训练,而不是并行训练多个相同的模型。

帖子版权声明 1、本帖标题:如何创建具有多个输出的集成 Keras 模型
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由hashrocket在本站《tensorflow》版块原创发布, 转载请注明出处!
最新回复 (0)
返回
作者最近主题: