2017-01-18 75 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のためではなく、実際の訓練のために乱数を生成しています

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] 

ノードを、私はしたいです画像の境界線の座標を含む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

シャッフルがTrue(デフォルト)の場合、これは機能しません。ファイル名は、最初に処理された順番で取得されます。必ずしも生成元から返される順序ではありません。 –

+0

@AlexGuth 'shuffle = True'を使うときにはどうすればいいですか? –

関連する問題