【问题标题】:Value Error: Input arrays should have the same number of samples as target arrays. Found 166 input samples and 4 target samples值错误:输入数组应具有与目标数组相同数量的样本。找到 166 个输入样本和 4 个目标样本
【发布时间】:2019-05-22 03:14:00
【问题描述】:

我正在使用 Keras DL 库对图像数据集进行分类。我在尝试训练模型时遇到了错误。

我正在处理的数据集没有大量数据,因此训练集包含 166 张图像的示例。我不确定该错误,但我认为我必须以某种方式更改标签集的形状以修复它。代码如下:

import tensorflow as tf
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D


DIR = '/home/.../'
IMG_H = 256
IMG_W = 256
IMG_CH = 1


loadFile = DIR + 'Img.npz'
X = np.load(loadFile)
trainImgSet = X['trainImgSet']
trainLabelSet = X['trainLabelSet']
testImgSet = X['testImgSet']

print('Shape of trainImgSet: {}'.format(trainImgSet.shape))
print('Shape of trainLabelSet: {}'.format(trainLabelSet))
#print('Shape of testImgSet:{}'.format(testImgSet))


model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(256, (3, 3), input_shape = (IMG_H, IMG_W, IMG_CH)))
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(1, 1)))

model.add(tf.keras.layers.Conv2D(256, (3, 3)))
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(1, 1)))

model.add(tf.keras.layers.Flatten())

model.add(tf.keras.layers.Dense(64))

model.add(tf.keras.layers.Dense(1))
model.add(tf.keras.layers.Activation('sigmoid'))

model.compile(loss='binary_crossentropy', 
                optimizer='adam',
                metrics=['accuracy'])

model.summary()

#train the CNN
model.fit(trainImgSet, trainLabelSet, batch_size=10, epochs=5, validation_split=0.1)



Here is the error:
Traceback (most recent call last):
  File "/home/Code/DeepCl.py", line 49, in <module>
    model.fit(trainImgSet, trainLabelSet, batch_size=10, epochs=5, validation_split=0.1)
  File "anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1536, in fit
    validation_split=validation_split)
  File "/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 992, in _standardize_user_data
    class_weight, batch_size)
  File "/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1169, in _standardize_weights
    training_utils.check_array_lengths(x, y, sample_weights)
  File "/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_utils.py", line 426, 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 166 input samples and 4 target samples.

【问题讨论】:

    标签: python python-3.x deep-learning classification


    【解决方案1】:

    这里,

    • 训练样本数不等于标签数。

    • 有 144 个训练样本,但只有 4 个标签。

    • 训练和测试数据的形状必须具有相同数量的样本。

    • 例如。训练数据的形状为( 100 , 256 , 256 , 1 )。测试数据的形状应为( 100 , 1 )

    【讨论】:

    • 训练集包含 4 个类,每个标签分配给一个类。假设有dog、cat、car、tree 4个类,那么每个类都有一个标签,比如0代表狗,1代表猫等等,这有什么问题呢?我应该改变它吗?
    • 对于 4 个类,需要添加 4 个输出神经元,具有 softmax 激活函数。对于狗,输出将是 (0 ,1 ,0 , 0)
    • 您需要将标签转换为向量。使用 keras.utils.to_categorical( train_Y , 4 )
    • 我已经按照你说的做了修改,但是还是不行。这是错误:ValueError: Error when checks input: expected conv2d_input to have shape (256, 256, 1) but got array with shape (256, 256, 4)
    • 您需要更改标签的形状,而不是图像。假设,您的标签大小为 (100, 1),将它们转换为一个热向量后,形状必须为 (100, 4)
    【解决方案2】:

    当我打电话时,这发生在我身上:

    X_train, y_train, X_test, y_test = sklearn.model_selection.train_test_split(...)
    

    而不是

    X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(...)
    

    (请注意,LHS 上的第二个和第三个变量是交换的。)

    这导致我的数据和标签长度不等:

    即len(X_train) != len(y_train) 和 len(X_test) != len(y_test)。

    【讨论】:

      猜你喜欢
      • 2017-10-26
      • 2020-08-31
      • 2023-03-10
      • 2019-05-30
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      相关资源
      最近更新 更多