CSVLoggerの問題点
kerasのCSVLoggerは学習途中のログをcsv形式でファイルに書き出してくれる優れものですが、一点不満があります。それはファイルに書き出されるタイミングが学習終了後だということです。これは出力がバッファに溜まって、いっぱいになるまで書き出されないのが原因です。このため、学習処理がクラッシュしたときに内容が失われることがあり、困っていました。通常、この問題を解決するには書き出したいタイミングで出力ストリームに対してflush()をすれば良いのですが、CSVLoggerを改造するのはやっかいです。
簡単な解決法
簡便な方法を見つけましたので、共有します。実際にはflush()するわけではありませんが、結果的に解決する方法です。
csv_logger = CSVLogger(file_name, monitor='val_loss', save_best_only=True)
csv_logger._open_args('buffering') = 100
バッファのサイズを設定する方法をソースコードから見つけました。上記のようにして設定します。ここでは100バイトに設定しています。ちなみに0バイトを指定するとエラーになります。
以上です。