Я пытаюсь построить нейронную сеть для задачи классификации multi-label .
Ситуация
Во входном изображении есть может быть несколько выходных классов (и они не являются взаимоисключающими). Всего 6 классов.
Пример
На изображении 1 есть класс 1, класс 2 и класс 5. Итак, выходные данные выглядят следующим образом [1, 1, 0, 0, 1, 0].
Проблема дисбаланса данных
У меня всего 32 уникальных типа изображений на основе комбинации классов, которые встречаются в этом типе изображения. Таким образом, один тип может содержать все классы (представленные как [1, 1, 1, 1, 1, 1]), тогда как другой тип может не содержать ни одного из классов (представленных как [0, 0, 0, 0 , 0, 0]).
Некоторые изображения очень редки (например, изображение, содержащее вместе класс 1, класс 3, класс 4 и класс 6) по сравнению с другими (например, изображение, где класс отсутствует). Это должно быть ясно из данных, приведенных ниже.
Image Type : No. of samples of that image type
[1, 0, 1, 1, 0, 1] : 1
[1, 0, 1, 0, 1, 1] : 2
[1, 1, 1, 0, 1, 1] : 2
[1, 1, 1, 1, 1, 1] : 2
[1, 0, 1, 1, 1, 1] : 3
[1, 1, 1, 1, 0, 1] : 3
[1, 0, 1, 0, 0, 1] : 3
[1, 1, 1, 0, 0, 1] : 4
[1, 1, 0, 1, 1, 1] : 4
[1, 1, 0, 1, 0, 1] : 7
[1, 1, 0, 0, 1, 1] : 7
[1, 0, 0, 1, 1, 1] : 8
[1, 0, 0, 1, 0, 1] : 16
[1, 1, 0, 0, 0, 1] : 21
[1, 0, 0, 0, 1, 1] : 28
[0, 1, 1, 0, 1, 1] : 53
[0, 1, 1, 1, 1, 1] : 63
[0, 0, 1, 1, 1, 1] : 70
[0, 0, 1, 0, 1, 1] : 78
[1, 0, 0, 0, 0, 1] : 122
[0, 1, 1, 1, 0, 1] : 141
[0, 1, 0, 1, 1, 1] : 159
[0, 1, 0, 0, 1, 1] : 239
[0, 0, 1, 1, 0, 1] : 265
[0, 1, 0, 1, 0, 1] : 283
[0, 0, 0, 1, 1, 1] : 366
[0, 1, 1, 0, 0, 1] : 491
[0, 0, 1, 0, 0, 1] : 712
[0, 1, 0, 0, 0, 1] : 1128
[0, 0, 0, 1, 0, 1] : 1183
[0, 0, 0, 0, 1, 1] : 2319
[0, 0, 0, 0, 0, 0] : 46431
Total no. of samples = 54,214 sample images
Другая проблема - несбалансированное представление классов. Так как есть всего 54214 образцов изображений и 6 классов на образец. Мы получаем сумму путем умножения этих двух значений. 54214 * 6 = 325284
Данные, приведенные ниже, ясно показывают, что класс 1 (присутствует) является наименее представленным классом. Кроме того, мы можем видеть, что негативы (0) больше по сравнению с позитивами (1).
Absent(0) Present(1) Total(0 + 1)
Class 1 53981 233 54214
Class 2 52321 1893 54214
Class 3 51640 2574 54214
Class 4 51607 2607 54214
Class 5 50811 3403 54214
Class 6 46431 7783 54214
Total : 306791 + 18493 = 325284
Я использую Керас , и я знаю, что мы можем передать sample_weight и class_weight во время тренировки модели. Я использую сигмоид активация в последнем слое и двоичный_кросентропия потеря, так как это проблема многослойной классификации.
Вопросы
Как рассчитать sample_weight , чтобы я мог более точно представлять редкие образцы (например, образцы типа [1, 0, 1, 1, 0, 1])?
Как рассчитать class_weight в этой ситуации, чтобы можно было решить проблему большего количества негативов (0), чем позитивов (1)?
[Необязательно / Менее важно] Что мне делать, если я хочу наказать класс 6 более строго (поскольку класс 6 является наиболее важным), чем другие пять классов?
Я знаю, что это можно вычислить, используя что-то вроде compute_sample_weight и compute_class_weight от scikit-learn.
Было бы очень полезно, если бы кто-то смог найти решение и объяснить его математически. Также, пожалуйста, поправьте меня, если я что-то неправильно понял.