Sklearn标签编码报错:ValueError: 解包值不足(期望3个,得到1个)
修复图像分割标签编码的维度错误
报错原因
ValueError: not enough values to unpack (expected 3, got 1) 是因为train_masks的维度不是代码预期的3维(样本数n + 高度h + 宽度w),实际是1维数组,导致无法解包出3个变量。
解决方案
先检查掩码的实际维度,再根据情况修正,同时修复原代码中LabelEncoder的隐藏问题(要求输入为1维数组):
修改后的完整代码
# Encode labels... from sklearn.preprocessing import LabelEncoder import numpy as np labelencoder = LabelEncoder() # 1. 检查并修正掩码维度 print("原始掩码形状:", train_masks.shape) if len(train_masks.shape) == 2: # 单张掩码(仅H,W),添加样本维度转为(1, H, W) train_masks = train_masks[np.newaxis, ...] elif len(train_masks.shape) == 1: # 1维掩码需手动指定原形状,替换成你的实际样本数、高、宽 # 示例:train_masks = train_masks.reshape(100, 256, 256) raise ValueError("1维掩码无法自动恢复形状,请手动指定(N, H, W)尺寸后reshape") # 2. 正常解包维度 n, h, w = train_masks.shape # 3. 扁平化并编码(修复LabelEncoder的输入要求) train_masks_reshaped = train_masks.reshape(-1) # 直接转成1维,无需额外维度 train_masks_encoded = labelencoder.fit_transform(train_masks_reshaped) # 4. 重塑回原形状 train_masks_encoded_original_shape = train_masks_encoded.reshape(n, h, w)
关键说明
- 若掩码是单张图片(2维H,W):用
np.newaxis添加样本维度,变成(1, H, W),满足3维解包要求 - 若掩码是被错误展平的1维数组:必须手动指定原有的(N, H, W)形状,因为程序无法自动推断原始尺寸
- 原代码中
train_masks_reshaped = train_masks.reshape(-1,1)生成的是2维数组,LabelEncoder要求输入为1维,因此直接用reshape(-1)转成1维即可避免后续报错
内容的提问来源于stack exchange,提问作者Bet
相关产品推荐
相关产品推荐

