Python处理性别语音数据集时输入形状不匹配问题求助
解决全连接神经网络输入形状不匹配问题
咱们先拆解这个报错:ValueError: Error when checking input: expected dense_1_input to have shape (None, 2800) but got array with shape (3168, 1)。核心问题很明确——你的模型期望每个输入样本是2800维的特征向量,但实际喂进去的3168个样本里,每个样本只有1维。这几乎可以肯定是你加载CSV文件的方式出了问题,把所有特征都错误地挤到一列里了。
第一步:修正CSV数据加载方式
手动用csv模块加载很容易出现解析错误,推荐用更稳定的工具来处理数据集,这里给你两种靠谱的方案:
方案1:用Pandas加载(最省心)
import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split # 加载数据集(替换成你的文件实际路径) df = pd.read_csv("voice.csv") # 分离特征与标签(假设数据集最后一列是性别标签,列名为"label") X = df.drop("label", axis=1).values y = df["label"].map({"male": 0, "female": 1}).values # 把字符串标签转成模型能识别的数值 # 标准化特征(全连接网络对数据尺度敏感,这一步很重要) scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 拆分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42) # 检查特征形状:正常应该是 (样本数, 2800) print("训练集特征形状:", X_train.shape)
方案2:用Numpy加载
如果不想用Pandas,Numpy的genfromtxt也能解决问题:
import numpy as np # 跳过表头,按逗号分隔解析数据 data = np.genfromtxt("voice.csv", delimiter=",", skip_header=1) # 分离特征(所有列除了最后一列)和标签(最后一列) X = data[:, :-1] y = data[:, -1] # 同样做标准化处理...
要是你坚持用csv模块手动加载,一定要确保每行数据被拆分成独立的特征元素:
import csv import numpy as np X = [] y = [] with open("voice.csv", "r") as f: reader = csv.reader(f) next(reader) # 跳过表头行 for row in reader: # 把每行除最后一列的内容转成浮点型特征 features = np.array(row[:-1], dtype=np.float32) X.append(features) # 把性别标签转成数值 label = 0 if row[-1] == "male" else 1 y.append(label) X = np.array(X) y = np.array(y) print("特征形状:", X.shape) # 正确输出应该是 (3168, 2800)
第二步:匹配模型输入层形状
加载完正确的特征后,模型的输入层必须和特征维度对应上,不能硬写2800,最好用代码动态获取:
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense # 动态获取每个样本的特征维度 n_features = X_train.shape[1] model = Sequential() # 输入层形状要和特征维度完全一致 model.add(Dense(64, activation='relu', input_shape=(n_features,))) model.add(Dense(32, activation='relu')) model.add(Dense(1, activation='sigmoid')) # 二分类任务,输出1维概率值 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 开始训练 history = model.fit(X_train, y_train, epochs=15, batch_size=32, validation_split=0.1)
第三步:排查常见坑
- 如果你之前手动处理过语音特征(比如拼接成2800维),一定要检查最终特征数组的形状是
(3168, 2800),而不是(3168*2800,)或者(3168,1,2800),用print(X.shape)就能快速验证。 - 标签必须是数值型,不能直接用字符串喂给模型,否则会触发其他类型的错误。
内容的提问来源于stack exchange,提问作者user8379153
相关产品推荐
相关产品推荐

