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

使用Keras/TensorFlow训练手语识别CNN模型时出现InvalidArgumentError报错怎么办

错误根因
  • 输出层神经元数量和数据集类别数不匹配:你使用class_mode='categorical'加载数据集,标签会被转为对应类别数的独热编码,从报错信息In[0] mismatch In[1] shape: 35 vs. 1: [32,35] [500,1]可以看出你的手语数据集共35个分类,但你模型最后一层全连接层仅设置了units=1,输出维度和标签维度无法对齐,触发矩阵运算错误。
  • 冗余参数:仅模型第一层卷积需要指定input_shape,后续卷积层会自动推导输入维度,你在第二、三层卷积层重复填写的input_shape属于无效代码;另外ImageDataGenerator返回的生成器已经指定了batch_size,调用fit时无需再传入batch_size参数。
修复后的可运行代码
import tensorflow as tf
from tensorflow.keras import datasets,layers,models
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 数据预处理
train_datagen = ImageDataGenerator(rescale = 1./255,
                                  shear_range = 0.2,
                                  zoom_range = 0.2,
                                  horizontal_flip = True)
training_set = train_datagen.flow_from_directory('split__data/Train',
                                                target_size = (64, 64),
                                                batch_size = 32,
                                                class_mode = 'categorical')
test_datagen = ImageDataGenerator(rescale = 1./255)
test_set = test_datagen.flow_from_directory('split__data/Test',
                                           target_size = (64, 64),
                                           batch_size = 32,
                                           class_mode = 'categorical')

# 构建模型
cnn = tf.keras.models.Sequential()
cnn.add(tf.keras.layers.Conv2D(filters = 16,kernel_size = 3,activation = 'relu',input_shape = [64,64,3]))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2))

cnn.add(tf.keras.layers.Conv2D(filters = 32,kernel_size = 3,activation = 'relu'))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2))

cnn.add(tf.keras.layers.Conv2D(filters = 64,kernel_size = 3,activation = 'relu'))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2))
cnn.add(tf.keras.layers.Flatten())
cnn.add(tf.keras.layers.Dense(units=500,activation='relu'))
# 输出层神经元数改为数据集实际类别数,用training_set.num_classes自动适配无需手动写死
cnn.add(tf.keras.layers.Dense(units=training_set.num_classes,activation='softmax'))

# 编译训练
cnn.compile(optimizer = 'adam' , loss= 'categorical_crossentropy',metrics = ['accuracy'])
cnn.fit(x = training_set,validation_data = test_set,epochs = 10)
验证说明

你可以先执行print(training_set.num_classes)确认数据集的实际分类数,确保输出层维度和分类数一致后即可正常训练。

内容的提问来源于stack exchange,提问作者Deepak Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:27:04