Почему двоичная точность не совпадает с двоичной точностью train_on_batch в Керасе?

#python #machine-learning #keras

Вопрос:

BinaryAccuracy в задаче классификации игрушек нет такой точности, как точность, обеспечиваемая train_on_batch Keras. Этот пример игрушки показывает, что двоичная точность до и после пакетного обучения. Они не всегда совпадают. Полный воспроизводимый код:

 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,tt 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%
 
  • Перед тренировкой-это result() tf.keras.metrics.BinaryAccuracy перед тренировкой на каждом этапе.
  • После тренировки-это result() tf.keras.metrics.BinaryAccuracy после тренировки на каждом этапе.
  • Точность-это точность, сгенерированная train_on_batch командой. (Увеличение iterations в последней строке кода дает больше таких явлений.)

Почему происходит это несоответствие? Я что-то упускаю?