Я работаю над multi-label
проблемой классификации изображений с Keras
, поэтому я использую функции flow_from_dataframe()
и fit_generator()
.
У меня около 2000
классов, и, как вы можете догадаться, онисильно перекошены / несбалансированы.После небольшого поиска я натолкнулся на аргументы class_weight
и classes
и решил попробовать.Моя проблема в том, что я не уверен, правильно ли я их использую.Вот пример:
Давайте предположим, что я сгладил все вхождения классов, чтобы получить следующий список (дублированных) меток:
labels = ['classD', 'classA', 'classA', 'classC', 'classD', 'classD']
И это функция, которая вычисляет classes
и class_weight
:
from collections import Counter
def get_classes_weights(l, n):
counter = Counter(l).most_common(n)
classes = [cls for cls, ocu in counter]
majority = max([ocu for cls, ocu in counter])
weights = {idx: float(majority/ocu) for idx, (cls, ocu) in enumerate(counter)}
return classes, weights
Давайте также предположим, что я должен рассмотреть только топ-2 класса:
classes, class_weight = get_classes_weights(labels, 2)
Это дает:
classes: ['classD', 'classA']
и:
class_weight: {0: 1.0, 1: 1.5}
И, наконец, вот как я использую их в функциях:
generator_train.flow_from_dataframe(
classes=classes,
)
model.fit_generator(
class_weight=class_weight
)
Итак, мой вопрос:
- Является ли приведенный выше правильный способ применения весов, учитывая, что я работаю над проблемой классификации изображений
multi-label
? - Нужно ли балансировать мой набор проверки или все в порядке, если он был взят из того же самогоРаспределение как обучающий набор (20% и 80% случайного отбора соответственно)?