如何为句子级嵌入任务设置LSTM输入形状并解决f1_score计算报错
问题原因与解决办法
核心问题原因
- 第一,测试集样本数不匹配:1430条样本按0.2的测试集比例计算,测试集样本数应为
1430*0.2=286,你观测到y_test.shape为(268,1),说明Y数组在切分前就存在维度异常,或是你在切分后对y_test做了多余的切片、过滤操作。 - 第二,LSTM输出维度异常:你贴出的代码中LSTM层没有设置
return_sequences=True,正常输出维度应该是(样本数, 32),经过Dense层后输出应为(样本数, 1),出现(286,58,1)说明你实际运行的代码和贴出的版本不一致,大概率是LSTM层误加了return_sequences=True参数,导致每个时间步都输出了结果,而非整条序列的最终输出。 - 第三,预测接口兼容性问题:高版本TensorFlow已经移除了
predict_classes方法,使用该接口会导致输出结果格式异常。
分步解决步骤
- 第一步:修正切分逻辑与维度对齐
在切分代码后增加维度校验,同时将标签数组压缩为一维,避免多余维度干扰:x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2,random_state=42) # 新增校验,确保测试集输入和标签样本数一致 assert x_test.shape[0] == y_test.shape[0], f"测试集样本数不匹配:x_test共{x_test.shape[0]}条,y_test共{y_test.shape[0]}条" # 压缩标签数组为一维 y_train = y_train.ravel() y_test = y_test.ravel() x_train=x_train.reshape(x_train.shape[0],58,1024) x_test=x_test.reshape(x_test.shape[0],58,1024) - 第二步:修正LSTM层配置
确认LSTM层没有添加return_sequences=True参数,保证输出为整条序列的最终特征:model = Sequential() # 禁止添加return_sequences=True参数,否则会输出每个时间步的结果 model.add(LSTM(32, input_shape=(58, 1024))) model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=5, batch_size=32) - 第三步:修正预测与F1计算逻辑
替换已废弃的predict_classes接口,手动将概率输出转为分类结果,同时压缩多余维度:# 输出预测概率并压缩为一维 y_pred = model.predict(x_test).ravel() # 按0.5阈值将概率转为二分类标签 y_pred = (y_pred >= 0.5).astype(int) f1 = f1_score(y_test, y_pred)
内容的提问来源于stack exchange,提问作者aldin
相关产品推荐
相关产品推荐

