2017-01-18 9 views
7

Czy można pobrać nazwy plików załadowane za pomocą flow_from_directory? mam:Keras flowFromDirectory pobiera nazwy plików podczas ich generowania

datagen = ImageDataGenerator(
    rotation_range=3, 
#  featurewise_std_normalization=True, 
    fill_mode='nearest', 
    width_shift_range=0.2, 
    height_shift_range=0.2, 
    horizontal_flip=True 
) 

train_generator = datagen.flow_from_directory(
     path+'/train', 
     target_size=(224, 224), 
     batch_size=batch_size,) 

mam niestandardową generator dla mojego wielofunkcyjnego modelu wyjściowego jak:

a = np.arange(8).reshape(2, 4) 
# print(a) 

print(train_generator.filenames) 

def generate(): 
    while 1: 
     x,y = train_generator.next() 
     yield [x] ,[a,y] 

węzeł, który w tej chwili jestem generującego liczb losowych dla a ale dla prawdziwego treningu, pragnę załaduj plik json zawierający współrzędne prostokąta dla moich obrazów. W tym celu będę musiał uzyskać nazwy plików, które zostały wygenerowane przy użyciu metody train_generator.next(). Po tym mogę załadować plik, przetworzyć json i przekazać go zamiast a. Konieczne jest również, aby kolejność zmiennych x i listy otrzymywanych nazw plików była taka sama.

+0

Używanie tylko domyślnych aparatów Keras - nie jest to możliwe. Ale możesz zmienić kod Keras, aby to zrobić. –

+0

Czy znasz moją odpowiedź? –

Odpowiedz

12

Tak, jest to możliwe, przynajmniej z wersją 2.0.4 (nie wiem o wcześniejszej wersji).

Wystąpienie ImageDataGenerator().flow_from_directory(...) ma atrybut z filenames którym znajduje się lista wszystkich plików w kolejności generator plony, a także ich atrybutem batch_index. Więc można zrobić to tak:

datagen = ImageDataGenerator() 
gen = datagen.flow_from_directory(...) 

I każda iteracja na generatorze można uzyskać odpowiednie nazwy plików jak to:

for i in gen: 
    idx = (gen.batch_index - 1) * gen.batch_size 
    print(gen.filenames[idx : idx + gen.batch_size]) 

To daje nazwy plików obrazów w bieżącym partii.

+4

Należy zauważyć, że to nie działa, jeśli tryb losowy ma wartość True (domyślnie). Zawsze otrzymasz nazwy plików w kolejności, w jakiej są najpierw przetwarzane, niekoniecznie w kolejności, w jakiej są one zwracane z generatora. –

+0

@AlexGuth, co należy zrobić przy użyciu 'shuffle = True'? –

Powiązane problemy