WedX - журнал о программировании и компьютерных науках

keras flow_from_directory изменяет или занижает выборку класса

Я пытаюсь решить проблему двоичной классификации с помощью Keras, используя метод ImageDataGenerator.flow_from_directory для создания пакетов. Однако мои классы очень несбалансированы, например, в 8 или 9 раз больше в одном классе, чем в другом, что приводит к тому, что модель застревает, предсказывая один и тот же выходной класс для каждого примера. Есть ли способ установить flow_from_directory либо для избыточной выборки из моего маленького класса, либо для недостаточной выборки из моего большого класса в каждую эпоху? На данный момент я только что создал несколько копий каждого изображения в своем меньшем классе, но мне хотелось бы иметь немного больше гибкости.


Ответы:


1

В текущей версии Keras невозможно сбалансировать набор данных, используя только встроенные методы Keras. flow_from_directory просто создает список всех файлов и их классов, перетасовывает его (при необходимости), а затем перебирает его.

Но можно было сделать и другой трюк - написать свой генератор, который делал бы балансировку внутри python:

def balanced_flow_from_directory(flow_from_directory, options):
    for x, y in flow_from_directory:
         yield custom_balance(x, y, options)

Здесь custom_balance должна быть функция, которая с учетом пакета (x, y) балансирует его и возвращает сбалансированный пакет (x', y'). Для большинства приложений размер пакета не обязательно должен быть одинаковым, но есть некоторые странные варианты использования (например, stateful RNN) - где размеры пакетов должны иметь фиксированный размер).

23.01.2017

2

Одна вещь, которую вы можете сделать, это установить параметр class_weight при вызове model.fit() или model.fit_generator().

Также случается, что вы можете легко вычислить свои class_weights, используя библиотеки sklearn и numpy следующим образом:

from sklearn.utils import class_weight
import numpy as np

class_weights = class_weight.compute_class_weight(
           'balanced',
            np.unique(train_generator.classes), 
            train_generator.classes)

После этого все становится так же просто, как установить параметр class_weights равным class_weight:

model.fit_generator(..., class_weight=class_weights) 
23.07.2018
  • Как вы можете гарантировать, что np.unique(train_generator.classes) вернет классы в правильном порядке? 18.09.2018

  • 3

    Вы также можете рассчитать количество файлов в каждом классе и нормализовать class_weights.

    files_per_class = []
    for folder in os.listdir(input_foldr):
        if not os.path.isfile(folder):
                files_per_class.append(len(os.listdir(input_foldr + '/' + folder)))
    total_files = sum(files_per_class)
    class_weights = {}
    for i in xrange(len(files_per_class)):
        class_weights[i] = 1 - (float(files_per_class[i]) / total_files)
    print (class_weights)
    ...
    ...
    ...
    model.fit_generator(... ,class_weight=class_weights)
    
    01.01.2018
  • Эй, я знаю, что это старый ответ, но я столкнулся с этим, и мне понравилось это решение. Есть одна проблема с вышеизложенным: os.listdir не гарантирует возврат в алфавитном порядке, но поток_из_каталога делает; решение, которое я использовал, было: lst = os.lisdir(input_foldr); список.сортировать(); Который затем сортирует эти веса (надеюсь) в том же порядке, что и поток_из_каталога. 02.10.2020
  • Я все еще обеспокоен тем, что отдельные партии, например. 32 образца будут сбалансированы. Если все выборки поступают из одного класса (вероятно, для очень несбалансированных наборов данных), тогда веса будут увеличиваться только для классификации этих выборок в направлении класса с избыточным весом. В случае партии, в которой есть редкий образец, как class_weight увеличивает эффект этого одного образца в партии? Я подозреваю, что это более сложно, чем сделано. 18.11.2020
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]