我正在尝试将数据加载到训练循环中,但是,“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)
有没有办法在仍然使用该函数的同时修复错误,或者我应该不使用该函数?
在Python中函数和变量可以互相覆盖。因此,当您定义函数 train() 时,您将覆盖训练数据字典。
>>> a = 5
>>> a
5
>>> def a():
... return 3
>>> a
<function a at 0x103697160>
我建议将火车字典命名为train_data。
我还会注意命名变量“input”或“list”,因为这会导致问题,因为你正在覆盖Python的默认类。