Предполагая , что вы на самом деле пытаетесь здесь получить индивидуальную потерю на выборку в своем тестовом наборе, вот способ сделать это (в вашем подходе, даже если вы пройдете мимоВ итерационной части у вас будут проблемы с model.evaluate
, который не был разработан для одиночных пар выборок) ...
Чтобы сделать пример воспроизводимым, здесь я также предполагаю, что мы выполнили первый запускпример Keras MNIST CNN только для 2 эпох;Итак, форма наших данных:
x_test.shape
# (10000, 28, 28, 1)
y_test.shape
# (10000, 10)
Учитывая, что есть способ получить индивидуальную потерю для выборки:
from keras import backend as K
y_pred = model.predict(x_test)
y_test = y_test.astype('float32') # necessary, as y_pred.dtype is 'float32'
y_test_tensor = K.constant(y_test)
y_pred_tensor = K.constant(y_pred)
g = K.categorical_crossentropy(target=y_test_tensor, output=y_pred_tensor)
ce = K.eval(g) # 'ce' for cross-entropy
ce
# array([1.1563368e-05, 2.0206178e-05, 5.4946734e-04, ..., 1.7662416e-04,
# 2.4232995e-03, 1.8954457e-05], dtype=float32)
ce.shape
# (10000,)
т.е. ce
теперь содержит то, чтоscore
список в вашем вопросе должен был содержать.
Для подтверждения , давайте рассчитаем потери для всех тестовых образцов, используя model.evaluate
:
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
# Test loss: 0.050856544668227435
иснова вручную, усредняя значения ce
, которые мы только что рассчитали:
import numpy as np
log_loss = np.sum(ce)/ce.shape[0]
log_loss
# 0.05085654296875
, которые, хотя и не совсем равны (из-за различной числовой точности, связанной с двумя способами расчета), они равны практически действительно равны:
log_loss == score[0]
# False
np.isclose(log_loss, score[0])
# True
Теперь адаптация этого к вашему собственному случаю, где форма x_test
равна (10000, 784)
, возможно, прямолинейна ...