Brudalaxe
Brudalaxe

Reputation: 191

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

I'm trying to prepare some audio data for a Dataloader but I'm struggling with a few points. At the moment my data is organised into two lists inputs and target, which are both length 32, but have different dimensions for their elements; inputs[0].shape = (8, 3690288) (8 mono audio tracks) and target[0].shape = (2, 3690288) (a single stereo mix).

I've converted each array to a tensor by:

tensor_inputs = torch.Tensor(inputs)
tensor_target = torch.Tensor(target)

which seems to work: tensor_inputs.shape = torch.Size([32, 8, 3690288]). I've then tried to convert each of these to a melspectrogram:

melspectrogram = torchaudio.transforms.melspectrogram(
        sr=44100,
        n_fft=1024,
        hop_length=512,
        n_mels=64)

tensor_input_specs = []

for i in range(len(tensor_inputs)):
    spec = mel_spectrogram(tensor_inputs[i])
    tensor_input_specs.append(spec)
    
tensor_target_specs = []

for i in range(len(tensor_target)):
    spec = mel_spectrogram(tensor_target[i])
    tensor_target_specs.append(spec)

and then move these into a Dataloader by doing:

dataset = TensorDataset(tensor_input_specs,tensor_target_specs)
iter = DataLoader(dataset)

However I get the following error: AttributeError: 'list' object has no attribute 'size', which I imagine is due to the fact that I'm appending the spectrograms to a list, but I'm not sure how else to achieve this.

EDIT:

AttributeError                            Traceback (most recent call last)
C:\Users\BRUDAL~1\AppData\Local\Temp/ipykernel_24968/2240294361.py in <module>
     14     tensor_target_specs.append(spec)
     15 
---> 16 dataset = TensorDataset(tensor_input_specs,tensor_target_specs)
     17 iter = DataLoader(dataset) # create your dataloader

~\anaconda3\lib\site-packages\torch\utils\data\dataset.py in __init__(self, *tensors)
    165 
    166     def __init__(self, *tensors: Tensor) -> None:
--> 167         assert all(tensors[0].size(0) == tensor.size(0) for tensor in tensors), "Size mismatch between tensors"
    168         self.tensors = tensors
    169 

~\anaconda3\lib\site-packages\torch\utils\data\dataset.py in <genexpr>(.0)
    165 
    166     def __init__(self, *tensors: Tensor) -> None:
--> 167         assert all(tensors[0].size(0) == tensor.size(0) for tensor in tensors), "Size mismatch between tensors"
    168         self.tensors = tensors
    169 

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

Upvotes: 0

Views: 7262

Answers (1)

Brudalaxe
Brudalaxe

Reputation: 191

The most straightforward method I've found is by stacking the list after the for loops, by using torch.stack:

tensor_input_specs = []

for i in range(len(tensor_inputs)):
    spec = mel_spectrogram(tensor_inputs[i])
    tensor_input_specs.append(spec)
    
tensor_input_specs = torch.stack(train_tensor_input_specs)

tensor_input_specs.shape

>>> torch.size([32, 8, 64, 7208])

Upvotes: 1

Related Questions