web-dev-qa-db-ja.com

Keras損失出力をファイルに記録する方法

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ニューラルネットワークの損失をファイルに記録するためのソリューションをお聞きしたいと思います。ありがとう!

31
BigBoy1337

問題に対する簡単な解決策があります。 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 DocumentationCreate a Callback)で記述されています。

15
Marcin Możejko

CSVLoggerコールバックを使用できます。

例として:

from keras.callbacks import CSVLogger

csv_logger = CSVLogger('log.csv', append=True, separator=';')
model.fit(X_train, Y_train, callbacks=[csv_logger])

見てください: ケラスのコールバック

61
Alex Glinsky

古い質問ですが、ここに行きます。 Keras履歴出力は、pandas DataSet入力と完全に一致します。

履歴全体を1行でcsvにしたい場合:pandas.DataFrame(model.fit(...).history).to_csv("history.csv")

乾杯

10

次のように、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
1