您能帮助我了解如何实现一个回调函数,该函数确定测试和验证数据上模型的性能吗?
我从一个不错的block entry读到这篇文章时有些困惑:
len(self.model.validation_data)== 3,
因为validation_data [0] ==> train_x(您在 model.fit()),
validation_data [1] ==> train_y,
validation_data [2] =样本权重。
如您所见,博客作者提到validation_data
是培训数据。根据在model.fit
中也使用过的关键字“ validation_data”,我假设self.model.validation_data
返回了验证数据,而类似self.model.x
的东西将返回训练数据(因为model.fit(x= ...,)
是训练数据的输入)
有人可以阐明这一点吗?
预先感谢您的帮助
编辑:
我用dir(self)
检查了训练数据是否会像x
这样。但是确实只有validation_data
。有人可以向我解释如何区分测试和验证吗?
validation_data
始终是
def on_train_end(self, logs={}):
和validation_data成为使用时的实际验证集?
def on_epoch_end(self, epoch, logs={}):
编辑编辑:
在the same block中,作者谈论了self.model.training_data
他找到了,但无法找回。我搜索了此文件,但显然已将其删除。
所以我的问题可能更重要:如何在回调的某个时期结束时加载使用的训练数据。
答案 0 :(得分:1)
答案很简单。
在执行model.fit()之前,您可以将任何内容粘贴到模型上。 我只是坚持X_train和Y_train。您可以根据需要在其中粘贴验证或测试数据。
model.X_train=X_train
model.Y_train=Y_train
然后,您将这些值与sklearn库一起使用以计算任何性能(准确性,f1,kappa,...)
首先,向自身添加变量,以便以后可以将每个时期结果附加到变量
class yourowncallbackname(Callback):
def_on_train_begin(self,logs={}):
self.val_f1=[] #define the variable to collect results
self.val_kappa=[]
然后在同一类“ yourowncallbackname”中定义每个纪元的末尾会发生什么(在纪元末尾效果最佳)。在这里,您可以使用粘贴在模型上的数据(例如
model.x_train) to get the results from model.predict.
def on_epoch_end(self, epoch, logs={}):
#LOAD DATA
train_predict= (np.asarray(self.model.predict(self.model.X_train)))
train_true=self.model.Y_train_jan
val_predict = np.asarray(self.model.predict(self.validation_data[0]))
val_true = self.validation_data[1]
也许,取决于您要预测的内容,您必须使用.round
将预测取整 val_predict = (np.asarray(self.model.predict(self.model.X_train))).round()
然后计算您想要的预测数据(与on_train_begin中定义的数据相同)的任何性能,例如测试和验证
_train_f1= f1_score(train_true, train_predict, labels=...)
_train_k= cohen_kappa_score(train_true.ravel(),train_predict,labels=...)
_val_f1= f1_score(val_true, val_predict, labels=...)
_val_k= cohen_kappa_score(val_true.ravel(), val_predict, labels=...)
要收集它们,请立即将其粘贴到自身上。这将保留在回调本身上,您以后可以再次调用。
self.train_f1.append(_train_f1)
self.train_kappa.append(_train_k)
self.val_f1.append(_val_f1)
self.val_kappa.append(_val_k)
现在,无论您想适合模型的何处,都必须初始化此回调
callbackmetric=yourowncallbackname()
然后您可以将其放入合适的位置:
history=model.fit(...
callbacks=[callbackmetric])
如果您现在想按时期使用附加结果,则可以像调用班级一样调用它们
Yourcallbackresults.val_f1=callbackmetric.val_f1
Yourcallbackresults.train_f1=callbackmetric.train_f1
为完成操作,我将再次发布回调总数类。您只需为其参数等添加正确的性能计算即可。
class yourowncallbackname(Callback):
def on_train_begin(self, logs={}):
self.val_f1 = []
self.val_k = []
self.train_f1 = []
self.train_k = []
def on_epoch_end(self, epoch, logs={}):
#LOAD DATA
train_predict= (np.asarray(self.model.predict(self.model.X_train)))
train_true=self.model.Y_train_jan
val_predict = np.asarray(self.model.predict(self.validation_data[0]))
val_true = self.validation_data[1]
#CALC. PERFORMANCE
_train_f1= f1_score(...)
_train_k= cohen_kappa_score(...)
_val_f1= f1_score(...)
_val_k= cohen_kappa_score(...)
self.train_f1.append(_train_f1)
self.train_k.append(_train_k)
self.val_f1.append(_val_f1)
self.val_k.append(_val_k)
print (" val_f1: %f val_k: %f" %(_val_f1, _val_k))
return