具有验证数据和验证标签的Keras多类分类器错误:输入数组应具有与目标数组

时间:2017-11-15 10:32:24

标签: python machine-learning keras theano conv-neural-network

我正在尝试使用Keras使用VGG16瓶颈功能和顶部的小型完全连接模型为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整除。

谢谢!!!

1 个答案:

答案 0 :(得分:1)

在python 2中,假设你使用了注释,两个整数的除法默认给出整数除法。这意味着12782 / 16 == 798(在python 3中,这相当于12782 // 16)而不是12782 / 16 == 798.875,就像python 3中的情况一样。

为了解决这个问题,你应该确保分区中的一个数字是浮点数,以便得到正确的行为,例如

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