У меня есть расхождение между значениями 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))