異なるモデル間の計算時間を比較したい。フィット中に、エポックごとの計算時間がコンソールに出力されます。
Epoch 5/5
160000/160000 [==============================] - **10s** ......
これらの時間を、各エポックに保存され、履歴オブジェクトを介して利用できるモデルメトリックと同様の方法で保存する方法を探しています。
次のコールバックを試してください:
class TimeHistory(keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.times = []
def on_Epoch_begin(self, batch, logs={}):
self.Epoch_time_start = time.time()
def on_Epoch_end(self, batch, logs={}):
self.times.append(time.time() - self.Epoch_time_start)
次に:
time_callback = TimeHistory()
model.fit(..., callbacks=[..., time_callback],...)
times = time_callback.times
この場合、times
はエポック計算時間を格納する必要があります。
marcinMożejkoの回答を参照してください
import time
class TimeHistory(keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.times = []
def on_Epoch_begin(self, Epoch, logs={}):
self.Epoch_time_start = time.time()
def on_Epoch_end(self, Epoch, logs={}):
self.times.append(time.time() - self.Epoch_time_start)
その後
time_callback = TimeHistory()
model.fit(..., callbacks=[..., time_callback],...)
実行ログ
Train on 17000 samples, validate on 8000 samples
Epoch 1/3
17000/17000 [==============================] - 5s 266us/step - loss: 36.7562 - mean_absolute_error: 4.5074 - val_loss: 34.2384 - val_mean_absolute_error: 4.3929
Epoch 2/3
17000/17000 [==============================] - 4s 253us/step - loss: 33.5529 - mean_absolute_error: 4.2956 - val_loss: 32.0291 - val_mean_absolute_error: 4.2484
Epoch 3/3
17000/17000 [==============================] - 5s 265us/step - loss: 31.0547 - mean_absolute_error: 4.1340 - val_loss: 30.6292 - val_mean_absolute_error: 4.1480
その後
print(time_callback.times)
出力
[4.531331300735474, 4.308278322219849, 4.505300283432007]
Benjamin Striner に応じて、次の行に沿ってkerasコールバックを記述できます
from time import time
class TimingCallback(Callback):
def __init__():
self.logs=[]
def on_Epoch_begin(Epoch, logs={}):
self.starttime=time()
def on_Epoch_end(Epoch, logs={}):
self.logs.append(time()-self.starttime)
...
cb = TimingCallback()
model.fit(..., callbacks=[cb])
print(cb.logs)