Keras model.fit и model.test_on_batch возвращают разные значения val_loss (по порядку величины) - PullRequest
0 голосов
/ 17 октября 2019

У меня есть расхождение между значениями val_loss, производимыми model.fit и model.test_on_batch.

Для model.fit, после 1 эпохи размера партии 4 и размера обучающего набора 50k, это вывод

50000/50000 [==============================] - 508s 10ms/step - loss: 1.5587 - acc: 0.9442 - val_loss: 0.6883 - val_acc: 0.9721

Обратите внимание, что val_loss = 0.6883.

Iзатем остановил обучение и обучил модель с model.train_on_batch, проверяя каждые 1k партий. Я не сбрасывал модель, поэтому веса не менялись. После 1 кбайт я получаю такой вывод:

Batch 1139: Train[0.539348,0.977112] ; Val[146.972092,0.972529] ; Duration=0.040436 s

Обратите внимание, что здесь потеря при проверке равна 146.97.... Как это возможно? model.fit выполняет ли некоторую постобработку до потери проверки?


model.fit код

batch_size = 4
epochs = 300

myhist = model.fit(x_test,y_test,batch_size=batch_size,epochs=epochs,shuffle=True,validation_data=(val_x[:1000,],val_y[:1000,]),callbacks=[plot_losses])

model.train_on_batch итерация

n_batches = 500000
batch_size = 4
val_size = 1000
val_freq = 1000

val_loss,val_acc = 0,0

model_check = '17102019_1.hd5'
val_loss_min = 1000000


for ib in range(n_batches):
    batch_init = time.time()
    batch_x,batch_y = generate_mini_batch(batch_size,x_test,y_test,linear_comb=False,trans=False)
    train_loss,train_acc = model.train_on_batch(batch_x,batch_y)
    batch_end = time.time()-batch_init
    clear_output(wait=True)
    if (ib % val_freq == 0) & (ib > 0):        
        val_loss,val_acc = model.test_on_batch(val_x[:val_size,],val_y[:val_size,])
        if val_loss < val_loss_min:
            model.save(model_check)
            val_loss_min = val_loss



    print('Batch %i: Train[%f,%f] ; Val[%f,%f] ; Duration=%f s'%(ib,train_loss,train_acc,val_loss,val_acc,batch_end))

1 Ответ

0 голосов
/ 18 октября 2019

Похоже, model.test_on_batch возвращает сумму потерь записей партии, а model.train_on_batch возвращает среднюю потерю, что решает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...