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

HuBMAPDataset类中乘法操作触发TypeError错误求助

类型错误:builtin_function_or_method与int无法执行乘法运算

问题场景

在HuBMAPDataset类的初始化方法中,执行self.sz = reduce*sz计算尺寸参数时,触发以下类型错误:

TypeError: unsupported operand type(s) for *: 'builtin_function_or_method' and 'int'

相关代码

reduce = 4
class HuBMAPDataset:
    def __init__(self, idx, fold, train=True, tfms=None):
        self.data = rasterio.open(os.path.join(DATA,idx+'.tiff'), transform = identity,num_threads='all_cpus')
        ids = pd.read_csv(LABELS).id.astype(str).values
        kf = KFold(n_splits=nfolds,random_state=SEED,shuffle=True)
        ids = set(ids[list(kf.split(ids))[fold][0 if train else 1]])
        self.fnames = [fname for fname in os.listdir(TRAIN) if fname.split('_')[0] in ids]
        self.train = train
        self.tfms = tfms
        if self.data.count != 3:
            subdatasets = self.data.subdatasets
            self.layers = []
            if len(subdatasets) > 0:
                for i, subdataset in enumerate(subdatasets, 0):
                    self.layers.append(rasterio.open(subdataset))
        self.shape = self.data.shape
        self.reduce = reduce
        self.sz = reduce*sz  # 报错行
        self.pad0 = (self.sz - self.shape[0]%self.sz)%self.sz
        self.pad1 = (self.sz - self.shape[1]%self.sz)%self.sz
        self.n0max = (self.shape[0] + self.pad0)//self.sz
        self.n1max = (self.shape[1] + self.pad1)//self.sz
        
    def __len__(self):
        return len(self.fnames), self.n0max*self.n1max
    
    def __getitem__(self, idx):
        fname = self.fnames[idx]
        img = cv2.cvtColor(cv2.imread(os.path.join(TRAIN,fname)), cv2.COLOR_BGR2RGB)
        mask = cv2.imread(os.path.join(MASKS,fname),cv2.IMREAD_GRAYSCALE)
        if self.tfms is not None:
            augmented = self.tfms(image=img,mask=mask)
            img,mask = augmented['image'],augmented['mask']
        n0,n1 = idx//self.n1max, idx%self.n1max
        x0,y0 = -self.pad0//2 + n0*self.sz, -self.pad1//2 + n1*self.sz
        p00,p01 = max(0,x0), min(x0+self.sz,self.shape[0])
        p10,p11 = max(0,y0), min(y0+self.sz,self.shape[1])
        img = np.zeros((self.sz,self.sz,3),np.uint8)
        if self.data.count == 3:
            img[(p00-x0):(p01-x0),(p10-y0):(p11-y0)] = np.moveaxis(self.data.read([1,2,3],
                window=Window.from_slices((p00,p01),(p10,p11))), 0, -1)
        else:
            for i,layer in enumerate(self.layers):
                img[(p00-x0):(p01-x0),(p10-y0):(p11-y0),i] =\
                  layer.read(1,window=Window.from_slices((p00,p01),(p10,p11)))
        if self.reduce != 1:
            img = cv2.resize(img,(self.sz//reduce,self.sz//reduce),
                             interpolation = cv2.INTER_AREA)
        #check for empty imges
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        h,s,v = cv2.split(hsv)
        if (s>s_th).sum() <= p_th or img.sum() <= p_th:
            #images with -1 will be skipped
            return img2tensor((img/255.0 - mean)/std), -1, img2tensor(mask)
        else: return img2tensor((img/255.0 - mean)/std), idx, img2tensor(mask)


for fold in range(nfolds):
    for idx,row in tqdm(df_sample.iterrows(),total=len(df_sample)):
        idx = str(row['id'])
        ds_t = HuBMAPDataset(idx, fold=fold, train=True, tfms=get_aug())

报错回溯

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_33/1067530021.py in <module>
      3     for idx,row in tqdm(df_sample.iterrows(),total=len(df_sample)):
      4         idx = str(row['id'])
----> 5         ds_t = HuBMAPDataset(idx, fold=fold, train=True, tfms=get_aug())
      6         ds_v = HuBMAPDataset(idx, fold=fold, train=False)
      7         data = ImageDataLoaders.from_dsets(ds_t,ds_v,bs=bs,num_workers=NUM_WORKERS,pin_memory=True).cuda()

/tmp/ipykernel_33/3421423662.py in __init__(self, idx, fold, train, tfms)
     25         self.shape = self.data.shape
     26         self.reduce = reduce
---&gt; 27         self.sz = reduce*sz
     28         self.pad0 = (self.sz - self.shape[0]%self.sz)%self.sz
     29         self.pad1 = (self.sz - self.shape[1]%self.sz)%self.sz

TypeError: unsupported operand type(s) for *: 'builtin_function_or_method' and 'int'

df_sample数据

df_sample.to_dict()
{'id': {0: 10078}, 'rle': {0: '12 34'}}

问题原因与解决方案

原因

代码中未定义数值类型的sz变量,Python将sz解析为了某个内置函数/方法对象,导致无法与整数reduce(值为4)执行乘法运算。

解决方案

  1. 定义基础尺寸变量:在类的外部或__init__方法内部,先定义一个数值类型的基础尺寸sz,例如常用的分块尺寸256或512:
    # 示例:在类外定义基础sz
    reduce = 4
    sz = 256  # 新增基础尺寸定义
    class HuBMAPDataset:
        def __init__(self, idx, fold, train=True, tfms=None):
            # ... 其他代码 ...
            self.sz = reduce * sz
    
    或者在__init__内定义:
    def __init__(self, idx, fold, train=True, tfms=None):
        # ... 其他代码 ...
        sz = 256
        self.sz = reduce * sz
    
  2. 检查变量名冲突:确保sz没有与导入的库内置函数、方法重名,若有冲突则更换变量名(例如改为base_sz)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:45:36