2017-02-26 11 views
3

私はのPythonで神経ネットワークに適合しています。Kerasケラスコールバックアーケードトレーニングと検証の損失を比較する

過剰適合を避けるために、トレーニング/検証の損失を監視し、適切なコールバックを作成して、トレーニングの損失が検証の損失よりもはるかに小さいときに計算を停止したいと考えています。

コールバックの例は次のとおりです。

callback = [EarlyStopping(monitor='val_loss', value=45, verbose=0, mode='auto')] 

は、検証損失に比べて少なすぎる損失を訓練する際の訓練を停止する方法はありますか?

は、あなたがあなたの目的のためにカスタムコールバッククラスを作成することができ、事前

答えて

2

でいただきありがとうございます。

私はあなたのニーズに対応していなければならないものを作成している:私はtrain_lossvalidation_lossの比が一定しきい値以下になった場合、あなたが停止したかったことを解釈する自由を取った

class CustomEarlyStopping(Callback): 
    def __init__(self, ratio=0.0, 
       patience=0, verbose=0): 
     super(EarlyStopping, self).__init__() 

     self.ratio = ratio 
     self.patience = patience 
     self.verbose = verbose 
     self.wait = 0 
     self.stopped_epoch = 0 
     self.monitor_op = np.greater 

    def on_train_begin(self, logs=None): 
     self.wait = 0 # Allow instances to be re-used 

    def on_epoch_end(self, epoch, logs=None): 
     current_val = logs.get('val_loss') 
     current_train = logs.get('loss') 
     if current_val is None: 
      warnings.warn('Early stopping requires %s available!' % 
          (self.monitor), RuntimeWarning) 

     # If ratio current_loss/current_val_loss > self.ratio 
     if self.monitor_op(np.divide(current_train,current_val),self.ratio): 
      self.wait = 0 
     else: 
      if self.wait >= self.patience: 
       self.stopped_epoch = epoch 
       self.model.stop_training = True 
      self.wait += 1 

    def on_train_end(self, logs=None): 
     if self.stopped_epoch > 0 and self.verbose > 0: 
      print('Epoch %05d: early stopping' % (self.stopped_epoch)) 

。この比率の引数は、0.01.0の間にある必要があります。しかし、1.0は、妥当性の喪失と訓練の損失が訓練の始めに不安定な方法で大きく変動する可能性があるため、危険です。

忍耐強い議論を追加することができます。忍耐力の引数を追加すると、特定の回数のエポックにスレッショルドが崩れていないかどうかを確認できます。これを使用する

方法がexampeためです。この場合は

callbacks = [CustomEarlyStopping(ratio=0.5, patience=2, verbose=1), 
      ... Other callbacks ...] 
... 
model.fit(..., callbacks=callbacks) 

トレーニング損失が2つの以上のエポックのため0.5*val_lossよりも低く留まる場合、それは停止します。

これは役立ちますか?

+0

私が必要とするものは、本当にありがとう! –

+0

非常に歓迎:)私はEarlyStoppingクラスのソースコードを取得し、それを適応させました。あなたのニーズに合わせて自由に編集できます。そこには魔法はありません! –

関連する問題