val_auc上的Keras EarlyStopping回调神秘地运行

问题描述

使用Keras进行简单的DL gridsearchcv建模

epochs = [1,6,11,16,21,26,31,36,41,46]
batch_size = [2,4]

stopper = EarlyStopping(monitor='val_auc',patience= 10,mode = 'max',min_delta = 1,restore_best_weights=True)
save_mod = ModelCheckpoint(r'C:\......................\best_model.h5',monitor='val_acc',mode='max',save_best_only=True,save_freq = 'epoch')

param_grid = dict(epochs = epochs,batch_size = batch_size)

def create_classify_model(learn_rate = 0.01,momentum = 0):
            # create model
            network = Sequential()
            #input layer and 1st hidden layer
            network.add(Dense(units = data_seg.x_tr.shape[1],activation="relu",input_shape = 
(data_seg.x_tr.shape[1],)))

            #dropout layer for input layer
            network.add(Dropout(0.2,input_shape = (data_seg.x_tr.shape[1],)))

            #second hidden layer
            network.add(Dense(units = math.trunc(data_seg.x_tr.shape[1]*0.8),activation = "relu"))

            #dropout layer for hidden layer
            network.add(Dropout(0.5))

            #output layer
            network.add(Dense(units = len(np.unique(data_seg.y_tr)),activation = "softmax"))

            optimizer = SGD(lr=learn_rate,momentum=momentum)

            #compiling neural network
            network.compile(loss = "categorical_crossentropy",optimizer = optimizer,metrics = 
['acc',auc_metric()])

            return network

neural_network = KerasClassifier(build_fn=create_classify_model,workers = -1,use_multiprocessing = 
True,verbose=2)
grid = gridsearchcv(estimator=neural_network,param_grid=param_grid)

fit_params = dict(callbacks=[stopper,save_mod],validation_split = 0.05)

grid_model = grid.fit(data_seg.x_tr,data_seg.y_tr,**fit_params)

输出

471/471 - 1s - loss: 0.7568 - acc: 0.6019 - auc: 0.6357 - val_loss: 0.4909 - val_acc: 0.7600 - 
val_auc: 0.8676
125/125 - 0s - loss: 0.5264 - acc: 0.7751 - auc: 0.8459
WARNING:tensorflow:Early stopping conditioned on metric `val_auc` which is not available. Available 
metrics are: loss,acc,auc_1,val_loss,val_acc,val_auc_1
472/472 - 1s - loss: 0.7242 - acc: 0.6288 - auc_1: 0.6494 - val_loss: 0.5680 - val_acc: 0.7000 - 
val_auc_1: 0.7896
124/124 - 0s - loss: 0.6316 - acc: 0.6250 - auc_1: 0.6942
WARNING:tensorflow:Early stopping conditioned on metric `val_auc` which is not available. Available 
metrics are: loss,auc_2,val_auc_2
472/472 - 1s - loss: 0.7193 - acc: 0.6182 - auc_2: 0.6563 - val_loss: 0.5279 - val_acc: 0.7400 - 
val_auc_2: 0.8544
124/124 - 0s - loss: 0.5929 - acc: 0.7863 - auc_2: 0.7995
WARNING:tensorflow:Early stopping conditioned on metric `val_auc` which is not available. Available 
metrics are: loss,auc_3,val_auc_3
472/472 - 1s - loss: 0.7060 - acc: 0.6299 - auc_3: 0.6649 - val_loss: 0.5369 - val_acc: 0.8000 - 
val_auc_3: 0.8400
124/124 - 0s - loss: 0.5564 - acc: 0.7661 - auc_3: 0.8305
WARNING:tensorflow:Early stopping conditioned on metric `val_auc` which is not available. Available 
metrics are: loss,auc_4,val_auc_4
472/472 - 1s - loss: 0.7258 - acc: 0.6161 - auc_4: 0.6398 - val_loss: 0.5676 - val_acc: 0.7400 - 
val_auc_4: 0.7936

此处的输出表明,用于监视EarlyStopping的val_auc指标已赋予一个整数值,该值随我想的每个批次结束而增加。因此,有人可以帮助我了解在这种情况下如何监视val_auc吗?

解决方法

您需要提高TensorFlow版本,这是TensorFlow 1.14的问题。将您的TensorFlow更新为2.1,您的问题将得到解决。

例如,Why is history storing auc and val_auc with incrementing integers (auc_2,auc_4,...)?发生了类似的问题,解决方案是将版本更新为TF 2.1(使用TF 1.14)

,

在再次创建模型之前,运行tf.keras.backend.clear_session()。

https://www.tensorflow.org/api_docs/python/tf/keras/backend/clear_session