ValueError:输入数组应具有与目标数组相同的样本数。找到1600个输入样本和1800个目标样本

时间:2018-05-04 15:27:13

标签: python numpy keras

我在这里按照本教程进行图像分类。 链接: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))

我的问题是我的火车测试尺寸因不同的课程而异,所以我很难对它们进行硬编码。有没有办法可以根据文件夹中的实际图像数量动态分配它们而不是硬编码大小?感谢您的慷慨帮助!

1 个答案:

答案 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]