5

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

ответ

6

С текущей версией 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), где размер партии должен иметь фиксированный размер).

+0

спасибо это, кажется, примерно то, что мне нужно было – George

+1

Может кто-то создать полностью рабочий сценарий, основанный на этом, чтобы разработать? Мне нужен более конкретный пример custom_balance и т. Д. – mikal94305

0

Вы также можете подсчитать количество файлов в каждом классе и нормализовать 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) 
+0

пожалуйста, добавьте пример кода и больше объяснений –

+0

. Измените свой ответ и добавьте этот код –

Смежные вопросы