PyTorch1.9迁移报Tensor.__format__不支持格式字符串错误怎么解决
问题根因
你遇到的TypeError: unsupported format string passed to Tensor.__format__报错,核心原因是PyTorch 1.9及以上版本取消了0维张量在字符串格式化时自动转换为Python原生数值的隐式兼容逻辑。你代码中传入format方法的losses.val、losses.avg、accs.val、accs.avg、emb_norms.val、emb_norms.avg均为PyTorch张量类型,直接对张量使用.4f、.2f这类数值格式符就会触发类型错误。
同时你日志中还有两个附加提示,也可以同步修复避免后续版本兼容问题:
transforms.Scale接口已废弃,torchvision官方已用transforms.Resize替代该接口- 命名张量的提示为PyTorch 1.9内部实验性API触发,不影响正常运行
修复方案
- 首先解决核心报错:给所有传入format的张量添加
.item()调用,将0维张量转为Python原生数值类型,修改后的代码段如下:
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()))
- 同步修复废弃接口提示:找到你数据预处理逻辑中的
transforms.Scale调用,直接替换为transforms.Resize即可,两个接口参数、功能完全一致。
效果验证
修改完成后重新运行原启动命令,即可正常输出训练日志,不会再触发类型错误,同时废弃接口的提示也会消失。
内容的提问来源于stack exchange,提问作者Mona Jalal
相关产品推荐
相关产品推荐

