Keras训练报错:数据基数模糊,x与y样本数量不匹配求助
问题修复方案
1. 训练集拆分顺序错误(核心原因)
train_test_split的返回顺序是训练集特征、测试集特征、训练集标签、测试集标签,你写反了训练集标签和测试集特征的位置,导致x_train和y_train完全不是对应的训练集数据,直接引发样本数量不匹配错误。
修正代码:
x_train, x_test, y_train, y_test = train_test_split(images, labels, test_size=0.2, random_state=4)
2. Dropout层参数错误
你把Dropout的丢弃率写成了(0, 2),正确格式应该是浮点数0.2(逗号误写为小数点),否则会触发参数类型错误。
修正代码:
model.add(keras.layers.Dropout(0.2))
3. 损失函数与输出层不匹配
输出层用sigmoid激活(二分类场景),但你用了适用于多分类的categorical_crossentropy损失,同时错误地对标签做了归一化(标签是类别索引0/1,不需要除以255)。
修正点:
- 损失函数改为
binary_crossentropy - 标签不需要归一化,保留原始整数类型
修正代码:
# 去掉标签的归一化操作 y_train = np.array(y_train, dtype='int') y_test = np.array(y_test, dtype='int') # 编译模型时修改损失函数 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
4. 其他优化点
- 移除未使用的
import tensorflow as tf(你明确说不能用tensorflow.keras) - 添加图片读取失败的跳过逻辑,避免无效数据干扰
完整修正后的代码
import numpy as np import os import keras from sklearn.preprocessing import LabelBinarizer from sklearn.model_selection import train_test_split import cv2 as cv people = ['H', 'J'] DIR = 'C:\\AI' images = [] labels = [] haar_cascade = cv.CascadeClassifier('haar_face.xml') for person in people: path = os.path.join(DIR, person) label = people.index(person) for img in os.listdir(path): img_path = os.path.join(path, img) img_array = cv.imread(img_path) if img_array is None: # 跳过无法读取的图片 continue gray = cv.cvtColor(img_array, cv.COLOR_BGR2GRAY) face_rect = haar_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=6) for (x, y, w, h) in face_rect: face_roi = img_array[y:y + h, x:x + w] face_roi = cv.resize(face_roi, (128, 128)) images.append(face_roi) labels.append(label) # 正确拆分数据集 x_train, x_test, y_train, y_test = train_test_split(images, labels, test_size=0.2, random_state=4) # 特征归一化 x_train = np.array(x_train, dtype='float')/255.0 x_test = np.array(x_test, dtype='float')/255.0 # 标签转为整数类型,无需归一化 y_train = np.array(y_train, dtype='int') y_test = np.array(y_test, dtype='int') print(len(x_train), ' ', len(y_train)) # 现在长度应该一致了 model = keras.models.Sequential() model.add(keras.layers.Conv2D(32, (3, 3), padding='same', activation='relu', input_shape=(128, 128, 3))) model.add(keras.layers.MaxPool2D(pool_size=(2, 2))) model.add(keras.layers.BatchNormalization(axis=-1)) model.add(keras.layers.Dropout(0.2)) # 修正Dropout参数 model.add(keras.layers.Flatten()) model.add(keras.layers.Dense(512, activation='relu')) model.add(keras.layers.Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 修正损失函数 hist = model.fit(x_train, y_train, epochs=5, batch_size=64)
内容的提问来源于stack exchange,提问作者SWK
相关产品推荐
相关产品推荐

