回调返回列车和验证性能

问题描述 投票:0回答:1

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

我从一个漂亮的block entry读到这个有点困惑:

len(self.model.validation_data)== 3,

因为validation_data [0] ==> train_x(你在model.fit()中输入),

validation_data [1] ==> train_y,

validation_data [2] = sample_weight。

正如你所看到的,博客提到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,但无法找回。我搜索了这个,但很明显,它已被删除。

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

python performance tensorflow callback keras
1个回答
1
投票

答案很简单。

在你做model.fit()之前,你可以将任何东西粘在模型上。我只是把X_train和Y_train粘在上面。无论你想要什么,你都可以在这里坚持验证或测试数据。

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上效果最好)。在这里,您可以使用贴在模型上的数据(例如

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
© www.soinside.com 2019 - 2024. All rights reserved.