2017-03-03 4 views
4

Ich habe einen unausgeglichenen Multi-Klassen-Datensatz und möchte das -Argument von fit_generator verwenden, um die Klassen entsprechend der Anzahl der Bilder jeder Klasse zu gewichten. Ich verwende ImageDataGenerator.flow_from_directory, um das Dataset aus einem Verzeichnis zu laden.Ist es möglich, automatisch die Klasse_weight von flow_from_directory in Keras abzuleiten?

Ist es möglich, direkt auf das class_weight Argument vom ImageDataGenerator Objekt zu schließen?

+0

Ich glaube nicht, dass dies möglich ist. Warum kannst du es nicht einfach einmal berechnen? –

Antwort

8

Habe gerade einen Weg gefunden, dies zu erreichen.

from collections import Counter 
train_datagen = ImageDataGenerator() 
train_generator = train_datagen.flow_from_directory(...) 

counter = Counter(train_generator.classes)       
max_val = float(max(counter.values()))  
class_weights = {class_id : max_val/num_images for class_id, num_images in counter.items()}      

model.fit_generator(..., 
        class_weight=class_weights) 

train_generator.classes ist eine Liste von Klassen für jedes Bild. Counter(train_generator.classes) erstellt einen Zähler der Anzahl der Bilder in jeder Klasse.

Beachten Sie, dass diese Gewichte möglicherweise nicht für Konvergenz gut sind, aber Sie können es als Basis für andere Arten der Gewichtung basierend auf Auftreten verwenden.

Diese Antwort wurde von inspiriert: https://github.com/fchollet/keras/issues/1875#issuecomment-273752868

+0

aber train_generator.classes gibt nur eine Liste von Klassen zurück, wie eine Menge, nein? –

+1

Es gibt eine Liste von Klassen für jedes Bild zurück. Zum Beispiel, wenn wir drei Bilder haben, sind die ersten zwei aus der Klasse 1 und die letzte aus der Klasse 0, 'train_generator.classes' ist gleich' [1, 1, 0] '. –

+1

In der Tat, ging nur um den Quellcode zu sehen :) Gute Arbeit –

Verwandte Themen