如何在Keras中评估多输入/输出模型?

时间:2019-02-25 11:16:37

标签: python python-3.x tensorflow keras

我已经按照keras的本指南中的说明来构建以下具有多输入和多输出的模型。

## define the model
EMBEDDING_SIZE = 128
HIDDEN_LAYER_SIZE = 64
BATCH_SIZE = 32
NUM_EPOCHS = 10

# first input model
main_input = Input(shape=(50,), dtype='int32', name='main_input')
embedding = Embedding(MAX_NB_WORDS, EMBEDDING_SIZE,
                    input_length=MAX_SEQUENCE_LENGTH)(main_input)
lstm_out = LSTM(HIDDEN_LAYER_SIZE)(embedding)
auxiliary_output = Dense(4, activation='sigmoid', name='aux_output')(lstm_out)
# second input model
auxiliary_input = Input(shape=(5,), name='aux_input')
x = concatenate([lstm_out, auxiliary_input])

x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)

main_output = Dense(4, activation='sigmoid', name='main_output')(x)

model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])

model.compile(optimizer='rmsprop',
              loss={'main_output': 'categorical_crossentropy', 'aux_output': 'categorical_crossentropy'},
              loss_weights={'main_output': 1., 'aux_output': 0.2})

model.fit([x1train, x2train], [ytrain, ytrain],
                    epochs=NUM_EPOCHS, batch_size=BATCH_SIZE,
                    validation_data=([x1test, x2test], [ytest, ytest]))

在下一步中,我还要评估我的模型。我建议为此运行以下代码:

score, acc = model.evaluate(x={'main_input': x1test, 'aux_input': x2test},
                            y={'main_output': ytest, 'aux_output': ytest},
                            batch_size=BATCH_SIZE)

但是使用该代码,我得到的错误是“ ValueError:太多值无法解包(预期2)”

所以我想我可能在两个输出上都得到了分数和准确性,并且也尝试了以下代码:

score1, score2, acc1, acc2 = model.evaluate(x={'main_input': x1test, 'aux_input': x2test},
                            y={'main_output': ytest, 'aux_output': ytest},
                            batch_size=BATCH_SIZE)

但是现在我收到错误消息“ ValueError:没有足够的值要解压(预期4,得到3)”

那我做错了什么?老实说,我只是对我的main_output的准确性感兴趣。

2 个答案:

答案 0 :(得分:2)

evaluate的keras文档中可以找到here

  

返回

     

标量测试损失(如果模型具有单个输出且没有度量标准)或标量列表(如果模型具有多个输出和/或度量标准)。属性model.metrics_names将为您提供标量输出的显示标签。

根据您的模型,如果您进行print(model.metrics_names),则会得到['loss', 'main_output_loss', 'aux_output_loss']

model.evaluate产生这种格式的标量,它表示您在evaluate方法的输出中看到的每个数字对应于什么。

添加您的代码

score1, score2, acc1, acc2 = model.evaluate(x={'main_input': x1test, 'aux_input': x2test},
                            y={'main_output': ytest, 'aux_output': ytest},
                            batch_size=BATCH_SIZE)

将导致错误,因为标量中只有3个索引,并且代码希望找到4

也是

score, acc = model.evaluate(x={'main_input': x1test, 'aux_input': x2test},
                            y={'main_output': ytest, 'aux_output': ytest},
                            batch_size=BATCH_SIZE)

由于evaluate返回的值更多,因此会导致错误。

如果您想直接在模型中解压缩evaluate的结果,则可以执行以下操作。

loss, main_loss, aux_loss = model.evaluate(x={'main_input': x1test, 'aux_input': x2test},
                            y={'main_output': ytest, 'aux_output': ytest},
                            batch_size=BATCH_SIZE)

在您的代码中,我还可以看到acc1acc2,这使我假设您希望评估模型的准确性。

话虽如此,我可以看到您没有使用任何metrics进行模型编译。如果您想评估模型的acc,则可以像这样编译模型。

model.compile(optimizer='rmsprop',
              loss={'main_output': 'categorical_crossentropy', 'aux_output': 'categorical_crossentropy'},
              loss_weights={'main_output': 1., 'aux_output': 0.2}, metrics=['acc'])

然后在model.evaluate()上,您将得到一个与

相对应的标量。
['loss',
 'main_output_loss',
 'aux_output_loss',
 'main_output_acc',
 'aux_output_acc']

因此,您可以像这样打开包装,

loss, main_loss, aux_loss, main_acc, aux_acc = model.evaluate(x={'main_input': x1test, 'aux_input': x2test},
                                y={'main_output': ytest, 'aux_output': ytest},
                                batch_size=BATCH_SIZE)

答案 1 :(得分:1)

您尚未在模型编译中定义所需的准确性,因此在使用评估时,该函数将返回损失。您在这里有3个损失来评估收益:

  • (1)在您的情况下,(2)和(3)的加权平均损失:1. *(2)+ 0.2 *(3)
  • (2)main_output的损失-类别交叉熵
  • (3)aux_output的损失-categorical_crossentropy