首页 > 解决方案 > Keras flow_from_directory 弄乱了标签

问题描述

我在 keras 生成器中加载批量图像。该目录具有以下结构:

alot/
  1/
    1_c1i.png
    1_c1l1.png
    1_c1L1r60.png
    ...
  2/
    2_c1i.png
    2_c1l1.png
    ...
...

每个目录对应一个类,包含 100 张图片。当我将它们加载到生成器中时,它似乎完全弄乱了图像所属的标签。

image_size_x = 200
image_size_y = 200

train_generator = datagen.flow_from_directory(
        'D:/wrkfldr/dataset_textures/alot',  
        batch_size=32,
        target_size=(image_size_x,image_size_y),
        class_mode='categorical')

如果我遍历图像,每个图显示的标签都是错误的

x,y = train_generator.next()
for i in range(0,31):
    image = x[i]
    label = y[i]
    index = list(label).index(1)
    print (index)
    plt.imshow(image.reshape(image_size_x,image_size_y,3).astype(np.uint8))
    plt.show()

我检查过,没有偏移量 1 或 -1 或任何东西。标签真的是完全随机的,我不知道为什么会这样。

我尝试过使用其他结构,它可以工作。但是这个特别的没有,我不知道为什么。我有什么明显的遗漏吗?

标签: keras

解决方案


极好的。

从一开始,出于某种我无法理解的原因,python 没有通过递增数字来对文件夹进行分类,而是使用了一些连接数字或 wathever 的组合。

如果我跑

import os

    path = 'D:/wrkfldr/dataset_textures/alot'
    i = 0
    for _dir in os.listdir(path):

        print('%s %d' % (_dir,i))
        i += 1

结果是

1
10
100
101
102
103
104
105
106
107
108
109
11
110
111
112
113
114
115

很明显,我的标签完全关闭了,因为我用于标签的 CSV 是制作的,例如第一行代表 0,第二行代表 1,第三行代表 2,依此类推,没有一些可疑的连接东西。

无论如何,我将文件夹名称更改为真实类,一切正常。


推荐阅读