Обнаружена ошибка IndexError в рабочем процессе DataLoader 0 с помощью специального загрузчика данных.Python

Программы на Python
Anonymous
Обнаружена ошибка IndexError в рабочем процессе DataLoader 0 с помощью специального загрузчика данных.

Сообщение Anonymous »

Я реализую контрастивное обучение для простой задачи классификации табличных данных:
class Contrastive(pl.LightningModule):

Код: Выделить всё

def __init__(self, input_dim, hidden_dim, lr, temperature, weight_decay, max_epochs=50):
super().__init__()
self.save_hyperparameters()
assert self.hparams.temperature > 0.0 #positive temperature
#Encoder
self.encoder = nn.Sequential(
nn.Linear(input_dim, 2*hidden_dim),
nn.ReLU(inplace=True),
nn.Linear(2*hidden_dim, hidden_dim)
)

def configure_optimizers(self):
optimizer = optim.AdamW(self.parameters(),
lr=self.hparams.lr,
weight_decay=self.hparams.weight_decay)
lr_scheduler=optim.lr_scheduler.CosineAnnealingLR(optimizer,
T_max=self.hparams.max_epochs,
eta_min=self.hparams.lr/50)
return [optimizer], [lr_scheduler]

def info_nce_loss(self, batch, mode='train'):
tabs, labels = batch
tabs = tabs.to(torch.float32)

feats = self.encoder(tabs)
cos_sim = F.cosine_similarity(feats[:, None], feats[None, :], dim=-1)
self_mask = torch.eye(cos_sim.shape[0], dtype=torch.bool, device=cos_sim.device)
cos_sim.masked_fill_(self_mask, -9e15)
pos_mask = torch.zeros(cos_sim.shape, dtype=torch.bool)
for i in range(label.size[0]):
pos_mask[i, :] = labels==labels[i]
cos_sim = cos_sim/self.hparams.temperature
nll = -cos_sim[pos_mask] + torch.logsumexp(cos_sim, dim-1)
nll = nll.mean()
self.log(mode+'_loss', nll)
comb_sim = torch.cat([cos_sim[pos_mask][:, None],
cos_sim.masked_fill(pos_mask, -9e15)], dim=-1)
sim_argsort = comb_sim.argsort(dim=-1, descending=True).argmin(dim=-1)
self.log(mode+'_acc_top1', (sim_argsort==0).flot().mean())
self.log(mode+'acc_top5', (sim_argsort <  5).float().mean())
self.log(mode+'acc_mean_pos', 1+sim_argsort.float().mean())

return nll

def training_step(self, batch, batch_idx):
return self.info_nce_loss(batch, mode='train')

def validation_step(self, batch, batch_idx):
self.info_nce_loss(batch, mode='val')
класс DrillingDataset(Набор данных):

Код: Выделить всё

def __init__(self, msr, label, transform=None):
self.msr = msr
self.label = label
self.transform = transform

def __len__(self):
return label.shape[0]

def __getitem__(self, idx):
if torch.is_tensor(idx):
idx = idx.tolist()

sample = self.msr[idx, :]

if self.transform:
sample = self.transform(sample)

return sample, label[idx]
def train_contrastive(data_train, label_train, data_val, label_val, patch_size, max_epochs=500, **kwargs):
trainer = pl.Trainer(default_root_dir=os.path.join (CHECKPOINT_PATH, 'Контрастный'),
accelerator="gpu" if str(device).startswith("cuda") else "cpu",
devices=1, max_epochs=max_epochs,
callbacks=[ModelCheckpoint(save_weights_only=True, mode='max', Monitor='val_acc_top5'),
LearningRateMonitor('epoch')])
trainer.logger._default_hp_metric = None

Код: Выделить всё

set_train = DrillingDataset(msr=data_train, label=label_train,
transform=transforms.Compose([Noise(0.1), Missing(0.05)]))
set_val = DrillingDataset(msr=data_val, label=label_val)
train_loader = DataLoader(set_train, batch_size=batch_size, shuffle=True,
drop_last=True, pin_memory=True, num_workers=NUM_WORKERS)
val_loader = DataLoader(set_val, batch_size=batch_size, shuffle=True,
drop_last=True,pin_memory=True, num_workers=NUM_WORKERS)

pl.seed_everything(42)
model = Contrastive(max_epochs=max_epochs, **kwargs)
trainer.fit(model, train_loader, val_loader)
model = Contrastive.load_from_checkpoint(trainer.checkpoint_callback.best_model_path)

return model
И получите эту ошибку:
IndexError: Обнаружена ошибка IndexError в рабочем процессе DataLoader 0.
Исходная обратная трассировка (последний последний вызов):
Файл "/ home/.local/lib/python3.8/site-packages/torch/utils/data/_utils/worker.py", строка 308, в _worker_loop
data = fetcher.fetch(index) # type: ignore[ возможно-не определено]
Файл «/home/.local/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py», строка 51, в fetch
data = [self.dataset[idx] для idx в возможно_batched_index]
Файл "/home/.local/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", строка 51, в
data = [self.dataset[idx] для idx в возможно_batched_index]
файл «/tmp/ipykernel_24260/2717784420.py», строка 15, в getitem
sample = self.msr[idx, :]
IndexError: индекс 96 выходит за пределы оси 0 с размером 72
Я пробовал уменьшить размер пакета (даже с размер пакета = 1, проблема остается) и количество рабочих, как я читал, это может быть проблема с памятью, но это тоже не сработало

Подробнее здесь: https://stackoverflow.com/questions/786 ... dataloader

Вернуться в «Python»