It worked for me too. Thanks, @stephenjohnson
Another solution would be writing a bit of code to grab the labels from the df and split the dataset in folders.
It worked for me too. Thanks, @stephenjohnson
Another solution would be writing a bit of code to grab the labels from the df and split the dataset in folders.
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.
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.
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)
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
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?
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'))
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 withloss
.”
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 theCallbakHandler
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 “Callcb_name
oncb
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
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.
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')
)
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.
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.