我正在尝试使用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
打印798print nb_validation_samples
打印12782print len(validation_data)
打印12768print 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