Я не могу кормить модель.набор данных переменного размера в pytorch - PullRequest
0 голосов
/ 16 мая 2019

Мой код очень прост, но набор данных немного проблематичен, потому что он имеет переменный размер. У меня есть пользовательский набор данных со следующей структурой: Notes x N_bins x Temp_values

Примечания - 2904 N_bins ВСЕГДА 252 Temp_values ​​варьируется в зависимости от заметки.

Я готовлю свой собственный набор данных и выполняю преобразования вручную.

class MusicDataSet(Dataset):
    def __init__(self, transform=None):
        self.ms, self.target, self.tam = sd.loadData()  
    def __len__(self):
        return self.tam
    def __getitem__(self, idx):
        inp = torch.from_numpy(self.ms[idx]).float()    
        #Transpose
        inp = inp.t()
        #to cuda
        inp = inp.to('cuda')
        target = self.target[idx]
        target= torch.from_numpy(self.target[idx])
        target = target.long()
        target = target.t()
        return inp, target

Я создал свой собственный collate_fn, чтобы иметь возможность разбивать набор данных на маленькие партии, но проблема в том, что я не могу вернуть партии как тензор, просто как список.

def music_collate_fn(batch):
    data = [item[0] for item in batch]
    target = [item[1] for item in batch]
    return data, target

train_loader = torch.utils.data.DataLoader(musicSet, batch_size=10, shuffle=False, collate_fn=music_collate_fn)

class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.dense1 = nn.Linear(252, 512)
        self.dense2 = nn.Linear(512, 88)
    def forward(self, x):
        x = self.dense1(x)
        x = self.relu(x)
        x = self.dense2(x)
        return x

Поезд очень прост:

mlp = MLP(input_dim, hidden_dim, output_dim).to(device)
optimizer = torch.optim.RMSprop(mlp.parameters(), lr = learning_rate)
mlp.train()
for batch_idx, (x,y) in enumerate(train_loader):
         outputs = mlp(x).to(device)
         loss = criterion(outputs, y)
         optimizer.zero_grad()           
         loss.backward()                 
         optimizer.step()                

Сбой:

File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 704, in runfile
    execfile(filename, namespace)

File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

File "C:/Users/Antonio López León/Documents/Universidad/TFG/PROYECTO/BBDD/audioCQT/ProcesamientoNN.py", line 106, in <module>
    print(x.dim())

AttributeError: 'list' object has no attribute 'dim'

Я попытался создать последовательность pad_sequence для данных в music_collate_fn, и она работает в момент подачи в сеть, но цель вызывает проблемы при вычислении потерь, поэтому я не могу использовать заполнение с целью.

Мне нужны некоторые идеи, чтобы сделать это возможным.

...