EarlyStopping TensorFlow 2.0 - PullRequest
       0

EarlyStopping TensorFlow 2.0

1 голос
/ 27 января 2020

Я использую код, используя Python 3.7.5 с TensorFlow 2.0 для классификации MNIST. Я использую EarlyStopping из TensorFlow 2.0, и обратный вызов, который у меня есть для этого:

callbacks = [
             tf.keras.callbacks.EarlyStopping(
                 monitor='val_loss', patience = 3,
                 min_delta=0.001
             )
]

Согласно EarlyStopping - TensorFlow 2.0 , определение * 1008 Параметр * min_delta имеет следующий вид:

min_delta: минимальное изменение отслеживаемого количества, которое можно квалифицировать как улучшение, т.е. абсолютное изменение меньше, чем min_delta, будет считаться отсутствием улучшения.

Поезд на 60000 образцов, проверка на 10000 образцов

Эпоха 1/15 60000/60000 [================== =============] - 10 с 173 мкс / выборка - потеря: 0,2040 - точность: 0,9391 - val_loss: 0,1117 - val_accuracy: 0,9648

Epoch 2/15 60000/60000 [= =============================] - 9 с 150 мс / выборка - потеря: 0,0845 - точность: 0,9736 - val_loss: 0,0801 - val_accuracy: 0,9748

Epoch 3/15 60000/60000 [=============================] - 9 с. 151 долл. / выборка - потеря: 0,0574 - точность: 0,9817 - val_loss: 0,0709 - val_accuracy: 0,9795

Epoch 4/15 6 0000/60000 [====================================] - 9 с 149 мкс / выборка - потеря: 0,0434 - точность: 0,9858 - val_loss : 0.0787 - val_accuracy: 0.9761

Epoch 5/15 60000/60000 [============================== ] - 9 с 151 мкс / выборка - потеря: 0,0331 - точность: 0,9893 - val_loss: 0,0644 - val_accuracy: 0,9808

Epoch 6/15 60000/60000 [============== ================] - 9 с 150 мс / выборка - потеря: 0,0275 - точность: 0,9910 - val_loss: 0,0873 - val_accuracy: 0,9779

Epoch 7/15 60000 / 60000 [===============================] - 9 с 151 мкс / выборка - потеря: 0,0232 - точность: 0,9921 - val_loss: 0,0746 - val_accuracy: 0,9805

Epoch 8/15 60000/60000 [=============================] - 9s 151us / sample - потеря: 0,0188 - точность: 0,9936 - val_loss: 0,1088 - val_accuracy: 0,9748

Теперь, если я посмотрю на последние три эпохи, а именно на 6, 7 и 8, и посмотрю при потерях проверки ('val_loss') их значения:

0.0688, 0,0843 и 0,0847.

CES между последовательными 3 терминами: 0,0155, 0,0004. Но не первое отличие больше, чем 'min_delta', как определено в обратном вызове.

Код, который я придумал для EarlyStopping, выглядит следующим образом:

# numpy array to hold last 'patience = 3' values-
pv = [0.0688, 0.0843, 0.0847]

# numpy array to compute differences between consecutive elements in 'pv'-
differences = np.diff(pv, n=1)

differences
# array([0.0155, 0.0004])


# minimum change required for monitored metric's improvement-
min_delta = 0.001

# Check whether the consecutive differences is greater than 'min_delta' parameter-
check = differences > min_delta

check
# array([ True,  False])

# Condition to see whether all 3 'val_loss' differences are less than 'min_delta'
# for training to stop since EarlyStopping is called-
if np.all(check == False):
    print("Stop Training - EarlyStopping is called")
    # stop training 

Но согласно 'val_loss', различия между не ВСЕМИ из 3 последних эпох больше, чем ' min_delta '0,001. Например, первая разница больше 0,001 (0,0843 - 0,0688), а вторая разница меньше 0,001 (0,0847 - 0,0843).

Кроме того, согласно терпение определение параметра " EarlyStopping ":

терпение: количество эпох без улучшений, после которых обучение будет остановлено.

Итак, EarlyStopping следует вызывать, когда улучшения для val_loss нет «для 3 последовательных эпох, где абсолютное изменение меньше, чем« min_delta », не считается улучшением.

Тогда почему вызывается EarlyStopping?

Код для определения модели и« fit () »: :

import tensorflow_model_optimization as tfmot 
from tensorflow_model_optimization.sparsity import keras as sparsity 
import matplotlib.pyplot as plt from tensorflow.keras.layers import AveragePooling2D, Conv2D
from tensorflow.keras import models, layers, datasets 
from tensorflow.keras.layers import Dense, Flatten, Reshape, Input, InputLayer 
from tensorflow.keras.models import Sequential, Model

# Specify the parameters to be used for layer-wise pruning, NO PRUNING is done here: 
pruning_params_unpruned = {
    'pruning_schedule': sparsity.PolynomialDecay(
        initial_sparsity=0.0, final_sparsity=0.0,
        begin_step = 0, end_step=0, frequency=100) }


def pruned_nn(pruning_params):
    """
    Function to define the architecture of a neural network model
    following 300 100 architecture for MNIST dataset and using
    provided parameter which are used to prune the model.

    Input: 'pruning_params' Python 3 dictionary containing parameters which are used for pruning
    Output: Returns designed and compiled neural network model
    """

    pruned_model = Sequential()
    pruned_model.add(l.InputLayer(input_shape=(784, )))
    pruned_model.add(Flatten())
    pruned_model.add(sparsity.prune_low_magnitude(
        Dense(units = 300, activation='relu', kernel_initializer=tf.initializers.GlorotUniform()),
        **pruning_params))
    # pruned_model.add(l.Dropout(0.2))
    pruned_model.add(sparsity.prune_low_magnitude(
        Dense(units = 100, activation='relu', kernel_initializer=tf.initializers.GlorotUniform()),
        **pruning_params))
    # pruned_model.add(l.Dropout(0.1))
    pruned_model.add(sparsity.prune_low_magnitude(
        Dense(units = num_classes, activation='softmax'),
        **pruning_params))

    # Compile pruned CNN-
    pruned_model.compile(
        loss=tf.keras.losses.categorical_crossentropy,
        # optimizer='adam',
        optimizer=tf.keras.optimizers.Adam(lr = 0.001),
        metrics=['accuracy'])

    return pruned_model


batch_size = 32
epochs = 50



# Instantiate NN- 
orig_model = pruned_nn(pruning_params_unpruned)


# Train unpruned Neural Network-
history_orig = orig_model.fit(
    x = X_train, y = y_train,
    batch_size = batch_size,
    epochs = epochs,
    verbose = 1,
    callbacks = callbacks,
    validation_data = (X_test, y_test),
    shuffle = True )

1 Ответ

1 голос
/ 28 января 2020

Поведение обратного вызова с ранней остановкой связано с:

  • Метри c или потерей, подлежащей мониторингу
  • min_delta, которая является минимальным количеством, которое следует считать улучшение между производительностью отслеживаемого количества в текущей эпохе и наилучшим результатом в этом метри c.
  • patience, которое является числом epochs без улучшений (принимая во внимание, что улучшения должны быть более значительными, чем min_delta) перед остановкой алгоритма.

В вашем случае лучший val_loss равно 0.0644 и должно иметь значение ниже 0.0634 для регистрации в качестве улучшения:

Epoch 6/15 val_loss: 0.0873 | Difference is: + 0.0229
Epoch 7/15 val_loss: 0.0746 | Difference is: + 0.0102
Epoch 8/15 val_loss: 0.1088 | Difference is: + 0.0444

Имейте в виду, что количества, напечатанные в «журнале обучения», являются приблизительными и Вы не должны основывать свои предположения на этих значениях. Лучше принять во внимание истинные значения из обратных вызовов или историю обучения.

Ссылка

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