python - 回调返回训练和验证性能
问题描述
你能帮我理解如何实现一个回调函数来确定模型在测试和验证数据上的性能吗?
我从一个不错的块条目中读到这个有点困惑:
len(self.model.validation_data) == 3,
因为validation_data[0] ==> train_x(你在model.fit()中输入),
验证数据[1] ==> train_y,
验证数据[2]=样本重量。
如您所见,博主提到validation_data
这里是训练数据。从也用于的关键字“validation_data”中,model.fit
我假设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={}):
编辑编辑:
在同一块作者谈到self.model.training_data
他找到但无法检索。我搜索了这个,但显然它已被删除。
所以我的问题可能更重要:如何在回调中的一个时期结束时加载使用过的训练数据。
解决方案
答案很简单。
在执行 model.fit() 之前,您可以将任何东西粘贴到模型上。我只是坚持 X_train 和 Y_train 。你可以在这里粘贴验证或测试数据,无论你想要什么。
model.X_train=X_train
model.Y_train=Y_train
然后,您将这些值与 sklearn 库一起使用来计算任何性能(准确度、f1、kappa、...)
首先,将变量添加到 self 以便稍后将每个 epoch 结果附加到变量
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])
如果您现在想使用每个 epoch 的附加结果,您可以像调用类一样调用它们
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
推荐阅读
- jetty - 是否可以在 Jetty 中使用 InetAccessHandler 以及 X-Forwarded-For 标头?
- javascript - 如何在响应ajax jquery后创建数据表
- angularjs - 如何解决 Angular cli 中的引导程序问题
- git - 如何git忽略特定的无扩展名文件
- node.js - 如果循环多次,则递归函数内的循环失败
- html - 为图像制作波浪效果
- javascript - 自动将框六调整为文本输入行?
- c++ - Qt C++ 中 QMap().begin() 函数的不明显行为
- django - nginx、flower、Django、proxy_pass 和拒绝无效的 HOST
- assembly - 无法在我用 C 编写的内核中编写 char 数组