我在model.fit
和model.test_on_batch
产生的val_loss之间有差异。
对于model.fit
,在批次大小为4且训练集大小为50k的1个历元之后,这是输出
50000/50000 [==============================] - 508s 10ms/step - loss: 1.5587 - acc: 0.9442 - val_loss: 0.6883 - val_acc: 0.9721
注意val_loss = 0.6883
。
然后我停止了训练,并使用model.train_on_batch
训练了模型,每1k批验证一次。我没有重置模型,所以权重没有改变。 1k批处理后,我得到以下输出:
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))
答案 0 :(得分:0)
似乎model.test_on_batch
返回批次条目的损失之和,而model.train_on_batch
返回平均损失,因此可以解决此问题。