Kerasニューラルネットワークモデルを実行すると、コンソールに次のようなものが表示される場合があります。
Epoch 1/3
6/1000 [..............................] - ETA: 7994s - loss: 5111.7661
時間が経つにつれて、損失が改善されることを期待しています。これらの損失を学習できるように、これらの損失を経時的にファイルに記録したいと思います。私が試してみました:
logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
しかし、これは機能しません。この状況でどのレベルのロギングが必要かわかりません。
私も次のようなコールバックを使用してみました:
def generate_train_batch():
while 1:
for i in xrange(0,dset_X.shape[0],3):
yield dset_X[i:i+3,:,:,:],dset_y[i:i+3,:,:]
class LossHistory(keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.losses = []
def on_batch_end(self, batch, logs={}):
self.losses.append(logs.get('loss'))
logloss=LossHistory()
colorize.fit_generator(generate_train_batch(),samples_per_Epoch=1000,nb_Epoch=3,callbacks=['logloss'])
しかし、これは明らかにファイルへの書き込みではありません。方法が何であれ、コールバックやロギングモジュールなどを介して、kerasニューラルネットワークの損失をファイルに記録するためのソリューションをお聞きしたいと思います。ありがとう!
問題に対する簡単な解決策があります。 fit
メソッドのいずれかが使用されるたびに、結果としてHistory Callbackと呼ばれる特別なコールバックが返されます。フィールドhistory
があります。これは、すべてのエポック後に登録されたすべてのメトリックの辞書です。したがって、エポックごとに損失関数値のリストを取得するには、次のようにします。
history_callback = model.fit(params...)
loss_history = history_callback.history["loss"]
このようなリストをファイルに保存するのは簡単です(たとえば、numpy
配列に変換し、savetxt
メソッドを使用する)。
UPDATE:
試してください:
import numpy
numpy_loss_history = numpy.array(loss_history)
numpy.savetxt("loss_history.txt", numpy_loss_history, delimiter=",")
更新2:
すべてのバッチの後に損失を記録する問題の解決策は、 Keras Callbacks Documentation (Create a Callback)で記述されています。
CSVLoggerコールバックを使用できます。
例として:
from keras.callbacks import CSVLogger
csv_logger = CSVLogger('log.csv', append=True, separator=';')
model.fit(X_train, Y_train, callbacks=[csv_logger])
見てください: ケラスのコールバック
古い質問ですが、ここに行きます。 Keras履歴出力は、pandas DataSet入力と完全に一致します。
履歴全体を1行でcsvにしたい場合:pandas.DataFrame(model.fit(...).history).to_csv("history.csv")
乾杯
次のように、model.fitメソッドの前にsys.stdoutオブジェクトをファイルにリダイレクトし、model.fitメソッドの後に標準コンソールに再割り当てできます。
import sys
oldStdout = sys.stdout
file = open('logFile', 'w')
sys.stdout = file
model.fit(Xtrain, Ytrain)
sys.stdout = oldStdout