【问题标题】:ValueError: Data cardinality is ambiguous: x sizes: 12000 y sizes: 640 Make sure all arrays contain the same number of samplesValueError:数据基数不明确:x 大小:12000 y 大小:640 确保所有数组包含相同数量的样本
【发布时间】:2021-10-18 06:51:23
【问题描述】:

我尝试使用 tensorflow 训练数据集,但数据基数出现错误。

*代码

import numpy as np
import os
from PIL import Image
import matplotlib.pyplot as plt
import cv2
from sklearn.model_selection import train_test_split
import tensorflow as tf

def read_patches(Image_path, label):
    patches = []
    labels = []
    Image_File_name = []

    for (path,dir,files) in os.walk(Image_path):
        files.sort()
        for filename in files :
            if('good' in filename):
                Image_File_name.append(Image_path+'\\'+filename)


    for i in range(len(Image_File_name)):
        # print(Image_File_name[i])
        patch = cv2.imread(Image_File_name[i])
        gray = cv2.cvtColor(patch, cv2.COLOR_BGR2GRAY) #RGB to Gray

        patches.append(gray)
        labels.append(label)

    patches = np.array(patches)
    labels = np.array(labels)

    patchDim = patches.shape
    patches = np.reshape(patches, (patchDim[0], patchDim[1], patchDim[2], 1) )
    labels = np.reshape(labels, (len(labels), 1) )

    return patches, labels

X, Y = read_patches("C:\\works\\data\\image_source_01\\good", 1) 

train_X = train_X.reshape(-1, 32, 32, 1)
test_X = test_X.reshape(-1, 32, 32, 1)
print(train_X.shape, test_X.shape)

model = tf.keras.Sequential([
      tf.keras.layers.Conv2D(input_shape=(32,32,1), kernel_size=(3, 3), filters = 32, 
padding='same', activation='relu'),
      tf.keras.layers.Conv2D(kernel_size=(3, 3), filters = 64, padding='same', activation='relu'),
      tf.keras.layers.MaxPool2D(strides=(2, 2)),
      tf.keras.layers.Dropout(rate=0.5),
      tf.keras.layers.Conv2D(kernel_size=(3, 3), filters = 128, padding='same', activation='relu'),
      tf.keras.layers.Conv2D(kernel_size=(3, 3), filters = 256, padding='valid', activation='relu'),
      tf.keras.layers.MaxPool2D(strides=(2, 2)),
      tf.keras.layers.Dropout(rate=0.5),
      tf.keras.layers.Flatten(),
      tf.keras.layers.Dense(units=512, activation='relu'),
      tf.keras.layers.Dropout(rate=0.5),
      tf.keras.layers.Dense(units=256, activation='relu'),
      tf.keras.layers.Dropout(rate=0.5),
      tf.keras.layers.Dense(units=10, activation='softmax')                        
])

model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
          
model.summary()

history = model.fit(train_X, train_Y, epochs=25, validation_split=0.25)

*错误

Traceback(最近一次调用最后一次): 文件“C:\works\test4.py”,第 139 行,在 历史 = model.fit(train_X, train_Y, epochs=25, validation_split=0.25) ... packages\keras\engine\data_adapter.py”,第 1649 行,在 _check_data_cardinality 引发 ValueError(味精) ValueError:数据基数不明确: x 尺寸:12000 尺码:640 确保所有数组都包含相同数量的样本。

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    您的错误说明了一切:您需要确保 train_Xtrain_Y 具有相同的形状。如果您像这样加载 mnist 数据,您会注意到 x_train 的形状为 (60000, 28, 28, 1)y_train 的形状为 (60000,):

    (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
    

    请注意,两者都有 60000 个样本。您的 train_X 有 12000 个图像,train_Y 有 640 个标签,这是行不通的,因为每个图像都需要一个相应的标签。此外,我认为您不必重塑数据,但这取决于它在此之前的样子。

    【讨论】:

    • 感谢您的友好回复。但是当我运行代码时,我可以在下面看到这些结果
    • *print(train_X.shape, train_Y.shape) : (16000, 32, 32, 1) (640, 1) *print(test_X.shape, test_Y.shape) : (4000, 32 , 32, 1) (160, 1)
    • 所以目前我找不到数字 12000 的来源。另外,train_X 和 train_Y 的形状都不一样,因为 train_X 数据是图像,train_Y 数据是标签
    • 所以……你是说每个数据的数量应该相同?我的意思是 train_X 是 16000 个图像,而 train_y 有 640 个标签,所以它们应该是相同数量的数据吗?喜欢 640 张图片和 640 个标签?
    • 没错,你理解的没错。我说的是必须相同的样本数量。也许只是使用 tensorflow 提供的数据集:tf.keras.datasets.mnist.load_data()。这样你就不会有任何问题了。
    猜你喜欢
    • 1970-01-01
    • 2022-10-07
    • 2021-09-10
    • 2023-03-23
    • 2021-02-07
    • 2021-07-25
    • 2022-11-11
    • 2021-09-16
    • 2020-10-17
    相关资源
    最近更新 更多