Keras model.fit和model.test_on_batch返回不同的val_loss(按数量级)

问题描述 投票:0回答:1

我在model.fitmodel.test_on_batch产生的val_loss之间有差异。

对于model.fit,在批次大小为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

然后我停止了训练,并使用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))

python keras
1个回答
0
投票

model.test_on_batch似乎返回批次条目的损失之和,而model.train_on_batch则返回平均损失,因此可以解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.