I’m having trouble trying to fine-tune a model.
My main problem is that I cannot verify if the data is being correctly interpreted by the code.
The model will not advance and have a significant result, so I suspect the labels are messed up.
To set the data for training and validation I used the following code found in the Pytorch documentation.(Finetuning Torchvision Models — PyTorch Tutorials 2.1.1+cu121 documentation)
Create training and validation datasets
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms) for x in [‘train’, ‘val’]}
Create training and validation dataloaders
dataloaders_dict = {x: torch.utils.data.DataLoader(image_datasets, batch_size=batch_size, shuffle=True, num_workers=0) for x in [‘train’, ‘val’]}
My data is organized in folders in “./database/train” and “./database/val”.
I’m treating different shoe models in different folders that I’d like to classify.
example of folders: “./database/train/ADIDAS - Yeezy 500 Bone White” and “./database/train/NIKE - OFF WHITE - Air Max 90 Desert Ore”
Where I’ve inserted multiple images of a given category (which is the name of the model).
So my main question is: when I use the torch.utils.data.Dataloader(), is it considering the name of the folder as the label and treating it automatically what is inside the folder? That’s what I thought it would do, given the map-style dataset functionality (torch.utils.data — PyTorch 2.1 documentation)
Thank you!!
The DataLoader
does not interpret or create the targets, but creates batches of samples using the Dataset
.
ImageFolder
, which you have used as the dataset, will sort the folders and assign a class label to each folder.
You could check some samples by trying to visualize a few random indices:
x, y = image_datasets['train'][0]
plt.imshow(x.permute(1, 2, 0).numpy())
print(y)
print(image_datasets['train'].class_to_index)
Note that the visualization might look distorted, if you’ve normalized the data, so you could either remove the normalization for the sake of debugging or “unnormalize” the data.
1 Like
Thank you!! That was really helpful, so if I just separate the folders of different classes with different names this should take care of it for me?
The reason I asked it is because I though the Data loader in Pytorch was messing up the labels.
I’m fine tuning vgg11, resnet and other models in order to classify 77 shoe classes where I have about 100 to 150 samples of each class (about 12k images in total), about 70% for training and 30% for testing, the results wont get any better than 1/77=1.3% and I find it really awkward, even though I know I don’t have a good data-set.
Do you think that’s normal?
Thank you again and again, I really appreciate your help !!
Yes, this should be the case.
I would recommend to scale down the problem a bit and maybe just use two classes with 5 samples each. Once you’ve created this dummy dataset, try to overfit your model so that you reach ~100% accuracy by changing the learning rate etc.
If that’s not possible, there might be a bug in your code somewhere or the model architecture is “bad”, but I doubt the second point as VGG and ResNet models are heavily used.
1 Like