Kerasでモデルトレーニングを行う場合、ステップごとの反復にかかる時間を計算する方法

7707 ワード

kerasでモデルを訓練する場合、GPUの有無を比較するモデルの訓練時間が具体的にどれほどかかるかを準備するため、fit前後でtimeを呼び出す.time()の方式で計算します.コード:
import time
start = time.clock()
 
history = model.fit(train_img, train_labels, 
					epochs=10, batch_size=128)

print(time.clock() - start)

注意:fitを呼び出すときに発生すること:ネットワークはトレーニングデータ上で反復を開始し(小ロットごとに128サンプルを含む)、合計10回反復し(すべてのトレーニングデータ上で1回反復することを1ラウンド(epoch)と呼ぶ).反復のたびに、ネットワークは、重みに対するロット損失の勾配を計算し、それに応じて重みを更新します.
出力結果においてGPUの有無では有意差は認められなかったが,両者の実行ログの有意差は大きく,検討の準備を進めた.
fitは非同期実行方式を採用しているため,各ラウンドのfit時間を取得するにはkerasのコールバック関数方式で取得する必要がある.
次のように、各ラウンドの反復にかかる時間と、トレーニングの開始から終了までの合計時間を記録するTimeHistoryコールバック関数を定義します.
import time
class TimeHistory(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.times = []
        self.totaltime = time.time()
        
    def on_train_end(self, logs={}):
        self.totaltime = time.time() - self.totaltime
        
    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)

TimeHistoryコールバック関数の使用には注意が必要です.callbacksパラメータは1つのパラメータしかありませんが、[]----callbacks=[time_callback]を追加する必要があります.
time_callback = TimeHistory()       
history = model.fit(train_img, train_labels, 
					epochs=10, batch_size=128, 
					callbacks=[time_callback])

print(time_callback.times)
print(time_callback.totaltime)

取得した出力結果は訓練時の出力結果と類似しており、fit内部の出力結果は:
Epoch 1/10
60000/60000 [==============================] - 23s 383us/step - loss: 0.0132 - acc: 0.9954
Epoch 2/10
60000/60000 [==============================] - 29s 492us/step - loss: 0.0098 - acc: 0.9968
Epoch 3/10
60000/60000 [==============================] - 25s 413us/step - loss: 0.0090 - acc: 0.9967
Epoch 4/10
60000/60000 [==============================] - 22s 367us/step - loss: 0.0085 - acc: 0.9971
Epoch 5/10
60000/60000 [==============================] - 22s 369us/step - loss: 0.0106 - acc: 0.9962
Epoch 6/10
60000/60000 [==============================] - 22s 369us/step - loss: 0.0080 - acc: 0.9975
Epoch 7/10
60000/60000 [==============================] - 22s 369us/step - loss: 0.0080 - acc: 0.9971
Epoch 8/10
60000/60000 [==============================] - 22s 367us/step - loss: 0.0061 - acc: 0.9981
Epoch 9/10
60000/60000 [==============================] - 22s 369us/step - loss: 0.0058 - acc: 0.9979
Epoch 10/10
60000/60000 [==============================] - 22s 368us/step - loss: 0.0078 - acc: 0.9974

コールバック関数によって返される結果は、22.9966884074401855、29.49613428511588447、24.77568817138672、22.01526683258055664、22.1323884443726、22.132263845443726、22.137538194656372、22.160048961639404、22.321362018585852、22.14749526977539、22.77812433242798
【その他】使用中、自分が低級なエラーを犯した場合は、Keras fit関数にコールバック関数が入力されているのを見て、「TypeError:set_model()missing 1 required positional argument:『model』」エラーを提示する