2016-08-24 13 views
17

Kiedy załadować cały zestaw danych w pamięci i trenować sieć w Keras za pomocą następującego kodu:Pokaż pasek postępu dla każdej epoki podczas treningu periodycznie w Keras

model.fit(X, y, nb_epoch=40, batch_size=32, validation_split=0.2, verbose=1) 

To generuje pasek postępu za epoki ze wskaźników, takich jak ETA , dokładność, straty itp

Kiedy trenuję sieci w partiach, używam następujący kod

for e in range(40): 
     for X, y in data.next_batch(): 
      model.fit(X, y, nb_epoch=1, batch_size=data.batch_size, verbose=1) 

Spowoduje to pasek postępu dla każdej partii inst ead każdej epoki. Czy możliwe jest wygenerowanie paska postępu dla każdej epoki podczas treningu partiami?

+0

Oto jedna odpowiedź http://stackoverflow.com/a/38579937/5082406 –

Odpowiedz

19

1.

model.fit(X, y, nb_epoch=40, batch_size=32, validation_split=0.2, verbose=1) 

W powyższym zmianie verbose=2, jak to jest wymienione w dokumentacji: "gadatliwy. 0 bez logowania do stdout, 1 do rejestrowania pasek postępu 2 for one log line per epoch"

To będzie pokazać swoją moc jako:

Epoch 1/100 
0s - loss: 0.2506 - acc: 0.5750 - val_loss: 0.2501 - val_acc: 0.3750 
Epoch 2/100 
0s - loss: 0.2487 - acc: 0.6250 - val_loss: 0.2498 - val_acc: 0.6250 
Epoch 3/100 
0s - loss: 0.2495 - acc: 0.5750 - val_loss: 0.2496 - val_acc: 0.6250 
..... 
..... 

2.

Jeśli chcesz pokazać pasek postępu dla zakończenia epok, zachować verbose=0 (który zamyka się zalogowaniu do stdout) i wdrożenia w następujący sposób:

from time import sleep 
import sys 

epochs = 10 

for e in range(epochs): 
    sys.stdout.write('\r') 

    for X, y in data.next_batch(): 
     model.fit(X, y, nb_epoch=1, batch_size=data.batch_size, verbose=0) 

    # print loss and accuracy 

    # the exact output you're looking for: 
    sys.stdout.write("[%-60s] %d%%" % ('='*(60*(e+1)/10), (100*(e+1)/10))) 
    sys.stdout.flush() 
    sys.stdout.write(", epoch %d"% (e+1)) 
    sys.stdout.flush() 

Dane wyjściowe są następujące:

[================================================ ============] 100%, epoka 10

3.

Jeśli chcesz pokazać straty po każdym n partiach, można użyć:

out_batch = NBatchLogger(display=1000) 
model.fit([X_train_aux,X_train_main],Y_train,batch_size=128,callbacks=[out_batch]) 

Chociaż nigdy wcześniej tego nie próbowałem. Powyższy przykład został zaczerpnięty z tego Keras problem GitHub: Show Loss Every N Batches #2850

Można również śledzić prezentację NBatchLogger tutaj:

class NBatchLogger(Callback): 
    def __init__(self, display): 
     self.seen = 0 
     self.display = display 

    def on_batch_end(self, batch, logs={}): 
     self.seen += logs.get('size', 0) 
     if self.seen % self.display == 0: 
      metrics_log = '' 
      for k in self.params['metrics']: 
       if k in logs: 
        val = logs[k] 
        if abs(val) > 1e-3: 
         metrics_log += ' - %s: %.4f' % (k, val) 
        else: 
         metrics_log += ' - %s: %.4e' % (k, val) 
      print('{}/{} ... {}'.format(self.seen, 
             self.params['samples'], 
             metrics_log)) 

4.

Można również użyć progbar postępu, ale to Wydrukuj postęp w trybie wsadowym

from keras.utils import generic_utils 

progbar = generic_utils.Progbar(X_train.shape[0]) 

for X_batch, Y_batch in datagen.flow(X_train, Y_train): 
    loss, acc = model_test.train([X_batch]*2, Y_batch, accuracy=True) 
    progbar.add(X_batch.shape[0], values=[("train loss", loss), ("acc", acc)])