带有验证数据和验证标签的 Keras 多类分类器错误:输入数组应与目标数组具有相同数量的样本
Keras multiclass classificator error with validation data and validation labels: Input arrays should have the same number of samples as target arrays
我正在尝试使用 VGG16 瓶颈特征和顶部的小型完全连接模型,使用 Keras 为 24 classes 构建一个 multi-class classificator。
起初我试图按照本教程进行操作:https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html adapting it to multiclass, then I got the error and tried to use this other tutorial's code: http://www.codesofinterest.com/2017/08/bottleneck-features-multi-class-classification-keras.html 并得到了完全相同的错误。我不知道是什么问题!
我得到的错误是:“ValueError:输入数组的样本数应与目标数组的样本数相同。找到 12768 个输入样本和 12782 个目标样本。”
基本上我有两个文件夹,train 和 validation。训练文件夹有 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
我正在尝试使用 VGG16 瓶颈特征和顶部的小型完全连接模型,使用 Keras 为 24 classes 构建一个 multi-class classificator。
起初我试图按照本教程进行操作:https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html adapting it to multiclass, then I got the error and tried to use this other tutorial's code: http://www.codesofinterest.com/2017/08/bottleneck-features-multi-class-classification-keras.html 并得到了完全相同的错误。我不知道是什么问题!
我得到的错误是:“ValueError:输入数组的样本数应与目标数组的样本数相同。找到 12768 个输入样本和 12782 个目标样本。”
基本上我有两个文件夹,train 和 validation。训练文件夹有 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