首页 > 解决方案 > 回调返回训练和验证性能

问题描述

你能帮我理解如何实现一个回调函数来确定模型在测试验证数据上的性能吗?

我从一个不错的块条目中读到这个有点困惑:

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 他找到但无法检索。我搜索了这个,但显然它已被删除。

所以我的问题可能更重要:如何在回调中的一个时期结束时加载使用过的训练数据。

标签: pythonperformancetensorflowcallbackkeras

解决方案


答案很简单。

在执行 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

推荐阅读