Понимание вычисления метрик в Керасе - PullRequest
1 голос
/ 21 марта 2019

Я попытался реализовать истинную положительную метрику в Керасе:

def TP(y_true, y_pred):
    estimated = K.argmax(y_pred, axis=1)
    truth = K.argmax(y_true, axis=1)
    TP = K.sum(truth * estimated)
    return TP

на основе моей последней формы вывода слоя: (партия, 2) . Функция была протестирована с эквивалентным аргументом argmax и хорошо работает.

Я использую функцию потерь cross_entropy, и в каждую эпоху она дает мне значение метрики. Но как это значение может быть десятичным числом? Что я делаю не так? Спасибо!

Отредактировано : вот пример кода для модели Keras:

def TP(y_true, y_pred):
    estimated = K.argmax(y_pred, axis=1)
    truth = K.argmax(y_true, axis=1)
    TP = K.sum(truth * estimated)
    return TP

epochs = 10
batch_size = 2

model = Sequential([
        Dense(32, input_shape=(4,)),
        Activation('relu'),
        Dense(2),
        Activation('softmax'),
])
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy', TP])

model.summary()

train = np.array([[17,0,1,0],[17,0,1,0],[17,0,1,0],[17,0,1,0],[17,0,1,0], [2,1,0,1],[0,1,0,1],[0,1,0,1],[0,1,0,1],[0,1,0,1]])
labels = np.array([ [1,0],[1,0],[1,0],[1,0],[1,0], [0,1],[0,1],[0,1],[0,1],[0,1] ])

model.fit(train, labels, epochs=epochs, batch_size=batch_size, verbose=2)

А здесь тест, показывающий, что функция TP , похоже, работает

def npTP(y_true, y_pred):
    estimated = np.argmax(y_pred, axis=1)
    truth = np.argmax(y_true, axis=1)
    TP = np.sum(truth * estimated)
    return TP

y_true = np.array([ [1,0],[1,0],[1,0],[1,0],[1,0], [0,1],[0,1],[0,1],[0,1],[0,1] ])
y_pred = np.array([ [0,1],[0,1],[0,1],[0,1],[0,1], [0,1],[0,1],[0,1],[0,1],[0,1]])
print("np check : ")
print(npTP(y_true, y_pred))

Запуск этого кода дает следующий вывод:

Using TensorFlow backend.

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 32)                160       
_________________________________________________________________
activation_1 (Activation)    (None, 32)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 66        
_________________________________________________________________
activation_2 (Activation)    (None, 2)                 0         
=================================================================
Total params: 226
Trainable params: 226
Non-trainable params: 0
_________________________________________________________________
Epoch 1/10
 - 0s - loss: 0.3934 - acc: 0.6000 - TP: 0.2000
Epoch 2/10                           ^^^^^^^^^^ here are the decimal values
 - 0s - loss: 0.3736 - acc: 0.6000 - TP: 0.2000
Epoch 3/10                           ^^^^^^^^^^
 - 0s - loss: 0.3562 - acc: 0.6000 - TP: 0.2000
Epoch 4/10                           ^^^^^^^^^^
 - 0s - loss: 0.3416 - acc: 0.7000 - TP: 0.4000
Epoch 5/10                           ^^^^^^^^^^
 - 0s - loss: 0.3240 - acc: 1.0000 - TP: 1.0000
Epoch 6/10
 - 0s - loss: 0.3118 - acc: 1.0000 - TP: 1.0000
Epoch 7/10
 - 0s - loss: 0.2960 - acc: 1.0000 - TP: 1.0000
Epoch 8/10
 - 0s - loss: 0.2806 - acc: 1.0000 - TP: 1.0000
Epoch 9/10
 - 0s - loss: 0.2656 - acc: 1.0000 - TP: 1.0000
Epoch 10/10
 - 0s - loss: 0.2535 - acc: 1.0000 - TP: 1.0000

np check : 
5

Спасибо!

1 Ответ

0 голосов
/ 26 марта 2019

Как указал десернаут, ответ объясняется в этой теме .

Keras делает промежуточное среднее значение между партиями и эпохами.

Здесь с batch_size=2 и 10 выборками, каждая эпоха проводит 5 тренировок (10/2=5).

Чтобы понять выходную метрику эпохи 1, общее число TP после 5 тренировок должно было быть 1, поэтому метрика дает 1/5 = 0.2.Эпоха 4 имела 2 TP в 5 тренировках, давая 2/5 = 0.4 в метрике.

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