首页 > 解决方案 > 为什么二进制精度与 Keras 中的 train_on_batch 二进制精度不匹配?

问题描述

BinaryAccuracy在玩具分类问题中给出的准确度train_on_batch与 Keras 提供的准确度不同。 这个玩具示例显示了批量训练前后的 BinaryAccuracy。这些并不总是匹配的。完整的可重现代码是:

import numpy as np
from keras.layers import Dense
from keras.models import Model, Sequential
from keras.optimizers import Adam
from keras.layers.advanced_activations import LeakyReLU

## Toy data generation: 
n = 80; p=2
X1 = np.concatenate([np.tile(np.array([10]), (n, p)), np.tile(np.array([20]), (n, p))])
y1 = np.concatenate([np.tile(np.array([0]), (n,)), np.tile(np.array([1]), (n,))])

## Seed:
seed_val = 12
import tensorflow as tf
import random as python_random
np.random.seed(seed_val)
python_random.seed(seed_val)
tf.random.set_seed(seed_val)


# define the keras model
def build_model(X, y):
    model = Sequential()
    model.add(Dense(12, input_dim=p, activation='relu'))
    model.add(LeakyReLU(alpha=0.01))
    model.add(Dense(1, activation='sigmoid'))
    print(model.summary())
    return model

## Build and compile
mod = build_model(X1, y1)
mod.compile(loss='binary_crossentropy', optimizer=Adam(learning_rate=0.005), metrics=[tf.keras.metrics.BinaryAccuracy()])


losses = []; accuracies = []; iteration_checkpoints = []

def train(X_train, y_train, iterations, batch_size, sample_interval):
    for iteration in range(iterations):
        idx = np.random.randint(0, X_train.shape[0], batch_size)
        X_batch = X_train[idx]
        y_batch = y_train[idx]
        
        ## Accuracy before
        m = tf.keras.metrics.BinaryAccuracy()
        m.update_state(np.expand_dims(y_batch, axis=0), mod.predict(X_batch))
        
        ## Train on batch:
        d_loss, accuracy = mod.train_on_batch(X_batch, y_batch)
        
        ## Accuracy after
        m2 = tf.keras.metrics.BinaryAccuracy()
        m2.update_state(np.expand_dims(y_batch, axis=0), mod.predict(X_batch))
        
        print("%d> Before train: %.5f,\t After train: %.5f,\t\t Accuracy: %.5f%%" %(iteration+1, m.result().numpy(), m2.result().numpy(), accuracy*100))
        
        if (iteration + 1) % sample_interval == 0:
            # Save losses and accuracies so they can be plotted after training
            losses.append([d_loss, accuracy]); accuracies.append(100.0 * accuracy); iteration_checkpoints.append(iteration + 1)


model_hist = train(X1, y1, iterations=20, batch_size=32, sample_interval=1)

输出有一行:

17> Before train: 0.53125,   After train: 0.62500,       Accuracy: 100.00000%

为什么会发生这种不匹配?我错过了什么吗?

标签: pythonmachine-learningkeras

解决方案


推荐阅读