5

Próbuję zrobić binarny problem klasyfikacji z Keras, przy użyciu metody ImageDataGenerator.flow_from_directory do generowania partii. Jednak moje klasy są bardzo niezrównoważone, np. Około 8x lub 9x więcej w jednej klasie od drugiej, powodując blokowanie modelu, przewidując tę ​​samą klasę wyjściową dla każdego przykładu. Czy istnieje sposób, aby ustawić flow_from_directory, aby przereklamować z mojej małej klasy lub pod-próbki z mojej dużej klasy podczas każdej epoki? Na razie właśnie stworzyłem wiele kopii każdego obrazu w mojej mniejszej klasie, ale chciałbym mieć nieco więcej elastyczności.keras flow_from_directory over lub undersample class

Odpowiedz

6

Przy aktualnej wersji Keras - nie można zrównoważyć zestawu danych za pomocą tylko wbudowanych metod Keras. flow_from_directory po prostu buduje listę wszystkich plików i ich klas, tasuje je (jeśli to konieczne), a następnie iteruje nad nim.

Ale można zrobić inny trik - poprzez pisanie własnego generatora, które sprawi, że równoważenie wewnątrz python:

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

Tutaj custom_balance powinna być funkcja, która dana partia (x, y) jest równoważenie go i zwracając zrównoważona partia (x', y'). W przypadku większości aplikacji wielkość partii nie musi być taka sama - ale istnieją pewne dziwne przypadki użycia (np. stateful RNNs) - w których rozmiary partii powinny mieć stały rozmiar).

+0

dzięki To wydaje się być ok, co potrzebne – George

+1

ktoś może utworzyć skrypt w pełni pracy w oparciu o to, aby rozwinąć? Potrzebuję bardziej konkretnego przykładu custom_balance, itp. – mikal94305

0

Można również obliczyć liczbę plików w każdej klasie i normalizują 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

proszę dodać przykładowy kod i więcej wyjaśnień –

+0

Edytuj odpowiedź i dodaj ten kod –