Keras:当将相同的输入传递给两个函数时,train_on_batch()和test_on_batch()的损失为何不同?

我将相同的输入(即相同的数据和相同的真实标签)传递给keras train_on_batch()和test_on_batch()。我想知道为什么两个函数的损耗值都不同。

代码:

model_del_fin.compile(optimizer=SGD(lr=0.001,decay=0.001/15),loss='categorical_crossentropy',metrics=['accuracy'])
iters_per_epoch = 1285 // 50
print(iters_per_epoch)
num_epochs = 15
outs_store_freq = 20 # in iters
print_loss_freq = 20 # in iters

iter_num = 0
epoch_num = 0
model_outputs = []
loss_history  = []

while epoch_num < num_epochs:
  print("ok")
  while iter_num < iters_per_epoch:
    x_train,y_train = next(train_it2)
    loss_history += [model_del_fin.train_on_batch([x_train,x_train],y_train)]
    print("Iter {} loss: {}".format(iter_num,loss_history[-1]))
    print(model_del_fin.test_on_batch([x_train,y_train))
    iter_num += 1
  print("EPOCH {} FINISHED".format(epoch_num + 1))

  epoch_num += 1
  iter_num = 0 # reset counter

**结果:**

  
    

0次损失:[5.860205,0.24] [2.5426426,0.68]      迭代1损失:[3.5718067,0.48] [1.7102847,0.68]迭代2损失:[2.0221999,0.68]     [1.310905,0.94] Iter 3损失:[1.6114614,0.74] [1.2987132,0.92]

  
oopsqoo 回答:Keras:当将相同的输入传递给两个函数时,train_on_batch()和test_on_batch()的损失为何不同?

问题源于在火车模式推理模式中向模型提供数据;差异包括:

  • 训练模式Dropout处于活动状态,BatchNormalization使用 batch 统计数据进行均值和方差
  • 推论:所有Dropout费率均设为零,并且BatchNormalization使用指数移动平均值统计量来计算训练期间的均值和方差

其他差异也适用。假设代码中使用的模型基于其他问题(例如VGG)中的模型-它将是BN层。解决方法是,您可以通过以下方式临时设置全局学习阶段:

K.set_learning_phase(0) # INFERENCE MODE
K.set_learning_phase(1) # TRAIN MODE

但是请注意,必须在实例化模型之前 执行这两个操作,否则更改将不适用。而且,这可能无法完全解决问题,因为据悉BN具有other issues(我正好正在调查中),但结果应该更接近。

最后,如果您先调用train_on_batch(),然后然后调用test_on_batch(),则两者将不一致,因为test在{ {1}}的权重已更新-因此,请先呼叫train,然后再 test_on_batch()


完整示例

train_on_batch()
from tensorflow.keras.layers import Input,Dense,Dropout
from tensorflow.keras.models import Model
import tensorflow.keras.backend as K
import numpy as np

K.set_learning_phase(0)

ipt = Input((12,))
x   = Dropout(0.1)(ipt)
out = Dense(12)(x)

model = Model(ipt,out)
model.compile('adam','mse')
X = np.random.randn(32,12)

print(model.train_on_batch(X,X))
print(model.test_on_batch(X,X))
print(model.train_on_batch(X,X))

请尝试使用2.1212778 # train_on_batch() 2.1128066 # test_on_batch() 2.1128066 # train_on_batch() 来查看差异-或完全注释掉差异,因为无论如何K.set_learning_phase(1)都是默认值。

本文链接:https://www.f2er.com/3147529.html

大家都在问