Error (pytorch?): Expected object of scalar type Long but got scalar type Float for argument #2 'other

It worked for me too. Thanks, @stephenjohnson :slight_smile:

Another solution would be writing a bit of code to grab the labels from the df and split the dataset in folders.

1 Like

Can you help me understand what targs are, and how to change them? I can see several spots in the error stack trace that use “targs”, but when I use the code you provided I get:

NameError: name ‘targs’ is not defined

which makes sense to me because I haven’t defined it elsewhere.

1 Like

targs stands for target arguments It’s the values that are the truth values (the Y values) that are being compared to your model’s predicted values. The accuracy metric above takes two arguments the input (predicted values) and targs (target values) and calculates the accuracy. The error encountered above was due to the fact that the input had Long values but targs had Float values. All my suggestion did was to have them convert the Float values to Long values so they could be properly compared by the == operator.

2 Likes

In case anyone experiences this error in a regression task, it can arise due to using error_rate or accuracy as a metric in the learner. Using MAE will fix it.

Changing metrics helped me multi-label classification problem
learn = cnn_learner(data, models.resnet34, metrics=accuracy_thresh)

3 Likes

Which means you use metrics=mean_squared_error

@retepvan @jeremy uses accuracy as a metric in lesson 4 of practical guide to ML for coders. Any idea why this works for him but not us? (He is doing a regression problem)

If anyone just wants code:

def accuracy_1(input:Tensor, targs:Tensor)->Rank0Tensor:
“Compute accuracy with targs when input is bs * n_classes.”
targs = targs.view(-1).long()
n = targs.shape[0]
input = input.argmax(dim=-1).view(n,-1)
targs = targs.view(n,-1)
return (input==targs).float().mean()

So use metrics=accuracy_1 instead of accuracy

4 Likes

Could you please explain it a little more step by step? It is not clear to me and I got the same error.

hello @stephenjohnson … I ran into the same type of problem

Expected object of scalar type Float but got scalar type Long for argument #2 'other'

i then modified the accuracy function and included it in metrics arguments and it worked like a charm. My problem comes a bit later when i try to plot the confusion matrix. The same error pops up. What should I do now?

3 Likes

I too get the error while plotting confusion matrix. Did you solve it?

I converted my label column from float type to int type, and it solved the problem.

df = df.assign(label=df.label.astype('int'))
1 Like

Got this error

RuntimeError: shape ‘[70912, -1]’ is invalid for input of size 64

when i implemented

def accuracy_1(input:Tensor, targs:Tensor)->Rank0Tensor:
‘Compute accuracy with targs when input is bs * n_classes.’
targs = targs.view(-1).long()
n = targs.shape[0]
input = input.argmax(dim=-1).view(n,-1)
targs = targs.view(n,-1)
return (input==targs).float().mean()

RuntimeError Traceback (most recent call last)
in
1 #Fit the model
----> 2 learn.fit_one_cycle(1,slice(lr))#5

/opt/conda/lib/python3.6/site-packages/fastai/train.py in fit_one_cycle(learn, cyc_len, max_lr, moms, div_factor, pct_start, final_div, wd, callbacks, tot_epochs, start_epoch)
20 callbacks.append(OneCycleScheduler(learn, max_lr, moms=moms, div_factor=div_factor, pct_start=pct_start,
21 final_div=final_div, tot_epochs=tot_epochs, start_epoch=start_epoch))
—> 22 learn.fit(cyc_len, max_lr, wd=wd, callbacks=callbacks)
23
24 def lr_find(learn:Learner, start_lr:Floats=1e-7, end_lr:Floats=10, num_it:int=100, stop_div:bool=True, wd:float=None):

/opt/conda/lib/python3.6/site-packages/fastai/basic_train.py in fit(self, epochs, lr, wd, callbacks)
200 callbacks = [cb(self) for cb in self.callback_fns + listify(defaults.extra_callback_fns)] + listify(callbacks)
201 self.cb_fns_registered = True
–> 202 fit(epochs, self, metrics=self.metrics, callbacks=self.callbacks+callbacks)
203
204 def create_opt(self, lr:Floats, wd:Floats=0.)->None:

/opt/conda/lib/python3.6/site-packages/fastai/basic_train.py in fit(epochs, learn, callbacks, metrics)
104 if not cb_handler.skip_validate and not learn.data.empty_val:
105 val_loss = validate(learn.model, learn.data.valid_dl, loss_func=learn.loss_func,
–> 106 cb_handler=cb_handler, pbar=pbar)
107 else: val_loss=None
108 if cb_handler.on_epoch_end(val_loss): break

/opt/conda/lib/python3.6/site-packages/fastai/basic_train.py in validate(model, dl, loss_func, cb_handler, pbar, average, n_batch)
61 if not is_listy(yb): yb = [yb]
62 nums.append(first_el(yb).shape[0])
—> 63 if cb_handler and cb_handler.on_batch_end(val_losses[-1]): break
64 if n_batch and (len(nums)>=n_batch): break
65 nums = np.array(nums, dtype=np.float32)

/opt/conda/lib/python3.6/site-packages/fastai/callback.py in on_batch_end(self, loss)
306 “Handle end of processing one batch with loss.”
307 self.state_dict[‘last_loss’] = loss
–> 308 self(‘batch_end’, call_mets = not self.state_dict[‘train’])
309 if self.state_dict[‘train’]:
310 self.state_dict[‘iteration’] += 1

/opt/conda/lib/python3.6/site-packages/fastai/callback.py in call(self, cb_name, call_mets, **kwargs)
248 “Call through to all of the CallbakHandler functions.”
249 if call_mets:
–> 250 for met in self.metrics: self._call_and_update(met, cb_name, **kwargs)
251 for cb in self.callbacks: self._call_and_update(cb, cb_name, **kwargs)
252

/opt/conda/lib/python3.6/site-packages/fastai/callback.py in _call_and_update(self, cb, cb_name, **kwargs)
239 def call_and_update(self, cb, cb_name, **kwargs)->None:
240 “Call cb_name on cb and update the inner state.”
–> 241 new = ifnone(getattr(cb, f’on
{cb_name}’)(**self.state_dict, **kwargs), dict())
242 for k,v in new.items():
243 if k not in self.state_dict:

/opt/conda/lib/python3.6/site-packages/fastai/callback.py in on_batch_end(self, last_output, last_target, **kwargs)
342 if not is_listy(last_target): last_target=[last_target]
343 self.count += first_el(last_target).size(0)
–> 344 val = self.func(last_output, *last_target)
345 if self.world:
346 val = val.clone()

in accuracy_1(input, targs)
5 targs = targs.view(-1).long()
6 n = targs.shape[0]
----> 7 input = input.argmax(dim=-1).view(n,-1)
8 targs = targs.view(n,-1)
9 return (input==targs).float().mean()

RuntimeError: shape ‘[70912, -1]’ is invalid for input of size 64

1 Like

Hi Tony,
Currently I am facing same issue.Were you able to solve this error?

Regards,
Faiz

Same here but my labels (from df) are all ints. Makes no sense to me why fastai converted the labels to float for some reason.

data = ImageDataBunch.from_df('patches/', df.iloc[:640], label_col=list(df.columns[1:]), bs=32)
print([df[col].dtype for col in df.columns[1:]])

# [dtype('int64'), dtype('int64'), dtype('int64'), dtype('int64'), dtype('int64'), dtype('int64')]

I used a simple wrapper with casting and it works:

def accuracy_cast(input:Tensor, targs:Tensor)->Rank0Tensor:
    targs = targs.long()
    return accuracy(input, targs)

learn = cnn_learner(data, models.resnet18, metrics=accuracy_cast)
learn.fit(1)

But this smells like a true bug.

3 Likes

Thank you @phillies, this fixed the problem for me :+1:

I have the same error, but in my case it is due to an error creating the ImageList

src = (ImageList.from_df(df.sample(n=200), path, folder='train', suffix='.jpeg')
       .split_by_rand_pct()
       .label_from_df(label_delim=',')   # Error!
      )
data = (src.transform(get_transforms(max_warp=0.), size=64).databunch().normalize())
learn = cnn_learner(data,  models.resnet34, metrics=error_rate)
...
RuntimeError: Expected object of scalar type Long but got scalar type Float for argument #2 'other'

the correct version works for me:

src = (ImageList.from_df(df.sample(n=200), path, folder='train', suffix='.jpeg')
       .split_by_rand_pct()
       .label_from_df(cols='level')
      )
3 Likes

I’m also getting this error now, when trying to create a dataBunch

np.random.seed(44)
data = ImageDataBunch.from_folder(path, 
                                  train=".",
                                  valid_pct=0.22,
                                  ds_tfms=get_transforms(),
                                  size=224, 
                                  num_workers=4,
                                  bs=32).normalize(imagenet_stats)


---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/fastai/data_block.py in _check_kwargs(ds, tfms, **kwargs)
    593         x = ds[0]
--> 594         try: x.apply_tfms(tfms, **kwargs)
    595         except Exception as e:

10 frames
RuntimeError: Expected object of scalar type Float but got scalar type Double for argument #3 'mat2' in call to _th_addmm_out

During handling of the above exception, another exception occurred:

Exception                                 Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/fastai/data_block.py in _check_kwargs(ds, tfms, **kwargs)
    594         try: x.apply_tfms(tfms, **kwargs)
    595         except Exception as e:
--> 596             raise Exception(f"It's not possible to apply those transforms to your dataset:\n {e}")
    597 
    598 class LabelList(Dataset):

Exception: It's not possible to apply those transforms to your dataset:
 Expected object of scalar type Float but got scalar type Double for argument #3 'mat2' in call to _th_addmm_out

Since my error is at the ImageDataBunch call, I don’t think the previous answers have solved for this. It’s weird, this same code was working fine a week ago.

1 Like

Did you ever get a fix for this @f_izco? I’m facing the same thing now.

You need to upgrade your fastai to the latest version. This comes from a breaking change in PyTorch 1.5 and it was fixed recently.

1 Like