我正在尝试使用VGG16瓶颈功能和顶部的全连接小型模型为Keras构建24个类的多分类器。

最初,我尝试按照本教程进行操作:https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html使它适应多类,然后出现错误并尝试使用此其他教程的代码:http://www.codesofinterest.com/2017/08/bottleneck-features-multi-class-classification-keras.html并得到了完全相同的错误。我不知道是什么问题!

我得到的错误是:“ ValueError:输入数组应具有与目标数组相同的样本数。找到了12768个输入样本和12782个目标样本。”

基本上我有两个文件夹,训练和验证。火车文件夹具有52992 png图像,验证文件夹为12782 png图像。我的批次大小是16。

这是我保存验证数据的save_bottleneck_features()中的代码(在train_top_model()函数之前调用此函数):

generator = datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='categorical',
    shuffle=False)

nb_validation_samples = len(generator.filenames)

predict_size_validation = int(
    math.ceil(nb_validation_samples / batch_size))


bottleneck_features_validation = model.predict_generator(
    generator, predict_size_validation)

np.save('bottleneck_features_validation.npy',
        bottleneck_features_validation)


这是我计算验证标签的train_top_model()中的代码:

generator_top = datagen_top.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode= 'categorical',
    shuffle=False)

nb_validation_samples = len(generator_top.filenames)

validation_data = np.load('bottleneck_features_validation.npy')

validation_labels = generator_top.classes
validation_labels = np.array(
     [0] * (nb_validation_samples / 2) + [1] * (nb_validation_samples / 2))
validation_labels = to_categorical(
   validation_labels, num_classes=num_classes)


print predict_size_validation打印798
print nb_validation_samples打印12782
print len(validation_data)打印12768
print len(validation_labels)打印12782

火车数据和火车标签的计算方法相同,但是可以。

我认为问题可能出在predict_size_validation上,而12782不能被16整除。

谢谢!!!

最佳答案

在python 2中,我假定您使用的是给定注释,默认情况下,两个整数的除法给出整数除法。这意味着12782 / 16 == 798(在python 3中,它等效于12782 // 16)而不是像在python 3中一样的12782 / 16 == 798.875

为了解决此问题,您应确保除法中的数字之一是浮点数,以获取正确的行为,例如

import math

predict_size_validation = int(math.ceil(nb_validation_samples / float(batch_size)))


另外,您可以使用__future__模块获取python 3行为,即

import math
from __future__ import division

predict_size_validation = int(math.ceil(nb_validation_samples / batch_size))


另一个解决方案是依靠整数除法进行计算(而不是依靠math.ceil):

predict_size_validation = nb_validation_samples // batch_size
if nb_validation_samples % batch_size != 0:
    predict_size_validation += 1


有关python 2浮点除法的更多信息,请参见this answer

07-26 02:46