Python 为什么历史记录使用递增整数(auc_2,auc_4,…)存储auc和val_auc?
我是keras的初学者,今天我遇到了这种我不知道如何处理的问题。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
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)
)