我在这里按照本教程进行图像分类。 链接:Keras image classification
我引用的代码是Bottleneck feature 我面临的问题: 1.原始教程只有两个类,但我正在尝试进行多类分类。 我的文件结构如下:
data
train
class1
class2
class3
class4
test
class1
class2
class3
class4
原始代码中的以下代码用于两类分类。
train_labels = np.array(
[0] * (nb_train_samples / 2) + [1] * (nb_train_samples / 2))
validation_data = np.load(open('bottleneck_features_validation.npy'))
validation_labels = np.array(
[0] * (nb_validation_samples / 2) + [1] * (nb_validation_samples / 2))
据我所知,为了进行多级分类,我必须将其更改为:
train_labels = np.array(
[0] * (class0_train_size) + [1] * (class1_train_size)+ [2] * (class2_train_size) + [3] * (class3_train_size))
validation_data = np.load(open('bottleneck_features_validation.npy'))
validation_labels = np.array(
[0] * (class0_test_size) + [1] * (class1_test_size)+ [2] * (class2_test_size) + [3] * (class3_test_size))
我的问题是我的火车测试尺寸因不同的课程而异,所以我很难对它们进行硬编码。有没有办法可以根据文件夹中的实际图像数量动态分配它们而不是硬编码大小?感谢您的慷慨帮助!
答案 0 :(得分:1)
获得不同类的普遍性的可能性是使用os库。例如,对于测试类,您可以首先使用以下命令获取测试文件夹中的类列表:
import os
abs_path = "/bla/bla/test"
test_classes = [d for d in os.listdir(abs_path)]
您可以获取每个类目录中的文件数,然后使用dict或列表存储它们:
test_class_sizes = dict()
for c in classes:
test_class_folder = os.path.join(abs_path, c)
test_class_sizes[c] = len([d for d in os.listdir(test_class_folder)])
最后,您使用此dict构建平面标签列表:
validation_labels = [[k]*class_size for k, class_size in enumerate(class_sizes)]
flattened_validatoin_labels = [label for class_list in validation_labels for label in class_list]