Python 为什么历史记录使用递增整数(auc_2,auc_4,…)存储auc和val_auc?

Python 为什么历史记录使用递增整数(auc_2,auc_4,…)存储auc和val_auc?,python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我是keras的初学者,今天我遇到了这种我不知道如何处理的问题。auc和val_auc的值以第一个偶数整数存储在history中,如auc,auc_2,auc_4,auc_6。。。等等 这使我无法在Kfold交叉验证过程中管理和研究这些值,因为我无法访问历史记录.history['auc']值,因为并不总是存在这样的键'auc'。代码如下: from tensorflow.keras.models import Sequential # pylint: disable= import-error

我是keras的初学者,今天我遇到了这种我不知道如何处理的问题。
auc
val_auc
的值以第一个偶数整数存储在
history
中,如
auc
auc_2
auc_4
auc_6
。。。等等

这使我无法在Kfold交叉验证过程中管理和研究这些值,因为我无法访问
历史记录.history['auc']
值,因为并不总是存在这样的键
'auc'
。代码如下:

from tensorflow.keras.models import Sequential # pylint: disable= import-error
from tensorflow.keras.layers import Dense # pylint: disable= import-error
from tensorflow.keras import Input # pylint: disable= import-error
from sklearn.model_selection import StratifiedKFold
from keras.utils.vis_utils import plot_model
from keras.metrics import AUC, Accuracy # pylint: disable= import-error

BATCH_SIZE  = 32
EPOCHS      = 10
K           = 5
N_SAMPLE    = 1168
METRICS     = ['AUC', 'accuracy']

SAVE_PATH   = '../data/exp/final/submodels/'


def create_mlp(model_name, keyword, n_sample= N_SAMPLE, batch_size= BATCH_SIZE, epochs= EPOCHS):

    df = readCSV(n_sample)
    skf = StratifiedKFold(n_splits = K, random_state = 7, shuffle = True)

    for train_index, valid_index in skf.split(np.zeros(n_sample), df[['target']]):

        x_train, y_train, x_valid, y_valid = get_train_valid_dataset(keyword, df, train_index, valid_index)
        model = get_model(keyword)

        history = model.fit(
            x = x_train,
            y = y_train,
            validation_data = (x_valid, y_valid),
            epochs = epochs
        )

def get_train_valid_dataset(keyword, df, train_index, valid_index):
    aux = df[[c for c in columns[keyword]]]
    return aux.iloc[train_index].values, df['target'].iloc[train_index].values, aux.iloc[valid_index].values, df['target'].iloc[valid_index].values

def create_callbacks(model_name, save_path, fold_var):
    checkpoint = ModelCheckpoint(
        save_path + model_name + '_' +str(fold_var),
        monitor=CALLBACK_MONITOR, 
        verbose=1,
        save_best_only= True,
        save_weights_only= True,
        mode='max'
    )

    return [checkpoint]

main.py
中,我调用
create_mlp('model0','euler',n_sample=100)
,日志为(仅相关行):

任何帮助都将不胜感激。我正在使用:

keras==2.3.1
tensorflow==1.14.0
在这一行代码中:

 for train_index, valid_index in skf.split(np.zeros(n_sample), df[['target']]):
实际上,您正在运行多个培训实例,原则上是5,默认值为
sklearn

尽管您在以下方面获得了不同的培训和验证集:

 x_train, y_train, x_valid, y_valid = get_train_valid_dataset(keyword, df, train_index, valid_index)
运行
model.fit()时

您可以看到,
create\u回调的参数是静态的,在不同的训练实例之间不会改变
关键字
型号名称
保存路径
文件夹
是在5个训练实例中保持不变的参数

因此,在TensorBoard中,所有结果都写在同一路径上

您不希望这样做,而是希望每个迭代的结果都写在不同的路径上


您必须更改
logdir
参数,为其指定唯一标识符。在这种情况下,每次训练迭代都会将结果写在不同的位置,因此混淆就会消失。

我通过更改为
tensorflow==2.1.0
解决了这个问题。希望它能帮助其他人。

使用tf.keras.backend.clear\u session()


非常感谢您的帮助。我不敢告诉你,这并不能解决问题。很抱歉,我实际上没有复制问题中的一行
folder=folder+1
,因此
folder
变量会随着培训实例的变化而变化。此外,即使我在没有任何
回调
参数的情况下调用
fit()
方法,问题仍然存在,并且AUC以不同的名称存储,因此问题与回调无关。仍然存在tensorboard日志指向何处的问题,即使folder参数正在更改。能否提供有关create_callbacks()函数的更多详细信息?我编辑了代码,以便您可以查看
get_train_valid_dataset
create_callbacks
functions。但是,我从
fit()
方法中删除了callbacks参数,问题仍然是一样的。
 x_train, y_train, x_valid, y_valid = get_train_valid_dataset(keyword, df, train_index, valid_index)
   history = model.fit(
            x = x_train,
            y = y_train,
            validation_data = (x_valid, y_valid),
            epochs = epochs,
            callbacks=create_callbacks(keyword + '_' + model_name, SAVE_PATH, folder)
        )