首页 > 解决方案 > Keras 多输出模型

问题描述

编辑:我有部分答案,请看这篇文章的结尾

在制作了两个不同的模型来预测策划者的得分之后,我现在尝试制作一个具有两个输出的模型:

该条目包含玩家的提议和在二进制表中编码的秘密。6 种颜色 * 4 个引脚 = 24 位用于秘密和 24 位用于提案。

这是我的模型架构模型架构

这是我的主要代码:

main_input = Input(shape=(input_layer_size, ), name='main_input')
x = Dense(hidden_layer_size, activation="relu")(main_input)
for i in range(nb_hidden_layer):
    x = Dense(hidden_layer_size, activation="relu")(x)
rcrp_out = Dense(1, activation='sigmoid', name='rcrp_out')(x)
rcwp_out = Dense(1, activation='sigmoid', name='rcwp_out')(x)

model_rpwp = Model(inputs=main_input, outputs=[rcrp_out, rcwp_out])
model_rpwp.compile(optimizer='rmsprop', loss=['binary_crossentropy', 'binary_crossentropy'], metrics=['accuracy'])

以下是训练数据的示例:

print(rpwp_feature)
[[0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 1]
 [0 0 0 ... 0 1 0]
 ...
 [1 0 0 ... 0 0 0]
 [1 0 0 ... 0 0 1]
 [1 0 0 ... 0 0 0]]

print(rcrp_label)
[3 0 1 ... 0 1 4]

print(rcwp_label)
[0 3 2 ... 4 2 0]

可能有一些我不明白的地方,因为我的模型没有学到任何东西,并且总是预测两个输出都为 0。

我尝试了多种损失函数和架构,但没有任何效果。我的输入和输出数据按我的预期形成。

你能帮我理解我做错了什么吗?

编辑: 我有部分答案。rcrp_out和的 Sigmoid 激活函数rcwp_out返回一个介于 0 和 1 之间的浮点数,因此它永远不会是自然数。在这种情况下,我需要更改激活函数和损失函数或二值化我的标签数据。

标签: pythontensorflowmachine-learningkeras

解决方案


我已经用这些函数对我的标签数据进行了二值化。

def binarise_number(number, max_number=None):
    if max_number is None:
        return [int(x) for x in format(number, "0b")]
    n_number = format(number, "0>%db" % len(binarise_number(max_number, None)))
    return [int(x) for x in n_number]

def revert_binarise_number(n_number):
    str_number = '0b' + ''.join(str(int(x)) for x in n_number)
    number = int(str_number, base=2)
    return number

我的数据现在是这样的:

print(rcrp_label)
[[0 1 0]
 [0 1 0]
 [0 1 0]
 ...
 [0 0 0]
 [0 1 0]
 [1 0 0]]

print(rcwp_label)
[[0 0 1]
 [0 0 0]
 [0 0 0]
 ...
 [0 1 0]
 [0 0 0]
 [0 0 0]]

它现在按预期工作。


推荐阅读