2017-01-18 19 views
7

是否可以獲取使用flow_from_directory加載的文件名? 我:Keras flowFromDirectory在生成文件時獲取文件名

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,) 

我有喜歡我的多輸出模型的自定義生成器:

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] 

節點,在那一刻,我爲a但真正的訓練產生隨機數,我想加載一個json文件,其中包含我的圖像的邊界框座標。爲此,我需要獲取使用train_generator.next()方法生成的文件名。我有這個之後,我可以加載文件,解析json並通過它而不是a。還有必要對x變量的排序和我得到的文件名列表是一樣的。

+0

僅使用默認Keras - 這是不可能的。但是你可以改變一個Keras代碼來做到這一點。 –

+0

你讀過我的回答嗎? –

回答

12

是的,這是可能的,至少在版本2.0.4(不知道早期版本)。

ImageDataGenerator().flow_from_directory(...)的實例具有filenames的屬性,它是生成器生成它們的順序中的所有文件的列表,也是屬性batch_index。所以,你可以做這樣的:

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

而且發電機每次迭代,你可以得到這樣的對應文件名:

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

這會給你的圖像的文件名在當前批次。

+4

必須注意,如果shuffle爲True(默認),則此功能無效。您將始終按照它們首次處理的順序獲取文件名,而不是按照它們從生成器返回的順序進行重複。 –

+0

@AlexGuth使用'shuffle = True'應該怎麼做? –