我正在尝试使用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整除。
谢谢!!!
答案 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