我是Convolutional Neural Networks的新手,我即将建立我的第一个ConvNet,它是一个多级图像分类ConvNet。
型号说明
假设我有两个图像文件夹,一个包含几千个特定类型叶子的图像(叶子A)(图像集X),其他文件夹包含相同类型叶子的相同数量的图像(叶子B)(图像集Y)。所以我需要训练我的模型以区分这两种类型。
问题背景
由于我有两类输出叶A和叶B,我有0,1作为输出或1,0作为叶A类或叶B类的给定图像的输出。
Leaves A | Leaves B
If Input is a Class A Leaf, 1 0
If Input is a Class B Leaf, 0 1
问题
所以为了做到这一点,我必须将我的图像集X标记为输出1,0而图像集Y标记为输出0,1。此外,由于我需要增加图像以获得更多训练样本,因此我使用了ImageDataGenerator。
training_imGen.flow_from_directory(
'path/to/image_folder_X',
target_size=(1100,180),
batch_size=batchSize,
color_mode='rgb',
class_mode='categorical'
)
但在这里我无法指定标签。不像我使用training_imGen.flow
时那样。但是我发现classes
参数可以在flow_from_directory下调用,
classes: optional list of class subdirectories (e.g. ['dogs', 'cats']). Default: None. If not provided, the list of classes will be automatically inferred from the subdirectory names/structure under directory, where each subdirectory will be treated as a different class (and the order of the classes, which will map to the label indices, will be alphanumeric).
但我不知道如何在那里指定两个类标签,因为我只提供image set X
文件夹的路径。任何想法如何做到这一点?
更新
training_imGen.flow_from_directory(
'/Users/user/database/',
target_size=(1100,180),
batch_size=batchSize,
color_mode='rgb',
class_mode='categorical',
classes=['Set_A', 'Set_B']
)
在/Users/user/database/
路径下,有两个名为Set_A
和Set_B
的文件夹。正如我所提到的,每个文件夹都包含相关的png图像文件。
答案 0 :(得分:1)
查看DirectoryIterator的实施方式。这是一个非常简单的课程。
DirectoryIterator
只是DirectoryIterator
对象构造的包装器。您不必手动指定标签,因为A
会自动假设每个样本都与该样本的父文件夹后面的类相关联。
因此,只要叶子A
的所有样本都位于名为B
的同一文件夹中,并且叶子class_mode
的样本位于不同的文件夹中,它们就会被正确分配到各自的类中。
此外,迭代器的输出已经是单热编码,因为您将categorical
定义为g = ImageDataGenerator()
train = g.flow_from_directory('/path/to/dataset/train/',
batch_size=32,
target_size=(1100, 180))
x_batch, y_batch = next(train)
assert x_batch.shape == (32, 1100, 180, 3)
assert y_batch.shape == (32, 2)
print(y_batch)
[[0. 1.],
[1. 0.],
[1. 0.],
...
[0. 1.]]
:
classes
directory
参数不用于设置每个样本的标签,而是指定['A', 'B']
的子文件夹列表,该子文件夹应被该迭代器视为类(例如{{ 1}})。如果保留默认None
,则directory
的所有子文件夹都被视为有效类,其中的所有图像都是该集合的潜在样本。当您只想使用标签子集,调试代码或延迟类时,这非常有用。
如果您希望覆盖默认标签,则可以简单地替换DirectoryIterator#classes
中的内容,其中包含与ith
元素ith
元素相关联的类。例如,我们假设您要添加第三类没有关联文件夹的树叶:
train = g.flow_from_directory(...)
train.classes = np.asarray([0., 1., 2., ..., 0., 1.])
train.class_indices = {'A': 0, 'B': 1, 'C': 2}
train.num_classes = 3