Val_Acc> Training_Acc, но Val_Loss <Training_Loss - объяснение? - PullRequest
0 голосов
/ 20 июня 2019

Я тренирую нейронную сеть с одним скрытым слоем, и все время получаю странное поведение: Val_Accuracy больше Training_Acc, но Val_Loss меньше Training_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

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Я думаю, что у вас есть концептуальное недоразумение, идея, если потеря заключается в том, что вы минимизируете ее во время обучения, потому что меньшие потери лучше, а точность ведет себя иначе, чем выше точность, тем лучше.

Динамикаобучения таковы, что с уменьшением потерь обычно увеличивается точность, поэтому поведение, которое вы видите, является правильным и вполне ожидаемым.

0 голосов
/ 20 июня 2019

Ну, потери и точность обратно пропорциональны друг другу. «Потеря» - это измерение ошибки, которую допускает ваша модель, в то время как точность - это измерение эффективности вашей модели. Поскольку ошибка / потеря проверки меньше, чем ошибка обучения, имеет смысл только, что точность проверки лучше точности обучения.

...