Я пытаюсь понять, какова точность " acc ", показанная на индикаторе прогресса keras в конце эпохи:
13/13 [==== [==============================] - 0s 76us / шаг - потеря: 0,7100 - по : 0,4615
В конце эпохи должна быть точность модельных предсказаний всех обучающих выборок.Однако, когда модель оценивается на одних и тех же обучающих выборках, фактическая точность может сильно отличаться.
Ниже приведен адаптированный пример MLP для двоичной классификации с веб-страницы keras .Простая последовательная нейронная сеть выполняет двоичную классификацию случайно сгенерированных чисел.Размер партии равен количеству обучающих примеров (13), поэтому каждая эпоха содержит только один шаг.Поскольку для потерь задано значение binary_crossentropy
, для расчета точности используется binary_accuracy
, определенный в metrics.py .MyEval
класс определяет обратный вызов, который вызывается в конце каждой эпохи.Он использует два способа вычисления точности данных обучения: а) оценка модели и б) прогноз модели, чтобы получить прогноз, а затем почти тот же код, который используется в функции keras binary_accuracy
.Эти две точности соответствуют друг другу, но в большинстве случаев они отличаются от той, что указана в индикаторе выполнения.Почему они разные?Можно ли рассчитать ту же точность, что и в индикаторе выполнения?Или я допустил ошибку в своих предположениях?
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras import callbacks
np.random.seed(1) # fix random seed for reproducibility
# Generate dummy data
x_train = np.random.random((13, 20))
y_train = np.random.randint(2, size=(13, 1))
model = Sequential()
model.add(Dense(64, input_dim=20, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
class MyEval(callbacks.Callback):
def on_epoch_end(self, epoch, logs=None):
my_accuracy_1 = self.model.evaluate(x_train, y_train, verbose=0)[1]
y_pred = self.model.predict(x_train)
my_accuracy_2 = np.mean(np.equal(y_train, np.round(y_pred)))
print("my accuracy 1: {}".format(my_accuracy_1))
print("my accuracy 2: {}".format(my_accuracy_2))
my_eval = MyEval()
model.fit(x_train, y_train,
epochs=5,
batch_size=13,
callbacks=[my_eval],
shuffle=False)
Вывод приведенного выше кода:
13/13 [==============================] - 0s 25ms/step - loss: 0.7303 - acc: 0.5385
my accuracy 1: 0.5384615659713745
my accuracy 2: 0.5384615384615384
Epoch 2/5
13/13 [==============================] - 0s 95us/step - loss: 0.7412 - acc: 0.4615
my accuracy 1: 0.9230769276618958
my accuracy 2: 0.9230769230769231
Epoch 3/5
13/13 [==============================] - 0s 77us/step - loss: 0.7324 - acc: 0.3846
my accuracy 1: 0.9230769276618958
my accuracy 2: 0.9230769230769231
Epoch 4/5
13/13 [==============================] - 0s 72us/step - loss: 0.6543 - acc: 0.5385
my accuracy 1: 0.9230769276618958
my accuracy 2: 0.9230769230769231
Epoch 5/5
13/13 [==============================] - 0s 76us/step - loss: 0.6459 - acc: 0.6923
my accuracy 1: 0.8461538553237915
my accuracy 2: 0.8461538461538461
с использованием: Python 3.5.2, tenorflow-gpu == 1.14.0Керас == 2.2.4 numpy == 1.15.2