视频分类输入形状适配问题:关键点数据输入报错排查
我有多个文件夹,每个文件夹包含37张图片,每张图片对应126个关键点。在进行视频分类时,出现报错:ValueError: Shapes (None, 1) and (None, 5) are incompatible,不清楚该如何调整输入形状,希望了解需要排查的方向。输入形状参考显示输入维度为(样本数量, 37, 126)。
模型结构代码如下:
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM,Dense from tensorflow.keras.callbacks import TensorBoard import tensorflow as tf import os log_dir = os.path.join('logs') callback = TensorBoard(log_dir=log_dir) model = Sequential() model.add(LSTM(64,input_shape=(37,126,),return_sequences=True,activation='relu')) model.add(LSTM(128,return_sequences=True,activation='relu')) model.add(LSTM(64,return_sequences=False,activation='relu')) model.add(Dense(64,activation='relu')) model.add(Dense(32, activation='relu')) model.add(Dense(class_label.shape[0],activation='softmax')) model.summary()
排查方向
核对标签与模型输出的形状匹配度
报错中(None,1)是标签数据的形状,(None,5)是模型最后一层的输出形状(说明分类类别数为5)。两种调整方式:- 若标签是整数索引,将损失函数改为
sparse_categorical_crossentropy,同时确保标签形状为(样本数,),可通过y_train = y_train.squeeze()压缩多余维度; - 若标签用独热编码,需将标签转换为
(样本数,5)的形状,配合categorical_crossentropy损失函数。
- 若标签是整数索引,将损失函数改为
验证输入数据形状是否符合LSTM要求
模型定义的LSTM输入形状为(37,126),要求输入数据整体形状为(样本数,37,126),其中37对应时间步(37张图片),126对应每个时间步的特征数(126个关键点)。检查数据预处理环节,若维度顺序错误(比如(样本数,126,37)),可使用tf.transpose(input_data, perm=[0,2,1])调整。确认分类类别数的正确性
模型最后一层神经元数量由class_label.shape[0]得到,当前为5。需确认该值与实际分类类别数一致,同时标签数据的类别范围要对应(如0-4)。检查数据加载时的标签处理逻辑
若标签被错误处理为二维数组(如[[0],[1],...]),会导致形状为(None,1)。可通过print(y_train.shape)查看标签形状,若确实为二维,用y_train = y_train.flatten()或y_train = y_train.squeeze()转换为一维。
内容的提问来源于stack exchange,提问作者ddaannyyooww

