Machine learning keras拟合与keras评估

Machine learning keras拟合与keras评估,machine-learning,keras,conv-neural-network,face-recognition,Machine Learning,Keras,Conv Neural Network,Face Recognition,应该有人能真正澄清这一点 以下是Keras文档中的一些初始信息: Keras中的fit功能只针对给定的时代数训练模型。 evaluate函数返回测试模式下模型的损失值和度量值 因此,这两个函数都返回一个损失。为了给出一个示例,如果我有一个单一的训练示例,那么我在每个训练步骤后从拟合函数得到的损失应该与我从评估函数(在相同的训练步骤后)得到的损失相同。(此处假设我在同一列车组上运行拟合和评估功能(仅包含1个示例) 我将我的网络定义如下: def identity_loss(y_true, y_pr

应该有人能真正澄清这一点

以下是Keras文档中的一些初始信息: Keras中的fit功能只针对给定的时代数训练模型。 evaluate函数返回测试模式下模型的损失值和度量值

因此,这两个函数都返回一个损失。为了给出一个示例,如果我有一个单一的训练示例,那么我在每个训练步骤后从拟合函数得到的损失应该与我从评估函数(在相同的训练步骤后)得到的损失相同。(此处假设我在同一列车组上运行拟合评估功能(仅包含1个示例)

我将我的网络定义如下:

def identity_loss(y_true, y_pred):
    return K.mean(y_pred - 0 * y_true)

model = ResNet50(weights='imagenet')
model.layers.pop()
x = model.get_layer('flatten_1').output # layer 'flatten_1' is the last layer of the model
model_out = Dense(128, activation='relu',  name='model_out')(x)
model_out = Lambda(lambda  x: K.l2_normalize(x,axis=-1))(model_out)

new_model = Model(inputs=model.input, outputs=model_out)

anchor_input = Input(shape=(224, 224, 3), name='anchor_input')
pos_input = Input(shape=(224, 224, 3), name='pos_input')
neg_input = Input(shape=(224, 224, 3), name='neg_input')

encoding_anchor   = new_model(anchor_input)
encoding_pos      = new_model(pos_input)
encoding_neg      = new_model(neg_input)

loss = Lambda(triplet_loss)([encoding_anchor, encoding_pos, encoding_neg])
siamese_network = Model(inputs  = [anchor_input, pos_input, neg_input], 
                        outputs = loss) 
siamese_network.compile(loss=identity_loss, optimizer=Adam(lr=.00003))
稍后,我用fit函数训练我的训练集(仅由1个示例组成)10个阶段。为了检查fit函数和evaluate函数之间的差异,我还在每个历元的fit函数之后运行evaluate函数,输出如下所示:

nr_epoch:  0 

Epoch 1/1
1/1 [==============================] - 4s 4s/step - loss: 2.0035
1/1 [==============================] - 3s 3s/step
eval_score for train set:  2.0027356147766113

nr_epoch:  1 

Epoch 1/1
1/1 [==============================] - 1s 1s/step - loss: 1.9816
1/1 [==============================] - 1s 1s/step
eval_score for train set:  2.001833915710449

nr_epoch:  2 

Epoch 1/1
1/1 [==============================] - 1s 1s/step - loss: 1.9601
1/1 [==============================] - 1s 1s/step
eval_score for train set:  2.00126576423645

nr_epoch:  3 

Epoch 1/1
1/1 [==============================] - 1s 1s/step - loss: 1.9388
1/1 [==============================] - 1s 1s/step
eval_score for train set:  2.0009117126464844

nr_epoch:  4 

Epoch 1/1
1/1 [==============================] - 1s 1s/step - loss: 1.9176
1/1 [==============================] - 1s 1s/step
eval_score for train set:  2.000725746154785

nr_epoch:  5 

Epoch 1/1
1/1 [==============================] - 1s 1s/step - loss: 1.8964
1/1 [==============================] - 1s 1s/step
eval_score for train set:  2.0006520748138428

nr_epoch:  6 

Epoch 1/1
1/1 [==============================] - 1s 1s/step - loss: 1.8759
1/1 [==============================] - 1s 1s/step
eval_score for train set:  2.0006656646728516

nr_epoch:  7 

Epoch 1/1
1/1 [==============================] - 1s 1s/step - loss: 1.8555
1/1 [==============================] - 1s 1s/step
eval_score for train set:  2.0007567405700684

nr_epoch:  8 

Epoch 1/1
1/1 [==============================] - 1s 1s/step - loss: 1.8355
1/1 [==============================] - 1s 1s/step
eval_score for train set:  2.0009000301361084

nr_epoch:  9 

Epoch 1/1
1/1 [==============================] - 2s 2s/step - loss: 1.8159
1/1 [==============================] - 2s 2s/step
eval_score for train set:  2.001085042953491
如图所示,拟合功能报告的损失正在减少(在每小时结束时)。评估函数带来的损失并没有减少

因此,困境是:如果我在一个训练示例上运行我的模型,我是否应该看到来自同一个历元的拟合函数和求值函数的相同损失(在每个历元之后)?如果我继续训练,训练损失会减少,但是来自评估函数的损失会保持在同一水平,不会减少

最后,这里是我如何调用fit和evaluate函数的:

z = np.zeros(len(anchor_path))

siamese_network.fit(x=[anchor_imgs, pos_imgs, neg_imgs], 
                    y=z, 
                    batch_size=batch_size, 
                    epochs=1, 
                    verbose=1, 
                    callbacks=None, 
                    validation_split=0.0, 
                    validation_data=None, 
                    shuffle=True, 
                    class_weight=None, 
                    sample_weight=None, 
                    initial_epoch=0, 
                    steps_per_epoch=None, 
                    validation_steps=None)

eval_score = siamese_network.evaluate(x=[anchor_imgs, pos_imgs, neg_imgs], 
                                      y=z,
                                      batch_size = batch_size, 
                                      verbose = 1)
print('eval_score for train set: ', eval_score)

那么,为什么在执行拟合函数而不是评估函数的过程中损失会减少呢?我哪里出错了?

ResNet使用批处理规范化,这在培训和测试期间表现不一样。你认为你应该从
model.fit
model.evaluate
中获得相同的训练损失的假设是不正确的。

通过进一步研究(用不同的关键字搜索),我发现了以下信息,也提供了解决方案。表面上,许多人都受到了这个问题的困扰,尤其是在试图利用迁移学习的时候

以下是对该问题的讨论和解决方案:

下面是一篇关于这个话题的博客:


不幸的是,我认为Tensorflow和Keras都有非常糟糕的文档记录。

在训练和推理过程中,某些层的行为不同。最值得注意的是,在后一种情况下,辍学率将被取消。谢谢你的回答。我在任何地方都不接触辍学设置。您有什么具体建议需要再次检查的吗?训练损失正在迅速减少,但评估函数报告的损失几乎没有任何变化。只有一个培训示例。这对我来说没有意义…可能相关:谢谢你的回答。我明白你的意思。但解决这个问题的办法是什么?我如何匹配拟合和评估函数的损失(或至少使它们尽可能彼此接近)?(旁注:上面没有提到,但我运行下面的“layer.trainable=False”并冻结原始ResNet50的权重。这也会影响它吗?)如果冻结BN层,那么断掉的BN肯定是同一个问题,这在您在回答中发布的链接中有描述。@edn我认为没有问题,为什么您希望在拟合和评估之间有匹配损失?是的,我认识到在实施转移学习时冻结BN层参数没有意义。关于@MatiasValdenegro的问题:我首先训练了我的模型,发现拟合和评估功能的损失存在巨大差异。然后我就用一个例子来训练模型(检查一切是否正常工作),但是损失之间的差异仍然存在。否则,我不会试图弥补损失。