繁体   English   中英

Val_Acc > Training_Acc,但 Val_Loss < Training_Loss – 解释?

[英]Val_Acc > Training_Acc, yet Val_Loss < Training_Loss – explanation?

我正在训练一个带有一个隐藏层的神经网络,我总是遇到这种奇怪的行为: Val_AccuracyTraining_Acc ,但Val_LossTraining_Loss小。 我不明白,这可能表明什么。

我正在对 5 类目标进行分类,使用sparse_categorical_crossentropy作为损失和sparse_categorical_accuracy作为附加指标。 (是的,我的目标是一个整数,它不是一个热点——“稀疏”是正确的。)

我尝试了很多超参数的调整; 特别是LR和节点数量。

因为我使用的是 Dropout,所以我知道测试准确度/损失可能比训练更好。 问题是关于这两个指标的不同之处。

opti = tf.keras.optimizers.Adam(lr=0.00001)
batch = 100
mindelta = 0.0001
lr_red_factor = 0.4
acti = 'relu'
actilast = 'softmax'
kern = 'he_normal'
bias = 'zeros'
droprate = 0.4
target = 5
loss = 'sparse_categorical_crossentropy'#'mean_squared_error'
metrics = ['sparse_categorical_accuracy']
nodesperlayer = 30
howmanyhidden = 1

patience = (4000/(nodesperlayer*howmanyhidden))/batch

model = models.Sequential()

first = True
for _ in range(howmanyhidden):
     if first:
          model.add(layers.Dense(nodesperlayer, use_bias=True,
                           kernel_initializer=kern, 
                           bias_initializer=bias,
                           input_dim=feats.columns.shape[0]))
          first=False
     else:
          model.add(layers.Dense(nodesperlayer, use_bias=True,
                           kernel_initializer=kern, 
                           bias_initializer=bias))

     model.add(layers.BatchNormalization(axis=-1, momentum=0.99,
                           epsilon=0.001, center=True,
                           scale=True, beta_initializer='zeros',
                           gamma_initializer='ones', 
                           moving_mean_initializer='zeros',
                           moving_variance_initializer='ones', 
                           beta_regularizer=None,
                           gamma_regularizer=None, 
                           beta_constraint=None,
                           gamma_constraint=None))

     model.add(layers.Activation(acti))

     model.add(layers.Dropout(droprate)) #todo seed?

model.add(layers.Dense(target, activation = actilast))

model.compile(loss=loss, metrics=metrics, optimizer=opti)

只是为了澄清我的意思的众多例子之一:

损失:1.1345 - sparse_categorical_accuracy:0.5586 - val_loss:1.0571 - val_sparse_categorical_accuracy:0.6028

我认为您有一个概念上的误解,如果损失是您在训练期间将其最小化,因为损失越小越好,但准确度则相反,准确度越高越好。

训练的动态是这样的,随着损失的减少,准确度通常会增加,所以你看到的行为是正确的,完全符合预期。

好吧,损失和准确率是成反比的。 “损失”是对模型误差的度量,而准确度是对模型性能的度量。 由于验证误差/损失小于训练误差,因此验证准确度优于训练准确度才有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM