You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BraTS20数据集getListAgeDays函数X_all形状异常问题求助

BraTS20数据集脑肿瘤分析:getListAgeDays返回空数组问题排查

问题描述

在基于BraTS20数据集的脑肿瘤分析项目中,调用getListAgeDays函数计算特征时出现异常:预期生成有效特征数组,但实际返回的X_all形状为(0,),是空数组。已确认train_and_test_ids、age_dict、days_dict等输入参数均正确定义且包含数据,仍无法定位问题,寻求排查思路。

相关代码

# id: age, categories
def getListAgeDays(id_list):
    x_val = []
    y_val = []
    for i in id_list:
        if (i not in age_dict):
            continue
        masks = getMaskSizesForVolume(nib.load(TRAIN_DATASET_PATH + f'BraTS20_Training_{i[-3:]}/BraTS20_Training_{i[-3:]}_seg.nii').get_fdata())
        brain_vol = getBrainSizeForVolume(nib.load(TRAIN_DATASET_PATH + f'BraTS20_Training_{i[-3:]}/BraTS20_Training_{i[-3:]}_t1.nii').get_fdata())
        masks[1] = masks[1]/brain_vol
        masks[2] = masks[2]/brain_vol
        masks[3] = masks[3]/brain_vol
        merged=[age_dict[i],masks[1],masks[2],masks[3]] ## add segments
        x_val.append(merged) 
        if (days_dict[i] < 250):
            y_val.append([1,0,0])
        elif (days_dict[i] >= 250 and days_dict[i] < 450):
            y_val.append([0,1,0])
        else:
            y_val.append([0,0,1])
            
    return np.array(x_val), np.array(y_val)

X_all, y_all = getListAgeDays(train_and_test_ids)

print(f'X_test: {X_all.shape}')
df = pd.DataFrame(np.concatenate((X_all, y_all), axis=1) , columns = ["age",f"{SEGMENT_CLASSES[1]}",f"{SEGMENT_CLASSES[2]}",f"{SEGMENT_CLASSES[3]}","short","medium","long"])
df.head()

实际输出

(array([], dtype=float64), array([], dtype=float64))
X_test: (0,)

排查思路

  • 验证ID与字典键的匹配一致性:即使age_dict包含数据,也要确认train_and_test_ids中的每个ID格式是否和age_dict的键完全一致(比如是否存在大小写差异、前后空格、ID长度不符等)。可以在循环内添加调试打印:
    print(f"当前ID: {i}, 是否在age_dict中: {i in age_dict}")
    
    查看哪些ID被continue语句跳过。
  • 检查文件路径拼接正确性:代码中通过i[-3:]截取ID后三位拼接路径,需确认train_and_test_ids中的ID格式是否符合预期(比如是否为长度足够的字符串,后三位确实对应数据集的编号)。同时检查TRAIN_DATASET_PATH是否以斜杠结尾,避免路径拼接错误。可以打印完整路径手动验证文件是否存在:
    seg_path = TRAIN_DATASET_PATH + f'BraTS20_Training_{i[-3:]}/BraTS20_Training_{i[-3:]}_seg.nii'
    print(f"当前分割文件路径: {seg_path}")
    
  • 捕获子函数执行异常:getMaskSizesForVolume或getBrainSizeForVolume执行出错可能导致当前ID处理中断,甚至终止整个循环。可以添加异常捕获代码:
    try:
        masks = getMaskSizesForVolume(nib.load(seg_path).get_fdata())
        t1_path = TRAIN_DATASET_PATH + f'BraTS20_Training_{i[-3:]}/BraTS20_Training_{i[-3:]}_t1.nii'
        brain_vol = getBrainSizeForVolume(nib.load(t1_path).get_fdata())
    except Exception as e:
        print(f"处理ID {i}时出错: {str(e)}")
        continue
    
  • 确认days_dict的键存在性:循环中直接调用days_dict[i],若ID不在days_dict中会触发KeyError,可能导致循环中断。可以在跳过age_dict检查后,新增days_dict存在性判断:
    if i not in days_dict:
        print(f"ID {i}不在days_dict中")
        continue
    
  • 验证循环是否实际执行:在循环开头添加打印语句,确认train_and_test_ids非空且循环正常启动:
    print(f"正在处理第{id_list.index(i)+1}个ID: {i}")
    

内容的提问来源于stack exchange,提问作者Sheeraz Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:30:32