ValueError: Входные массивы должны иметь то же количество выборок, что и целевые массивы. Найдено 1600 входных образцов и 1800 целевых образцов - PullRequest
0 голосов
/ 04 мая 2018

Я следую этому уроку здесь, чтобы выполнить классификацию изображений. Ссылка: Keras классификация изображений

Код, на который я ссылаюсь: Функция узкого места Проблема, с которой я сталкиваюсь: 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 голосов
/ 04 мая 2018

Возможность получить распространение среди ваших классов - использовать библиотеку 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)])

И, наконец, вы используете этот дикт для создания списка плоских меток:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...