值错误:输入数组应具有与目标数组相同数量的样本。找到 1600 个输入样本和 6400 个目标样本

Posted

技术标签:

【中文标题】值错误:输入数组应具有与目标数组相同数量的样本。找到 1600 个输入样本和 6400 个目标样本【英文标题】:Value error: Input arrays should have the same number of samples as target arrays. Found 1600 input samples and 6400 target samples 【发布时间】:2017-10-26 08:37:41 【问题描述】:

我正在尝试进行 8 级分类。代码如下:

import keras
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras import applications
from keras.optimizers import SGD
from keras import backend as K
K.set_image_dim_ordering('tf')
img_width, img_height = 48,48
top_model_weights_path = 'modelom.h5'
train_data_dir = 'chCdata1/train'
validation_data_dir = 'chCdata1/validation'
nb_train_samples = 6400
nb_validation_samples = 1600
epochs = 50
batch_size = 10
def save_bottlebeck_features():
   datagen = ImageDataGenerator(rescale=1. / 255)
   model = applications.VGG16(include_top=False, weights='imagenet', input_shape=(48,48,3))
   generator = datagen.flow_from_directory(
               train_data_dir,
               target_size=(img_width, img_height),
               batch_size=batch_size,
               class_mode='categorical',
               shuffle=False)
   bottleneck_features_train = model.predict_generator(
               generator, nb_train_samples // batch_size)
   np.save(open('bottleneck_features_train', 'wb'),bottleneck_features_train)

   generator = datagen.flow_from_directory(
               validation_data_dir,
               target_size=(img_width, img_height),
               batch_size=batch_size,
               class_mode='categorical',
               shuffle=False)
   bottleneck_features_validation = model.predict_generator(
               generator, nb_validation_samples // batch_size)
   np.save(open('bottleneck_features_validation', 'wb'),bottleneck_features_validation)

def train_top_model():
   train_data = np.load(open('bottleneck_features_train', 'rb'))
   train_labels = np.array([0] * (nb_train_samples // 8) + [1] * (nb_train_samples // 8) + [2] * (nb_train_samples // 8) + [3] * (nb_train_samples // 8) + [4] * (nb_train_samples // 8) + [5] * (nb_train_samples // 8) + [6] * (nb_train_samples // 8) + [7] * (nb_train_samples // 8))
   validation_data = np.load(open('bottleneck_features_validation', 'rb'))
   validation_labels = np.array([0] * (nb_train_samples // 8) + [1] * (nb_train_samples // 8) + [2] * (nb_train_samples // 8) + [3] * (nb_train_samples // 8) + [4] * (nb_train_samples // 8) + [5] * (nb_train_samples // 8) + [6] * (nb_train_samples // 8) + [7] * (nb_train_samples // 8))
   train_labels = keras.utils.to_categorical(train_labels, num_classes = 8)
   validation_labels = keras.utils.to_categorical(validation_labels, num_classes = 8)
   model = Sequential()
   model.add(Flatten(input_shape=train_data.shape[1:]))
   model.add(Dense(512, activation='relu'))
   model.add(Dropout(0.5))
   model.add(Dense(8, activation='softmax'))
   sgd = SGD(lr=1e-2, decay=0.00371, momentum=0.9, nesterov=False)
   model.compile(optimizer=sgd,
         loss='categorical_crossentropy', metrics=['accuracy'])
   model.fit(train_data, train_labels,
          epochs=epochs,
          batch_size=batch_size,
   validation_data=(validation_data, validation_labels))
   model.save_weights(top_model_weights_path)

save_bottlebeck_features()
train_top_model()

我在这里添加了完整的错误列表:

Traceback (most recent call last):

  File "<ipython-input-14-1d34826b5dd5>", line 1, in <module>
    runfile('C:/Users/rajaramans2/codes/untitled15.py', wdir='C:/Users/rajaramans2/codes')

  File "C:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 866, in runfile
    execfile(filename, namespace)

  File "C:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/rajaramans2/codes/untitled15.py", line 71, in <module>
    train_top_model()

  File "C:/Users/rajaramans2/codes/untitled15.py", line 67, in train_top_model
    validation_data=(validation_data, validation_labels))

  File "C:\Anaconda3\lib\site-packages\keras\models.py", line 856, in fit
    initial_epoch=initial_epoch)

  File "C:\Anaconda3\lib\site-packages\keras\engine\training.py", line 1449, in fit
    batch_size=batch_size)

  File "C:\Anaconda3\lib\site-packages\keras\engine\training.py", line 1317, in _standardize_user_data
    _check_array_lengths(x, y, sample_weights)

  File "C:\Anaconda3\lib\site-packages\keras\engine\training.py", line 235, in _check_array_lengths
    'and ' + str(list(set_y)[0]) + ' target samples.')

ValueError: Input arrays should have the same number of samples as target arrays. Found 1600 input samples and 6400 target samples.

弹出“ValueError: Input arrays should have the same number of samples as target arrays.Found 1600 input samples and 6400 target samples”。请帮助解决方案和对代码进行必要的修改。提前致谢。

【问题讨论】:

【参考方案1】:

本例的问题出在这一行

validation_labels = np.array([0] * (nb_train_samples // 8) + [1] * (nb_train_samples // 8) + [2] * (nb_train_samples // 8) + [3] * (nb_train_samples // 8) + [4] * (nb_train_samples // 8) + [5] * (nb_train_samples // 8) + [6] * (nb_train_samples // 8) + [7] * (nb_train_samples // 8))

肯定有更好的写法,因为现在nb_train_samples 的每一次出现都应该替换为nb_validation_samples

【讨论】:

【参考方案2】:

这与 len(X_train) != len(y_train) 无关。

将数据分成相等的大小以进行训练和测试(验证)。确保输入数据大小是均匀的。如果不尝试通过省略输入数据中的最后一个观察值来修剪数据。

train_test_split(X,y, test_size = 0.5, random_state=42)

这对我有用。

【讨论】:

【参考方案3】:

我知道您有答案,但对于其他旅行者,请确保您的火车数据可以被您的 batch_size 整除。

【讨论】:

【参考方案4】:

看起来您有 1600 个示例进行训练。而且您的 8 个类在样本中没有分开,因此您有一个包含 8 x 1600 = 6400 个值的数组。

该数组必须是 (1600,8) 之类的东西。即:1600 个样本,有 8 个可能的类别。

现在您需要知道您的train_labels 数组是如何组织的。如果数组排序正确,也许一个简单的reshape((1600,8)) 就足够了。

如果没有,您必须自己组织成 1600 个样本,每个样本有 8 个标签。

【讨论】:

【参考方案5】:

看起来 X_train 中的示例数(即 train_data)与 y_train 中的示例数(即 train_labels)不匹配。你能仔细检查一下吗?并且,将来,请附上完整的错误,因为它有助于调试问题。

【讨论】:

我已经用完整错误列表更新了我的问题。请帮助解决问题。 我认为该错误说明了我之前的建议。 train_data 和 train_labels 的长度不同。尝试打印数组的长度并查看数据以了解那里发生了什么。 非常感谢!我在错误标记验证样本时犯了一个错误。现在它完美地工作了:)

以上是关于值错误:输入数组应具有与目标数组相同数量的样本。找到 1600 个输入样本和 6400 个目标样本的主要内容,如果未能解决你的问题,请参考以下文章

值错误:检查目标时出错:预期dense_1具有形状(无,1)但得到的数组具有形状(6000,3)

数组和指针+错误

如何检查输入值是不是与数组中的任何值匹配

ValueError:发现样本数量不一致的输入变量:[1, 74]

525. 连续数组

.fit() 错误:发现样本数量不一致的数组