原帖想把 3×3 Tensor 用 {:.10f} 当成一个 Python 数值格式化:
TypeError: unsupported format string passed to torch.FloatTensor.__format__
打印位数不能补出原本没有的精度
原题 FloatTensor(3,3) 分配未初始化数据,又希望显示更多小数。先给张量明确数值,再选择整表打印或单值格式。未初始化内存里的极小值与极大值不能被当作某次计算结果来解释。
一个格式串不能直接把多元素张量当成单个浮点数。还需区分“显示更多位”与“提高已存数据的精度”。
下面用有定义数值的张量检查类型与尺寸:
import torch
a = torch.tensor([[0.1, 1.0 / 3], [2.5, -0.25]], dtype=torch.float32)
print("josh050608")
print("tensor:", a.shape, a.dtype, "elements:", a.numel())
torch.set_printoptions(precision=10, sci_mode=False)
print(a)
print(f"single value: {a[0, 0].item():.10f}")
整张量使用 torch.set_printoptions 调整展示;一个已确认单元素的张量用 .item() 取 Python 数值后再格式化。若需按行输出固定格式,可遍历 a.detach().cpu().tolist() 中的数值。
原帖 torch.FloatTensor(3,3) 创建的是未初始化存储,其中显示的极小值或极大值并不是有效计算结果。需要全零时用 torch.zeros(3,3);需要自己的数据时用明确的 tensor 构造。不要通过提高打印位数解读未初始化内存。
float32 本身精度有限,打印十位小数不会增加真实精度。如果计算确实需要 float64,应在数据与运算开始前选择它,并同步调整模型;把已损失精度的结果最后转 double 不能恢复信息。
验证所打印的是正确元素,且展示格式符合用途。单值 .item() 适合日志,不参与可微训练路径。
固定格式输出与 dtype 的完整对照
下面使用有定义的数值,按行输出固定十位小数,并比较从起点采用 float64 与事后升精度的区别:
import torch
matrix = torch.tensor([[0.1, 1.0/3], [2.5, -0.25]], dtype=torch.float32)
for row in matrix.detach().cpu().tolist():
print(" ".join(f"{value:.10f}" for value in row))
stored32 = torch.tensor(0.1, dtype=torch.float32)
promoted = stored32.double()
created64 = torch.tensor(0.1, dtype=torch.float64)
assert promoted.item() == stored32.item()
assert promoted.item() != created64.item()
print("promoted/created64:", f"{promoted.item():.17g}", f"{created64.item():.17g}")
这些断言比较的是指定构造下的存储数值,不是在宣称 float64 对所有任务都更合适。真正需要双精度计算时,从数据读入和模型参数开始统一 dtype;最后给结果 .double() 只换容器精度,不恢复之前舍入的信息。
整 Tensor 调整 printoptions,单元素用 item 后格式化;多元素日志可像例子按行转换。GPU 上逐元素 item 会频繁同步,较大日志可先一次搬到 CPU,再在主机格式化,避免调试输出拖慢训练。
验证显示格式后,若只是临时调试,恢复项目预期的打印选项。不要通过设置更多小数位判断数值计算已经更准确,也不要把未初始化 Tensor 的内容写成可重复示例输出。
参考:原始求助帖;技术依据:torch.set_printoptions(2.5)、Tensor.item(2.5)、torch.from_numpy(2.5)、torch.empty(2.5)。