python - TypeError:不支持的格式字符串传递给 Tensor.__format__
问题描述
当尝试将旧 PyTorch 编写的代码转换为 1.9 时,我收到此错误:
(fashcomp) [jalal@goku fashion-compatibility]$ python main.py --name test_baseline --learned --l2_embed --datadir ../../../data/fashion/
/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 329, in <module>
main()
File "main.py", line 167, in main
train(train_loader, tnet, criterion, optimizer, epoch)
File "main.py", line 240, in train
print('Train Epoch: {} [{}/{}]\t'
File "/scratch3/venv/fashcomp/lib/python3.8/site-packages/torch/_tensor.py", line 561, in __format__
return object.__format__(self, format_spec)
TypeError: unsupported format string passed to Tensor.__format__
这是代码的有问题的部分:
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))
我从这个错误报告中看到,截至两年前,还没有为这个问题提供解决方案。您对如何解决此问题或任何替代方法有任何建议吗?
代码来自这里。
解决方案
如果您尝试以torch.Tensor
特定方式格式化 a,则此错误是可重现的:
>>> print('{:.2f}'.format(torch.rand(1)))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-ece663be5b5c> in <module>()
----> 1 print('{:.2f}'.format(torch.tensor([1])))
/usr/local/lib/python3.7/dist-packages/torch/_tensor.py in __format__(self, format_spec)
559 if self.dim() == 0:
560 return self.item().__format__(format_spec)
--> 561 return object.__format__(self, format_spec)
562
563 def __ipow__(self, other): # type: ignore[misc]
TypeError: unsupported format string passed to Tensor.__format__
这样做'{}'.format(torch.tensor(1))
——即没有任何格式化规则——会起作用。
这是因为torch.Tensor
没有实现那些特定的格式操作。
一个简单的解决方法是使用以下方法将 转换torch.Tensor
为适当的对应类型item
:
>>> print('{:.2f}'.format(torch.rand(1).item()))
0.02
您应该将此修改应用于字符串表达式torch.Tensor
中涉及的所有内容: , , , , , 和?print
losses.val
losses.avg
accs.val
accs.avg
emb_norms.val
emb_norms.avg
推荐阅读
- python - 如何将多个参数传递给 scapy 中嗅探函数的“lfilter”?
- amazon-web-services - 更改 Fargate ECS 平台版本
- python - Python / Boto3 / 如何获得带有分页的标签列表?
- azure - 如何使用 az cli 编写 Azure 存储库搜索脚本
- admob - 在 Flutter Web 应用程序中集成 AdMob
- blockchain - 我怎么知道我的以太坊节点同步低速或不同步
- node.js - 如何运行包括 Node.js 服务器的多个 shell 命令?Ubuntu
- python - 使用 osmnx 从自建图导入网络
- jquery - 如何用逗号分隔数据值
- python - 在 Django 中为多对多字段冲突反向访问器和查询?