Я использую код, используя 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 )