Problem in migrating from PyTorch to fastai

129 Views Asked by At

I am trying to migrate my code from PyTorch to fastai. I have the following migrated code:

    train_loader = self.init_train_dl(self.df, self.train_subjects)
    test_loader = self.init_val_dl(self.df, self.val_subjects)

    data = DataLoaders(train_loader, test_loader)
    learn = Learner(data, AlexNet3D(4608), loss_func=F.mse_loss, opt_func=Adam, metrics=accuracy)
    # learn = Learner(data, Net())
    learn.fit_one_cycle(self.cli_args.epochs, self.cli_args.lr)

However, I am getting the exception below. What is causing this and how do I fix it?

epoch     train_loss  valid_loss  accuracy  time    
Epoch 1/1 : |----------------------------------------| 0.00% [0/135 00:00<?]python-BaseException
Traceback (most recent call last):
  File "/home/faird/shared/code/external/envs/miniconda3/mini3/envs/cabinet/lib/python3.9/contextlib.py", line 137, in __exit__
    self.gen.throw(typ, value, traceback)
  File "/home/miran045/reine097/projects/AlexNet_Abrol2021/venv/lib/python3.9/site-packages/fastai/learner.py", line 162, in added_cbs
    try: yield
  File "/home/miran045/reine097/projects/AlexNet_Abrol2021/venv/lib/python3.9/site-packages/fastai/learner.py", line 264, in fit
    self._with_events(self._do_fit, 'fit', CancelFitException, self._end_cleanup)
  File "/home/miran045/reine097/projects/AlexNet_Abrol2021/venv/lib/python3.9/site-packages/fastai/learner.py", line 199, in _with_events
    try: self(f'before_{event_type}');  f()
  File "/home/miran045/reine097/projects/AlexNet_Abrol2021/venv/lib/python3.9/site-packages/fastai/learner.py", line 253, in _do_fit
    self._with_events(self._do_epoch, 'epoch', CancelEpochException)
  File "/home/miran045/reine097/projects/AlexNet_Abrol2021/venv/lib/python3.9/site-packages/fastai/learner.py", line 199, in _with_events
    try: self(f'before_{event_type}');  f()
  File "/home/miran045/reine097/projects/AlexNet_Abrol2021/venv/lib/python3.9/site-packages/fastai/learner.py", line 247, in _do_epoch
    self._do_epoch_train()
  File "/home/miran045/reine097/projects/AlexNet_Abrol2021/venv/lib/python3.9/site-packages/fastai/learner.py", line 239, in _do_epoch_train
    self._with_events(self.all_batches, 'train', CancelTrainException)
  File "/home/miran045/reine097/projects/AlexNet_Abrol2021/venv/lib/python3.9/site-packages/fastai/learner.py", line 199, in _with_events
    try: self(f'before_{event_type}');  f()
  File "/home/miran045/reine097/projects/AlexNet_Abrol2021/venv/lib/python3.9/site-packages/fastai/learner.py", line 205, in all_batches
    for o in enumerate(self.dl): self.one_batch(*o)
  File "/home/miran045/reine097/projects/AlexNet_Abrol2021/venv/lib/python3.9/site-packages/fastai/learner.py", line 235, in one_batch
    self._with_events(self._do_one_batch, 'batch', CancelBatchException)
  File "/home/miran045/reine097/projects/AlexNet_Abrol2021/venv/lib/python3.9/site-packages/fastai/learner.py", line 199, in _with_events
    try: self(f'before_{event_type}');  f()
  File "/home/miran045/reine097/projects/AlexNet_Abrol2021/venv/lib/python3.9/site-packages/fastai/learner.py", line 219, in _do_one_batch
    self.loss_grad = self.loss_func(self.pred, *self.yb)
  File "/home/miran045/reine097/projects/AlexNet_Abrol2021/venv/lib/python3.9/site-packages/torch/nn/functional.py", line 3101, in mse_loss
    if not (target.size() == input.size()):
AttributeError: 'list' object has no attribute 'size'
2

There are 2 best solutions below

0
Zain Khalid On

MSE loss function is used for regression problem. Accuracy metrics is oftenly used for classification problems. So, The loss fuction mse and metrics accuracy are incompatible.

Either you're using wrong loss function or wrong metric.

Try updating metric to mse as

 learn = Learner(data, AlexNet3D(4608), loss_func=F.mse_loss, opt_func=Adam, metrics=mse)

Otherwise, Follow the documentation for metrics and loss functions

Metrics: https://docs.fast.ai/metrics.html#mse Loss: https://docs.fast.ai/losses.html

0
Hardik On

One of these might work:

  1. Check DataLoader Output:

Ensure train_loader and test_loader yield tensors, not lists. If they yield lists, modify them to create tensors within.

  1. Adjust loss_func Argument:

If the yb you're passing contains multiple targets (e.g., for multi-task learning), unpack them correctly:

learn = Learner(data, AlexNet3D(4608), loss_func=F.mse_loss, opt_func=Adam, metrics=accuracy)

learn.fit_one_cycle(self.cli_args.epochs, self.cli_args.lr, cbs=UnpackData(1)) # Unpack for multiple targets

  1. Examine Custom Data Loading:

If you've defined custom init_train_dl or init_val_dl, verify they produce tensors with appropriate shapes.

You might also want to print the shapes of self.pred and self.yb before the loss calculation to pinpoint discrepancies.

Hope this helps.