加载训练数据时如何修复“TypeError: 'list' object is not callable”

问题描述 投票:0回答:1

我正在尝试将数据加载到训练循环中,但是,“TypeError:'list'对象不可调用”不断发生。

这是用于加载数据的函数:

def data_loader(data, transform, batch_size, cache=False):
    # this function uses the monai framework
    if cache:
        data_ds = CacheDataset(data=data, transform=transform,cache_rate=1.0)
        data_loader = DataLoader(data_ds, batch_size=batch_size)

    else:
        data_ds = Dataset(data=data, transform=transform)
        data_loader = DataLoader(data_ds, batch_size=batch_size)
        
    return data_loader

在代码的主脚本中,使用上面的函数加载数据:

train_loader = data_loader(train, transform(train=True), batch_size, cache=True)

其中变量

train
是图像和蒙版的Python字典列表。

然后将

train_loader
传递到
train()
函数中:

for epoch in range(num_epochs):
        
        trainLoss = train(model, train_loader, optimizer, loss_fn)

train 函数返回 epoch 损失值。但是,当变量

train_loader
传递给
train()
时,就会出现错误。

这是火车功能的代码:

def train (model, loader, optimizer, dice_loss, device=torch.device('cuda')):
    
    epoch_loss = 0.0 
    
    model.train()
    for data in loader:
        
        # split data to image and mask
        image = data['image']
        mask = data['mask']
        
        # send data to gpu for accelerated process
        image = image.to(device)
        mask = mask.to(device)
        
        # zero the gradients before backpropagation
        optimizer.zero_grad()
        
        # feed data to model and get predicted mask
        pred_mask = model(image)
        
        # calculate loss value by comparing predicted and original mask
        # perform backpropagation, update parameters and calculate epoch loss
        loss = dice_loss(pred_mask, mask)
        loss.backward()
        optimizer.step()
        epoch_loss += loss.item()
        
    epoch_loss = epoch_loss/len(loader) 
    
    return epoch_loss

如果我不使用函数,代码似乎可以工作:

for epoch in range(num_epochs):
        
        epoch_loss = 0.0 
        
        model.train()
        for data in train_loader:
            
            # split data to image and mask
            image = data['image']
            mask = data['mask']
            
            # send data to gpu for accelerated process
            image = image.to(device)
            mask = mask.to(device)
            
            # zero the gradients before backpropagation
            optimizer.zero_grad()
            
            # feed data to model and get predicted mask
            pred_mask = model(image)
            
            # calculate loss value by comparing predicted and original mask
            # perform backpropagation, update parameters and calculate epoch loss
            loss = loss_fn(pred_mask, mask)
            loss.backward()
            optimizer.step()
            epoch_loss += loss.item()
            
        trainLoss = epoch_loss/len(train_loader) 

有没有办法在仍然使用该函数的同时修复错误,或者我应该不使用该函数?

deep-learning pytorch dataset loading image-segmentation
1个回答
0
投票

在Python中函数和变量可以互相覆盖。因此,当您定义函数 train() 时,您将覆盖训练数据字典。

>>> a = 5
>>> a
5
>>> def a():
...   return 3
>>> a
<function a at 0x103697160>

我建议将火车字典命名为train_data。

我还会注意命名变量“input”或“list”,因为这会导致问题,因为你正在覆盖Python的默认类。

© www.soinside.com 2019 - 2024. All rights reserved.