Converting an old pytorch code (3 years ago) to 1.9

could someone please confirm if this change (## refers to old code)

    # measure accuracy and record loss
    ##losses.update(loss_triplet.data[0], num_items)
    ##accs.update(acc.data[0], num_items)
    ##emb_norms.update(loss_embed.data[0])
    ##mask_norms.update(loss_mask.data[0])
    
    losses.update(loss_triplet.data, num_items)
    accs.update(acc.data, num_items)
    emb_norms.update(loss_embed.data)
    mask_norms.update(loss_mask.data)

based on this suggestion invalid index of a 0-dim tensor. Use tensor.item() to convert a 0-dim tensor to a Python number · Issue #113 · NVIDIA/flownet2-pytorch · GitHub makes any sense if the error i was getting is non-existent?
Error was:

invalid index of a 0-dim tensor. Use tensor.item() to convert a 0-dim tensor to a Python number

Remove the .data usage, as it could break your code and use .item() instead:

    losses.update(loss_triplet.item(), num_items)
    accs.update(acc.item(), num_items)
    emb_norms.update(loss_embed.item())
    mask_norms.update(loss_mask.item())
1 Like

Do you know why this fix for format didn’t work for all tensors?

        if batch_idx % args.log_interval == 0:
            print('Train Epoch: {} [{}/{}]\t'
                  'Loss: {:.4f} ({:.4f}) \t'
                  'Acc: {:.2f}% ({:.2f}%) \t'
                  'Emb_Norm: {:.2f} ({:.2f})'.format(
                epoch, batch_idx * num_items, len(train_loader.dataset),
                losses.val.item(), losses.avg.item(), 
                100. * accs.val.item(), 100. * accs.avg.item(), emb_norms.val.item(), emb_norms.avg.item()))

error is

File “main.py”, line 167, in main train(train_loader, tnet, criterion, optimizer, epoch) File “main.py”, line 251, in train losses.val.item(), losses.avg.item(), AttributeError: ‘float’ object has no attribute ‘item’

My best guess is that losses might be an object tracking some internal stats as floats and losses.val as well as losses.avg would already be float values (not tensors), so you could remove the .item() call.

1 Like

Sorry I was about to share the full log here:

(fashcomp) [jalal@goku fashion-compatibility]$ python main.py --name test_baseline --learned --l2_embed --datadir ../../../data/fashion/ --epochs 1
/scratch3/venv/fashcomp/lib/python3.8/site-packages/torchvision/transforms/transforms.py:310: UserWarning: The use of the transforms.Scale transform is deprecated, please use transforms.Resize instead.
  warnings.warn("The use of the transforms.Scale transform is deprecated, " +
  + Number of params: 3191808
<class 'torch.utils.data.dataloader.DataLoader'>
/scratch3/venv/fashcomp/lib/python3.8/site-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at  /pytorch/c10/core/TensorImpl.h:1156.)
  return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)
Traceback (most recent call last):
  File "main.py", line 335, in <module>
    main()    
  File "main.py", line 167, in main
    train(train_loader, tnet, criterion, optimizer, epoch)
  File "main.py", line 251, in train
    losses.val.item(), losses.avg.item(), 
AttributeError: 'float' object has no attribute 'item'

so I removed it from the losses methods but still have the error. Do you which items from this .format requires .item()?

            print('Train Epoch: {} [{}/{}]\t'
                  'Loss: {:.4f} ({:.4f}) \t'
                  'Acc: {:.2f}% ({:.2f}%) \t'
                  'Emb_Norm: {:.2f} ({:.2f})'.format(
                epoch, batch_idx * num_items, len(train_loader.dataset),
                losses.val, losses.avg, 
                100. * accs.val.item(), 100. * accs.avg.item(), emb_norms.val.item(), emb_norms.avg.item()))

now error is:

(fashcomp) [jalal@goku fashion-compatibility]$ python main.py --name test_baseline --learned --l2_embed --datadir ../../../data/fashion/ --epochs 1
/scratch3/venv/fashcomp/lib/python3.8/site-packages/torchvision/transforms/transforms.py:310: UserWarning: The use of the transforms.Scale transform is deprecated, please use transforms.Resize instead.
  warnings.warn("The use of the transforms.Scale transform is deprecated, " +
  + Number of params: 3191808
<class 'torch.utils.data.dataloader.DataLoader'>
/scratch3/venv/fashcomp/lib/python3.8/site-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at  /pytorch/c10/core/TensorImpl.h:1156.)
  return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)
Traceback (most recent call last):
  File "main.py", line 335, in <module>
    main()    
  File "main.py", line 167, in main
    train(train_loader, tnet, criterion, optimizer, epoch)
  File "main.py", line 252, in train
    100. * accs.val.item(), 100. * accs.avg.item(), emb_norms.val.item(), emb_norms.avg.item()))
AttributeError: 'float' object has no attribute 'item'

my personal guess is that acc should be float too.

Yes, this would also be my guess as note how the error changed from:

  File "main.py", line 251, in train
    losses.val.item(), losses.avg.item(), 
AttributeError: 'float' object has no attribute 'item'

to

  File "main.py", line 252, in train
    100. * accs.val.item(), 100. * accs.avg.item(), emb_norms.val.item(), emb_norms.avg.item()))
AttributeError: 'float' object has no attribute 'item'
1 Like

I am confused since I followed this answer here python - TypeError: unsupported format string passed to Tensor.__format__ - Stack Overflow

I removed all .item() (s) and bug is gone.

(fashcomp) [jalal@goku fashion-compatibility]$ python main.py --name test_baseline --learned --l2_embed --datadir ../../../data/fashion/ --epochs 1
/scratch3/venv/fashcomp/lib/python3.8/site-packages/torchvision/transforms/transforms.py:310: UserWarning: The use of the transforms.Scale transform is deprecated, please use transforms.Resize instead.
  warnings.warn("The use of the transforms.Scale transform is deprecated, " +
  + Number of params: 3191808
<class 'torch.utils.data.dataloader.DataLoader'>
/scratch3/venv/fashcomp/lib/python3.8/site-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at  /pytorch/c10/core/TensorImpl.h:1156.)
  return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)
Train Epoch: 1 [0/686851]	Loss: 0.2760 (0.2760) 	Acc: 61.72% (61.72%) 	Emb_Norm: 0.76 (0.76)
Train Epoch: 1 [64000/686851]	Loss: 0.2212 (0.2369) 	Acc: 70.31% (64.27%) 	Emb_Norm: 0.70 (0.69)

and code is:

        if batch_idx % args.log_interval == 0:
            print('Train Epoch: {} [{}/{}]\t'
                  'Loss: {:.4f} ({:.4f}) \t'
                  'Acc: {:.2f}% ({:.2f}%) \t'
                  'Emb_Norm: {:.2f} ({:.2f})'.format(
                epoch, batch_idx * num_items, len(train_loader.dataset),
                losses.val, losses.avg, 
                100. * accs.val, 100. * accs.avg, emb_norms.val, emb_norms.avg))

initially asked that question because of this error:

I am honestly confused but glad the error is gone.