Как оценить модель множественного ввода / вывода в керасе? - PullRequest
0 голосов
/ 25 февраля 2019

Я следовал описанию этого руководства от 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 голосов
/ 25 февраля 2019

Из документации keras для evaluate можно найти здесь

Возвращает

Скалярные тестовые потери (если модель имеет один выход и нетметрики) или список скаляров (если модель имеет несколько выходов и / или метрик).Атрибут 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)
0 голосов
/ 25 февраля 2019

Вы не определили в модели компиляции, что вы хотите точности, поэтому при использовании оценки функция вернет потери.У вас есть 3 убытка, которые оценивают доходность:

  • (1) Взвешенная усредненная потеря (2) и (3), в вашем случае: 1. * (2) + 0,2 * (3)
  • (2) Потеря main_output - категориальный_кросцентропия
  • (3) Потеря aux_output - категориальный_кросцентропия
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...