我如何查看Keras'的顺序? flow_from_directory方法处理文件夹?

时间:2017-03-18 00:18:15

标签: python deep-learning keras

在进行转学习时,我首先通过VGG16网络的底层提供图像。我正在使用生成器功能。

datagen=ImageDataGenerator(1./255)
generator =  datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size = 32,
    class_mode=None,
    shuffle=False
)
model.predict_generator(generator, nb_train_samples

我将类模式设置为none,因为我只想要数据输出。我设置了shuffle = false,因为我想在这里提供预测的特征,并将它们与地面真相类别变量相匹配:

train_data = np.lead(open(file_name, 'rb'))
train_labels = np.array([0] * NUMBER_OF_ITEMS_FOR_ITEM1 +
                        [1] * NUMBER_OF_ITEMS_FOR_ITEM2 +...
                        [n-1] * NUMBER_OF_ITEMS_FOR_ITEMN

这里的问题是我不知道文件的读取顺序。我该怎么知道?或者更好的是,我怎样才能避免猜测正确的顺序。我问,因为我几乎可以肯定低预测准确度与标签不匹配有关。

2 个答案:

答案 0 :(得分:2)

好问题,在print类内的keras/preprocessing/image.py方法中向next添加DirectoryIterator语句:以下是迭代列表的相关代码文件名。您当然必须从源代码重建keras

for i, j in enumerate(index_array):
   fname = self.filenames[j]
   print(fname) # add this to see the current file being accessed

   img = load_img(os.path.join(self.directory, fname),
                  grayscale=grayscale,
                  target_size=self.target_size)
   x = img_to_array(img, data_format=self.data_format)
   x = self.image_data_generator.random_transform(x)

然而,为了避免所有这些痛苦,keras docs页面上的这个例子表明,为了确保一致性,应遵循这种模式。 通过训练并验证相同模板的生成器到model.fit_generator函数。

train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        'data/train',
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
        'data/validation',
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')

model.fit_generator(
        train_generator,
        samples_per_epoch=2000,
        epochs=50,
        validation_data=validation_generator,
        num_val_samples=800)

答案 1 :(得分:0)

我调查了source code。我应该注意,自从我发布这个问题以来,Keras已更新到2.0版本。所以答案是基于该版本。

ImageDataGenerator继承自DirectoryGenerator。在其中,我找到以下几行:

<!-- : batch portion
@echo off & setlocal

FOR /F "tokens=2 delims==" %%A in ('wmic ComputerSystem Get Model /value') do SET model=%%A

for /F "delims=" %%a in ('cscript /nologo "%~f0?.wsf" "%model%"') do set "VBreply=%%a"
echo End of VB script, reply: "%VBreply%"

goto :EOF

: VBScript -->
<job>
    <script language="VBScript">
        model = WScript.Arguments(0)

        MsgBox model
        Wscript.Echo "response"
    </script>
</job>

注意第3行,其中&#34;排序(os.listdir(direcectory,subdir))&#34;。生成器按字母顺序遍历所有文件夹。

后来_recursive_list的定义也在子结构上使用相同的逻辑。

所以答案是:文件夹按字母顺序处理,这在某种程度上是有道理的。