Почему количество изображений уменьшается после получения узких мест? - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь создать простой 5-классный объектный детектор, извлекая узкие места, используя предварительно обученный vgg16 (обученный в сети изображений).У меня есть 10000 изображений для обучения - 2000 для каждого класса и 2500 для тестирования - 500 для каждого класса.Однако, как только я извлекаю узкие места, тензор проверки имеет размер 2496, но ожидаемый размер должен быть 2500. Я проверил папку данных папки и обнаружил, что общее количество проверочных изображений составляет 2500. Но я все еще получаюошибка при попытке выполнить мой код.Ошибка говорит - «ValueError: Входные массивы должны иметь то же количество выборок, что и целевые массивы. Найдено 2496 входных выборок и 2500 целевых выборок» .Я приложил код ниже, кто-нибудь может заставить меня понять, почему число входных выборок уменьшается до 2496?

Я только что проверил количество изображений, присутствующих в поезде, и данные испытаний, чтобы быть уверенным, что нетизображения отсутствовали.Оказывается, ни одного изображения на самом деле не было.

Это код для получения возможностей узкого места.

global_start=dt.now()

#Dimensions of our flicker images is 256 X 256
img_width, img_height = 256, 256

#Declaration of parameters needed for training and validation
train_data_dir = 'data/train'
validation_data_dir = 'data/validation'
epochs = 50
batch_size = 16

#Get the bottleneck features by  Weights.T * Xi
def save_bottlebeck_features():
    datagen = ImageDataGenerator(rescale=1./255)

    #Load the pre trained VGG16 model from Keras, we will initialize only the convolution layers and ignore the top layers.
    model = applications.VGG16(include_top=False, weights='imagenet')

    generator_tr = datagen.flow_from_directory(train_data_dir,
                                            target_size=(img_width, img_height),
                                            batch_size=batch_size,
                                            class_mode=None, #class_mode=None means the generator won't load the class labels.
                                            shuffle=False) #We won't shuffle the data, because we want the class labels to stay in order.
    nb_train_samples = len(generator_tr.filenames) #10000. 2000 training samples for each class
    bottleneck_features_train = model.predict_generator(generator_tr, nb_train_samples // batch_size)
    np.save('weights/vgg16bottleneck_features_train.npy',bottleneck_features_train) #bottleneck_features_train is a numpy array

    generator_ts = datagen.flow_from_directory(validation_data_dir,
                                            target_size=(img_width, img_height),
                                            batch_size=batch_size,
                                            class_mode=None,
                                            shuffle=False)
    nb_validation_samples = len(generator_ts.filenames) #2500. 500 training samples for each class
    bottleneck_features_validation = model.predict_generator(generator_ts, nb_validation_samples // batch_size)
    np.save('weights/vgg16bottleneck_features_validation.npy',bottleneck_features_validation)
    print("Got the bottleneck features in time: ",dt.now()-global_start)

    num_classes = len(generator_tr.class_indices)

    return nb_train_samples,nb_validation_samples,num_classes,generator_tr,generator_ts

nb_train_samples,nb_validation_samples,num_classes,generator_tr,generator_ts=save_bottlebeck_features()

Это вывод приведенного выше фрагмента кода:

Found 10000 images belonging to 5 classes.
Found 2500 images belonging to 5 classes.
Got the bottleneck features in time:  1:56:44.166846

Теперь, если я это сделаю validation_data.shape, я получаю (2496, 8, 8, 512), тогда как ожидаемый результат должен быть (2500, 8, 8, 512).Вывод train_data в порядке.Что может быть не так?Я новичок в отладке в Керасе, и я не могу понять, что именно вызывает эту проблему.

Любая помощь будет принята с благодарностью!

...