Keras多类分类器验证数据和验证标签错误:输入数组的样本数应与目标数组的样本数相同

我正在尝试使用Keras构建一个包含24个类别的多类分类器,使用VGG16的瓶颈特征和一个小的全连接模型。

起初我尝试按照这个教程进行: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.classesvalidation_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中,假设您使用的是Python 2,因为从评论中可以看出,两个整数的除法默认会进行整数除法。这意味着12782 / 16 == 798(在Python 3中,这相当于12782 // 16),而不是12782 / 16 == 798.875,如Python 3中的情况。

为了解决这个问题,您应该确保除法中的一个数字是浮点数,以获得正确的行为,例如:

import mathpredict_size_validation = int(math.ceil(nb_validation_samples / float(batch_size)))

另一种解决方案是使用__future__模块来获得Python 3的行为,即:

import mathfrom __future__ import divisionpredict_size_validation = int(math.ceil(nb_validation_samples / batch_size))

还有一种解决方案是依赖整数除法来进行计算(而不是依赖math.ceil):

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

关于Python 2中的浮点数除法,请参见这个回答

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注