2017-10-26 21 views
1

大きなデータセットのために、私はkeras model fittingを(forループ内で)反復して適用しています。私の目標は、データセットを100パーツに分割し、各パーツを一度に読み込み、fit()メソッドを適用することです。keras model fit()を繰り返し適用すると、学習率のステータスはどのくらいですか?

私の質問:各イテレーションでは、fit()方法は、私がモデルのコンパイル時に設定初期学習率(LR = 0.1)から始まるのでしょうか?または、最後に更新された学習率を覚えて、fit()メソッドの新しい呼び出しに直接適用します。

# Define model 
my_model() 

# Set the optimizer 
sgd = SGD(lr=0.1, decay=1e-08, momentum=0.9, nesterov=False) 

# Compile model 
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) 

# Fit model and train 
for j in range(100): 
     print('Data extracting from big matrix ...') 
     X_train = HDF5Matrix(path_train, 'X', start=st, end=ed) 
     Y_train = HDF5Matrix(path_train, 'y', start=st, end=ed) 

     print('Fitting model ...') 
     model.fit(X_train, Y_train, batch_size=100, shuffle='batch', nb_epoch=1, 
       validation_data=(X_test, Y_test)) 

答えて

2

更新学習率はあなたの例では、単にsgd変数ですオプティマイザオブジェクトmodel.optimizer、中に記憶され、次のよう

私のコードサンプルがあります。

LearningRateSchedulerのようなコールバックでは、学習率変数model.optimizer.lrが更新されます(明確にするためにいくつかの行が削除されています)。 decayは、(あなたの例のように)使用されている場合

def on_epoch_begin(self, epoch, logs=None): 
    lr = self.schedule(epoch) 
    K.set_value(self.model.optimizer.lr, lr) 

はしかし、学習率変数は直接更新されていませんが、変数model.optimizer.iterationsが更新されます。この変数は、レコードどのように多くのバッチは、モデルフィッティングで使用されている、と崩壊と学習率はによりSGD.get_updates()で計算されます。モデルはコンパイル再されていない限り、それがますので、いずれの場合においても

lr = self.lr 
if self.initial_decay > 0: 
    lr *= (1./(1. + self.decay * K.cast(self.iterations, 
              K.dtype(self.decay)))) 

新しいfit()コールで更新された学習率を使用してください。

関連する問題