回调返回训练和验证性能

时间:2018-08-14 08:50:02

标签: python performance tensorflow callback keras

您能帮助我了解如何实现一个回调函数,该函数确定测试验证数据上模型的性能吗?

我从一个不错的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 他找到了,但无法找回。我搜索了此文件,但显然已将其删除。

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

1 个答案:

答案 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