我已经按照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的准确性感兴趣。
答案 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)
在您的代码中,我还可以看到acc1
和acc2
,这使我假设您希望评估模型的准确性。
话虽如此,我可以看到您没有使用任何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个损失来评估收益: