#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
в последней строке кода дает больше таких явлений.)
Почему происходит это несоответствие? Я что-то упускаю?