Python Keras:当相同的输入被传递到两个函数时,为什么_batch()上的train_和_batch()上的test_的损失不同?

Python Keras:当相同的输入被传递到两个函数时,为什么_batch()上的train_和_batch()上的test_的损失不同?,python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我正在将相同的输入,即相同的数据和相同的真实标签传递给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_e

我正在将相同的输入,即相同的数据和相同的真实标签传递给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,x_train], y_train))
    iter_num += 1
  print("EPOCH {} FINISHED".format(epoch_num + 1))

  epoch_num += 1
  iter_num = 0 # reset counter
model\u del\u fin.compile(优化器=SGD(lr=0.001,衰减=0.001/15),loss='classifical\u crossentropy',度量=['accurity'])
iters_/_历元=1285//50
打印(iters\u/历元)
num_epochs=15
iters中的输出存储频率=20
iters中的打印损耗频率=20
iter_num=0
历元数=0
模型_输出=[]
损失历史=[]
当历元数<历元数时:
打印(“确定”)
当iter\u num
**结果:**

国际热核实验堆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]国际热核实验堆3的损耗:[1.6114614,0.74][1.2987132,0.92]


问题源于以训练模式与推理模式向模型提供数据;差异包括:

  • 列车模式
    退出
    处于活动状态,
    批次标准化
    使用批次统计数据进行均值和方差分析
  • 推断:所有
    辍学率
    设置为零,
    BatchNormalization
    使用指数移动平均统计数据计算训练期间的均值和方差
其他差异也适用。假设您的代码中使用的模型基于其他问题(即VGG)中的模型-它将是BN层。作为解决办法,您可以通过以下方式临时设置全局学习阶段:

K.set_学习_阶段(0)#推理模式
K.设置学习阶段(1)#列车模式
但是,请注意,在实例化模型之前,必须执行其中任何一项,否则更改将不适用。此外,这可能无法完全解决问题,正如众所周知的那样(我目前正在调查此事),但结果应该更接近一致

最后,如果您首先调用
train\u on\u batch()
,然后调用
test\u on\u batch()
,这两个函数将不一致,因为
test
train
更新权重后执行-因此,首先调用
test\u on\u batch()


完整示例

从tensorflow.keras.layers导入输入、密集、丢失
从tensorflow.keras.models导入模型
将tensorflow.keras.backend作为K导入
将numpy作为np导入
K.设置学习阶段(0)
ipt=输入((12,))
x=辍学率(0.1)(ipt)
out=密度(12)(x)
模型=模型(ipt,out)
model.compile('adam','mse')
X=np.random.randn(32,12)
打印(批量(X,X)上的车型系列)
打印(批量(X,X)上的模型测试)
打印(批量(X,X)上的车型系列)
2.1212778#批量生产#
2.1128066#批量测试()
2.1128066#批量生产#
尝试使用
K。设置学习阶段(1)
查看差异,或者完全注释,因为
1
是默认值