5

Ich versuche, ein binäres Klassifizierungsproblem mit Keras zu machen, mit der ImageDataGenerator.flow_from_directory Methode, um Stapel zu generieren. Meine Klassen sind jedoch sehr unausgeglichen, etwa 8x oder 9x mehr in einer Klasse als die andere, was dazu führt, dass das Modell hängenbleibt und die gleiche Ausgabeklasse für jedes Beispiel vorhersagt. Gibt es eine Möglichkeit, flow_from_directory zu setzen, um entweder aus meiner kleinen Klasse oder Unterabtastung von meiner großen Klasse während jeder Epoche zu überlagern? Für den Moment habe ich gerade mehrere Kopien von jedem Bild in meiner kleineren Klasse erstellt, aber ich hätte gerne etwas mehr Flexibilität.keras flow_from_directory über oder Unterabtastung einer Klasse

Antwort

6

Mit der aktuellen Keras-Version ist es nicht möglich, den Dataset mithilfe von Keras integrierten Methoden zu balancieren. Die flow_from_directory erstellt einfach eine Liste aller Dateien und ihrer Klassen, mischt sie (wenn es nötig ist) und dann iteriert sie darüber.

Aber Sie könnten einen anderen Trick - mit dem eigenen Generator writting, die den Ausgleich im Inneren des python machen würde:

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

Hier custom_balance sollte eine Funktion, die eine Charge gegeben (x, y) ist es Ausgleich und eine Rückkehr ausgewogene Charge (x', y'). Für die meisten Anwendungen muss die Größe des Stapels nicht die gleiche sein - aber es gibt einige seltsame Anwendungsfälle (wie z. B. stateful RNNs), wo Stapelgrößen eine feste Größe haben sollten.

+0

Dank dieser etwa zu sein scheint normalisieren, was ich brauchte – George

+1

jemand ein voll funktionsfähiges Skript auf dieser Basis erstellen, zu erarbeiten? Ich brauche ein konkreteres Beispiel für custom_balance usw. – mikal94305

0

Sie können auch die Anzahl der Dateien in jeder Klasse berechnen und den 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

Bitte fügen Sie Beispielcode und mehr Erklärung hinzu –

+0

Bitte bearbeiten Sie Ihre Antwort und fügen Sie diesen Code hinzu –

Verwandte Themen