手语识别LSTM模型数据预处理与模型报错解决咨询
问题解决:手语识别数据预处理与LSTM模型适配
错误原因分析
你遇到的ValueError核心问题是:预处理生成的X是object类型的嵌套numpy数组,而非TensorFlow要求的统一数值型三维数组。原代码中[np.array(frame).flatten() for frame in frames]生成了包含311个一维数组的列表,转成大数组后形状为(样本数, 311),每个元素是独立的(63,)数组,TensorFlow无法直接将这种嵌套结构转换为张量。
修正后的预处理代码
直接将每个样本的所有帧转换为(311, 63)的二维数组,最终生成(样本数, 311, 63)的三维float数组:
import numpy as np def prepare_data(df, max_frame_size=311): X = [] y = [] for filename, group in df.groupby('filename'): frames = group['landmarks'].tolist() # 填充/截断到固定帧长 if len(frames) < max_frame_size: # 生成全0的填充帧(和原数据结构一致:21个节点×3坐标) pad_frames = [[[0.0, 0.0, 0.0] for _ in range(21)] for _ in range(max_frame_size - len(frames))] frames.extend(pad_frames) else: frames = frames[:max_frame_size] # 直接展平为(311, 63)的二维数组 sample_array = np.array(frames).reshape(max_frame_size, 21*3) X.append(sample_array) y.append(group['class_id'].iloc[0]) # 转换为统一的三维float32数组,确保TensorFlow可识别 X = np.array(X, dtype=np.float32) y = np.array(y, dtype=np.int32) return X, y
修正后的LSTM模型代码
原模型存在语法错误(Sequential未闭合括号),且LSTM更适合用tanh作为激活函数(relu易引发梯度消失),同时补充了关键的模型编译步骤:
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Masking, LSTM, BatchNormalization, Dropout, Dense from tensorflow.keras.callbacks import EarlyStopping max_frame_size = 311 num_classes = len(label_encoder.classes_) model = Sequential([ Masking(mask_value=0.0, input_shape=(max_frame_size, 63)), LSTM(64, return_sequences=True, activation='tanh'), BatchNormalization(), Dropout(0.5), LSTM(128, return_sequences=True, activation='tanh'), BatchNormalization(), Dropout(0.5), LSTM(64, return_sequences=False, activation='tanh'), BatchNormalization(), Dense(64, activation='relu'), Dense(32, activation='relu'), Dense(num_classes, activation='softmax') ]) # 根据标签类型选择损失函数:整数标签用sparse_categorical_crossentropy,one-hot标签用categorical_crossentropy model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True) history = model.fit( X_train, y_train, validation_data=(X_validation, y_validation), epochs=50, batch_size=32, callbacks=[early_stopping] )
关键注意事项
- 标签类型匹配:如果你的
y是one-hot编码(如[0,1,0]),将损失函数改为categorical_crossentropy;如果是整数标签(如1),保留sparse_categorical_crossentropy。 - 数据类型统一:确保
X是float32类型,y是int32或float32类型,避免TensorFlow类型转换报错。 - Masking层有效性:填充的帧必须是全0数组,否则
mask_value=0.0无法正确忽略无效帧。
内容的提问来源于stack exchange,提问作者karesosis
相关产品推荐
相关产品推荐

