Python 回叫列车与验证性能

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返回验证数据,

您能帮助我理解如何实现回调函数,该函数决定测试和验证数据上模型的性能吗

我在一个很好的网站上读到这篇文章时有点困惑:

len(自我模型验证数据)=3

因为验证\u数据[0]==>train\u x(您在 model.fit())

验证数据[1]==>y列

验证数据[2]=样本重量

如您所见,博客作者提到,
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的输入。所以我使用回调来预测输出,并在每个历元结束时累积所有预测以进行进一步计算。很高兴听到你找到了解决方案。如果你想,你可以发布你的解决方案供未来的人查找。祝你愉快,简