python - Keras 多类分类器错误与验证数据和验证标签 : Input arrays should have the same number of samples as target arrays

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

我正在尝试使用 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 个目标样本。

基本上我有两个文件夹,训练和验证。 train 文件夹有 52992 个 png 图像,validation 文件夹有 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)而不是 12782/16 == 798.875 code> 就像 python 3 中的情况一样。

为了解决此问题,您应该确保除法中的数字之一是 float ,以获得正确的行为,例如

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

关于python - Keras 多类分类器错误与验证数据和验证标签 : Input arrays should have the same number of samples as target arrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47305059/

相关文章:

python - 在python中复制结构

python - 这个减法在Python中是如何工作的?

machine-learning - LSTM 和标签

machine-learning - 乘法滤波器或更标准的加法加权

python - 在 Macbook Pro 13 上使用视频输入训练 Keras 模型会导致 "Killed: 9"状态

python - 深度学习模型预测关键词点击次数

python - 如何找到列表中按特定顺序排列并包含字母的最高字符?

python - 使用 CSS 选择器单击按钮

python - 如何设置 Python 的 httplib 使用的信任库?

machine-learning - 稀疏采样 Softmax Tensorflow