установка смещения для мультиклассовой классификации python тензор потока кера - PullRequest
2 голосов
/ 19 февраля 2020

В приложении модель показывает, как добавить смещение в случае несбалансированной проблемы классификации initial_bias = np.log([pos/neg]). Есть ли способ добавить смещение, если у вас есть мультиклассовая классификация с несбалансированными данными, скажем, 5 классов, где классы имеют распределение (0.4,0.3,0.2.0.08 and 0.02)

2), а также как рассчитать и использовать веса классов в таком случае?

обновление 1

I found a way to apply weights, still not sure how to use bias

#####adding weights 20 Feb
weight_for_0 = ( 1/ 370)*(370+ 977+ 795)/3
weight_for_1 = ( 1/ 977)*(370+ 977+ 795)/3
weight_for_2 = (1 / 795)*(370+ 977+ 795)/3

#array([0, 1, 2]), array([370, 977, 795])

class_weights_dict = {0: weight_for_0, 1: weight_for_1, 2:weight_for_2}
class_weights_dict
Dcnn.fit(train_dataset,
         epochs=NB_EPOCHS,
         callbacks=[MyCustomCallback()],verbose=2,validation_data=test_dataset, class_weight=class_weights_dict)

1 Ответ

2 голосов
/ 22 февраля 2020

Учитывая, что вы используете 'softmax':

softmax = exp(neurons) / sum(exp(neurons))

И что вы хотите, чтобы результаты классов были:

frequency = [0.4 , 0.3 , 0.2 , 0.08 , 0.02]

Смещения должно быть задано уравнением (поэлементно):

frequency = exp(biases) / sum(exp(biases))

Это формирует систему уравнений:

  • f1 = e^b1 / (e^b1 + e^b2 + ... + e^b5)
  • f2 = e^b2 / (e^b1 + e^b2 + ... + e^b5)
  • ...
  • f5 = e^b5 / (e^b1 + e^b2 + ... + e^b5)

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

Я использовал метод Excel и метод test-error, чтобы определить, что для желаемых частот ваши смещения должны быть соответственно:

[1.1 , 0.81 , 0.4 , -0.51 , -1.9] 

Я действительно не знаю, как легко решить эту систему , но вы можете продолжать экспериментировать с Excel или другим, пока не достигнете решения.


Добавление смещений к слою - метод 1.

Используйте имя при определении слоя, например:

self.last_dense = layers.Dense(units=3, activation="softmax", name='last_layer')

Возможно, вам потребуется создать Сначала модель, поэтому:

dummy_predictions = model.predict(np.zeros((1,) + input_shape))

Затем вы получите вес:

weights_and_biases = model.get_layer('last_layer').get_weights()
w, b = weights_and_biases
new_biases = np.array([-0.45752, 0.51344, 0.30730])
model.get_layer('last_layer').set_weights([w, new_biases])

Метод 2

def bias_init(bias_shape):
    return K.variable([-0.45752, 0.51344, 0.30730])

self.last_dense = layers.Dense(units=3, activation="softmax", bias_initializer=bias_init)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...