You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:53:16