Python 回叫列车与验证性能
您能帮助我理解如何实现回调函数,该函数决定测试和验证数据上模型的性能吗 我在一个很好的网站上读到这篇文章时有点困惑: len(自我模型验证数据)=3 因为验证\u数据[0]==>train\u x(您在 model.fit()) 验证数据[1]==>y列 验证数据[2]=样本重量 如您所见,博客作者提到,Python 回叫列车与验证性能,python,performance,tensorflow,callback,keras,Python,Performance,Tensorflow,Callback,Keras,您能帮助我理解如何实现回调函数,该函数决定测试和验证数据上模型的性能吗 我在一个很好的网站上读到这篇文章时有点困惑: len(自我模型验证数据)=3 因为验证\u数据[0]==>train\u x(您在 model.fit()) 验证数据[1]==>y列 验证数据[2]=样本重量 如您所见,博客作者提到,validation\u data是培训数据。从关键字“validation_data”(也用于model.fit中)中,我假设self.model.validation_data返回验证数据,
validation\u data
是培训数据。从关键字“validation_data”(也用于model.fit
中)中,我假设self.model.validation_data
返回验证数据,类似self.model.x
的内容将返回训练数据(如model.fit(x=…,)
是训练数据的输入)
有人能解释一下吗
提前谢谢你的帮助
编辑: 我用
dir(self)
检查了训练数据是否有类似x的东西。但事实上,只有验证数据。有人能告诉我如何区分测试和验证吗?
validation\u data
是否始终是中使用的培训数据
def on_train_end(self, logs={}):
使用时,验证数据将成为实际的验证集
def on_epoch_end(self, epoch, logs={}):
编辑:
在本文中,作者讨论了self.model.training\u数据
他找到了,但找不到。我搜索了这个,但很明显,它被删除了
因此,我的问题可能更为关键:如何在回调中加载一个历元结束时使用的训练数据。答案非常简单
在执行model.fit()之前,可以将任何内容粘贴到模型上。
我刚把X_火车和Y_火车粘在上面了。您可以在这里粘贴验证或测试数据,无论您想要什么
model.X_train=X_train
model.Y_train=Y_train
然后,在sklearn库中使用这些值来计算任何性能(精度、f1、kappa等)
首先,向self添加变量,以便以后将每个历元结果附加到变量
class yourowncallbackname(Callback):
def_on_train_begin(self,logs={}):
self.val_f1=[] #define the variable to collect results
self.val_kappa=[]
然后在同一个类“yourowncallbackname”(在epoch end上效果最好)中定义每个纪元的末尾发生的事情。在这里,您可以使用粘贴到模型上的数据(例如
也许,取决于你想预测什么,你必须用四舍五入的方法来预测
val_predict = (np.asarray(self.model.predict(self.model.X_train))).round()
然后计算您喜欢的预测数据的任何性能(与“列车开始”中的定义相同),例如测试和验证
_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。这将粘贴到回调本身,您可以稍后再次调用回调
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
答案很简单
在执行model.fit()之前,可以将任何内容粘贴到模型上。
我只是把X和Y列粘在上面。你可以在这里把验证或测试数据粘在上面,不管你想要什么
model.X_train=X_train
model.Y_train=Y_train
然后,在sklearn库中使用这些值来计算任何性能(精度、f1、kappa等)
首先,向self添加变量,以便以后将每个历元结果附加到变量
class yourowncallbackname(Callback):
def_on_train_begin(self,logs={}):
self.val_f1=[] #define the variable to collect results
self.val_kappa=[]
然后定义在同一类“yourowncallbackname”中每个历元的结束时发生的情况(历元结束时效果最好)
也许,取决于你想预测什么,你必须用四舍五入的方法来预测
val_predict = (np.asarray(self.model.predict(self.model.X_train))).round()
然后计算您喜欢的预测数据的任何性能(与“列车开始”中的定义相同),例如测试和验证
_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。这将粘贴到回调本身,您可以稍后再次调用回调
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
你找到解决方案了吗?我现在有同样的问题。我需要在每个历元获得训练数据来绘制混淆矩阵。我希望这有助于你找到解决方案吗?我现在有同样的问题。我需要在每个历元获得训练数据来绘制混淆矩阵。我希望这有助于谢谢你,我找到了一种不同的方法,因为我我使用tf.dataset api迭代器作为model.fit的输入。因此我使用回调来预测输出,并在每个历元结束时累积所有预测,以进行进一步计算。很高兴听到您找到了解决方案。如果您愿意,您可以发布您的解决方案,供未来的人们查找。祝您愉快,谢谢,我找到了一个不同的解决方案另外,因为我使用tf.dataset api迭代器作为model.fit的输入。所以我使用回调来预测输出,并在每个历元结束时累积所有预测以进行进一步计算。很高兴听到你找到了解决方案。如果你想,你可以发布你的解决方案供未来的人查找。祝你愉快,简