Как рассчитывается точность keras в индикаторе выполнения?Из каких источников рассчитывается?Как это повторить? - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь понять, какова точность " 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

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Вы используете случайные изображения и случайные метки.Я создал модель с реальными изображениями и случайными метками.Я получил аналогичный результат.Потому что случайные изображения и метки не являются линейно зависимыми.Я рекомендую вам набор данных, состоящий из реальных изображений и реальных меток.

0 голосов
/ 11 июля 2019

Я думаю, что это связано с использованием Dropout.Пропуск возможен только во время тренировки, но не во время оценки или прогнозирования.Отсюда и несоответствие погрешностей во время обучения и оценки / прогнозирования.

Кроме того, точность обучения, отображаемая в столбце, показывает усредненную точность за период обучения, усредненную по точности партий, рассчитанной после каждой партии.Имейте в виду, что параметры модели настраиваются после каждой партии, так что точность, показанная в столбце в конце, не совсем соответствует точности проверки после окончания эпохи (поскольку точность обучения рассчитывается с использованием различных параметров модели в соответствии спартия, и точность проверки рассчитывается с одинаковыми параметрами для всех партий).

Это ваш пример с большим количеством данных (следовательно, более одной эпохи) и без выпадения:

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((200, 20))
y_train = np.random.randint(2, size=(200, 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 after epoch {}: {}".format(epoch + 1,my_accuracy_1))
        print("my accuracy 2 after epoch {}: {}".format(epoch + 1,my_accuracy_2))


my_eval = MyEval()

model.fit(x_train, y_train,
          epochs=5,
          batch_size=13,
          callbacks=[my_eval],
          shuffle=False)

Вывод гласит:

Train on 200 samples
Epoch 1/5
my accuracy 1 after epoch 1: 0.5450000166893005
my accuracy 2 after epoch 1: 0.545
200/200 [==============================] - 0s 2ms/sample - loss: 0.6978 - accuracy: 0.5350
Epoch 2/5
my accuracy 1 after epoch 2: 0.5600000023841858
my accuracy 2 after epoch 2: 0.56
200/200 [==============================] - 0s 383us/sample - loss: 0.6892 - accuracy: 0.5550
Epoch 3/5
my accuracy 1 after epoch 3: 0.5799999833106995
my accuracy 2 after epoch 3: 0.58
200/200 [==============================] - 0s 496us/sample - loss: 0.6844 - accuracy: 0.5800
Epoch 4/5
my accuracy 1 after epoch 4: 0.6000000238418579
my accuracy 2 after epoch 4: 0.6
200/200 [==============================] - 0s 364us/sample - loss: 0.6801 - accuracy: 0.6150
Epoch 5/5
my accuracy 1 after epoch 5: 0.6050000190734863
my accuracy 2 after epoch 5: 0.605
200/200 [==============================] - 0s 393us/sample - loss: 0.6756 - accuracy: 0.6200

ПроверкаТочность после эпохи в значительной степени напоминает усредненную точность обучения в конце эпохи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...