• 文档 >
  • 模块代码 >
  • torch >
  • torch._tensor_str
快捷键

torch._tensor_str 的源代码

# mypy: 允许未类型化定义
导入 contextlib
导入 dataclasses
导入 数学
导入 文本换行
来自 打字 导入 任何, 可选

导入 火炬
来自 火炬 导入 无穷


@dataclasses.数据类
 __打印机选项:
    precision: 整型 = 4
    阈值: 浮点数 = 1000
    边缘项目: 整型 = 3
    线宽: 整型 = 80
    科学模式: 可选[bool] = 


打印选项 = 打印机选项()


我们可以使用 **kwargs,但这将提供更好的文档
[文档]def 设置打印选项( precision=, 阈值=, 边缘元素=, 线宽=, 个人资料=, sci 模式=, ): r设置打印选项。毫不客气地借鉴了 NumPy 参数: 精度:浮点数输出的有效数字位数 (默认 = 4)。 阈值:触发汇总的数组元素总数 而不是完整的 `repr`(默认 = 1000)。 edgeitems:在汇总的开始和结束处每个维度的数组元素数量(默认 = 3)。 每个维度的数组元素数量(默认 = 3)。 行宽:每行字符数,用于 插入换行符(默认=80)。阈值矩阵将 忽略此参数。 配置文件:为美观打印设置合理的默认值。可以使用以下任何一项进行覆盖。 上述选项。(`default`、`short`、`full`中的任意一个) 科学模式:启用(True)或禁用(False)科学记数法。如果 未指定(默认),值由定义 `torch._tensor_str._Formatter`。此值自动选择 通过框架。 示例:: >>> # 限制元素的精度 >>> torch.set_printoptions(precision=2) >>> torch.tensor([1.12345]) tensor([1.12]) >>> 限制显示元素的数量 >>> 设置 torch 的打印选项,阈值设为 5 >>> torch.arange(10) tensor([0, 1, 2, ..., 7, 8, 9]) >>> # 恢复默认设置 >>> torch.set_printoptions(profile='default') >>> torch.tensor([1.12345]) tensor([1.1235]) >>> torch.arange(10) tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) """ 如果 profile : 如果 个人资料 == 默认: 打印选项.精度 = 4 打印选项.阈值 = 1000 打印选项.边缘项目 = 3 打印选项.线宽 = 80 如果...否则 个人资料 == 简短: 打印选项.精度 = 2 打印选项.阈值 = 1000 打印选项.边缘项目 = 2 打印选项.线宽 = 80 如果...否则 配置文件 == 全部: 打印选项.精度 = 4 打印选项.阈值 = 打印选项.边缘项目 = 3 打印选项.线宽 = 80 如果 精度 : 打印选项.精确度 = 精确度 如果 阈值 : 打印选项.阈值 = 阈值 如果 边缘项目 : 打印选项.边缘项目 = 边缘项目 如果 线宽 : 打印选项.线宽 = 线宽 打印选项.科学模式 = 科学模式
def get_printoptions() -> 字典[str, 任何] r获取当前打印选项,作为一个字典,可以传递给 set_printoptions() 函数作为 **kwargs 参数。 可以传递给 set_printoptions() 函数作为 **kwargs 参数。 """ 返回 dataclasses.asdict(打印选项) @contextlib.contextmanager def 打印选项(**kwargs): r"""上下文管理器,临时更改打印选项。接受的参数与 :func:`set_printoptions` 相同。""" 参数与 :func:`set_printoptions` 相同。 old_kwargs = get_printoptions() 设置打印选项(**kwargs) 尝试: 产生 最后: 设置打印选项(**old_kwargs) def 张量类型转换(t): dtype = ( PyTorch.浮点数 如果 ( t.是_mps 或者 (t.是_xpu PyTorch.xpu.获取设备属性(t.设备).支持_fp64) ) 否则 PyTorch.double ) 返回 t.(数据类型=数据类型) _格式化器: def __init__(self, 张量): self.浮点类型 = 张量.数据类型.是否为浮点数 self.整数模式 = 真实 self.科学计数法模式 = self.最大宽度 = 1 替换为 PyTorch.不梯度(): 张量视图 = 张量.重塑(-1) 如果 self.浮点数据类型: for 张量视图: value_str = f"{value}" self.最大宽度 = 最大值(self.最大宽度, 长度(value_str)) 否则: 非零有限值 = PyTorch.遮蔽选择( 张量视图, PyTorch.是有限的(张量视图) & 张量视图.(0) ) 如果 非零有限值.元素数量() == 0: # 无效数字,不执行任何操作 返回 如果 张量.dtype == PyTorch.float8_e8m0fnu: # 类型:忽略[已定义] # float8_e8m0fnu 是特殊的,不定义算术运算, # 并且在此文件中打印代码进一步假设存在 计算各种算术运算以确定要打印的内容。我们进行破解 并将其转换为浮点数,以便正确打印。 TODO(#113663):在添加对这些数据类型的支持后,也在这里添加它们。 支持被移除 非零有限值 = 非零有限值.float() 将其转换为双精度浮点数以便于计算。HalfTensor 在 1e8 时溢出,CPU 上没有 div()函数。 非零有限绝对值 = 张量类型(非零有限值.绝对值()) 非零有限最小值 = 张量类型转换(非零有限绝对值.最小值()) 非零有限最大值 = 张量类型转换(非零有限绝对值.最大值()) for 非零有限值: 如果 != PyTorch.向上取整(value): self.整数模式 = 断开 如果 self.整数模式: 对于浮点数,在 int_mode 模式下,所有数字都被视为整数,对于非终结数,我们附加一个小数点 为了表示张量是浮点类型。长度加 1 以考虑这一点。 如果 ( 非零有限最大值 / 非零有限最小值 > 1000.0 或者 非零有限最大值 > 100000000 ): self.科学模式 = 真实 for 非零有限值: 字符串值 = f"{{:.{打印选项.precision}e}}".格式(value) self.最大宽度 = 最大值(self.最大宽度, 长度(字符串值)) 否则: for 非零有限值: 字符串值 = f"{value:.0f}" self.最大宽度 = 最大值(self.最大宽度, 长度(字符串值) + 1) 否则: 检查是否应使用科学表示法。 如果 ( 非零有限最大值 / 非零有限最小值 > 1000.0 或者 非零有限最大值 > 100000000 或者 非零有限最小值 < 0.0001 ): self.科学模式 = 真实 for 非零有限值: 字符串值 = f"{{:.{打印选项.precision}e}}".格式(value) self.最大宽度 = 最大值(self.最大宽度, 长度(字符串值)) 否则: for 非零有限值: 字符串值 = f"{{:.{打印选项.precision}f}}".格式(value) self.最大宽度 = 最大值(self.最大宽度, 长度(字符串值)) 如果 打印选项.科学模式 : self.科学模式 = 打印选项.科学模式 def 宽度(self): 返回 self.最大宽度 def 格式(self, value): 如果 self.浮点数据类型: 如果 self.科学模式: 返回 = f"{{:{self.最大宽度}.{打印选项.precision}e}}".格式(value) 如果...否则 self.整型模式: 返回 = f"{value:.0f}" 如果 (数学.判断是否为无穷大(value) 或者 数学.isnan(value)): 返回 += "." 否则: 返回 = f"{{:.{打印选项.precision}f}}".格式(value) 否则: 返回 = f"{value}" 返回 (self.最大宽度 - 长度(返回)) * 输入文本为空,请提供需要翻译的文本 + 返回 def _标量字符串(self, 格式化器 1, 格式化器 2=): 如果 formatter2 : real_str = _scalar_str(self.真实, formatter1) imag_str = (_标量_str(self.图像, formatter2) + "j").去除字符串左侧空白字符() 处理负数、+0.0、-0.0 如果 imag_str[0] == "+" 或者 imag_str[0] == 破折号: 返回 真实字符串 + 虚拟字符串 否则: 返回 真实字符串 + "+" + imag_str 否则: 返回 formatter1.格式(self.项目()) def _vector_str(self, indent, 摘要, 格式化器 1, 格式化器 2=): # 长度包括空格和元素之间的逗号 元素长度 = 格式化器 1.宽度() + 2 如果 格式化器 2 : # imag_formatter 的宽度 + 一个额外的 j 用于复杂情况 元素长度 += 格式化器 2.宽度() + 1 每行元素数 = 最大值( 1, int(数学.向下取整((打印选项.线宽 - 缩进) / (元素长度))) ) def _值格式化器(val, 格式化器 1=格式化器 1, 格式化器 2=格式化器 2): 如果 formatter2 : real_str = formatter1.格式(val.真实) imag_str = (formatter2.格式(val.图像) + "j").去除字符串左侧空白字符() # 处理负数,+0.0,-0.0 如果 imag_str[0] == “+” 或者 图像字符串[0] == 破折号: 返回 实际字符串 + 图像字符串 否则: 返回 real_str + 加号 + imag_str 否则: 返回 formatter1.格式(val) 如果 概括 打印选项.边缘项目: # 处理边缘情况,负零等于零 数据 = [...] 如果...否则 摘要 self.尺寸(0) > 2 * 打印选项.边缘元素: 数据 = ( [_值格式化器(val) for val self[ 打印选项.边缘元素].转列表()] + ["……"] + [_值格式化器(val) for val self[-打印选项.边缘项目 ].转列表()] ) 否则: 数据 = [_值格式化器(val) for val self.转列表()] 数据行 = [ 数据[i : i + 元素每行] for i 范围(0, 长度(数据), 元素每行) ] = [“,”.连接() for 数据行] 返回 [ + (逗号 + "输入文本翻译为简体中文为:\n" + 输入文本为空,请提供需要翻译的文本 * (缩进 + 1)).连接() + "]" # formatter2 仅用于打印复杂的张量。 # 对于复杂的张量,formatter1 和 formatter2 是 tensor.real 的格式化器。 # and tensor.imag 分别对应 def _tensor_str_with_formatter(self, 缩进, 总结, formatter1, formatter2=): 维度 = self.维度() 如果 维度 == 0: 返回 _标量字符串(self, formatter1, 格式化器 2) 如果 维度 == 1: 返回 向量字符串(self, 缩进, 摘要, 格式化器 1, 格式化器 2) 如果 总结 self.尺寸(0) > 2 * 打印选项.边缘元素: 切片 = ( [ 使用格式化器的_tensor_str( self[i] 缩进 + 1, 概括, 格式化器 1, 格式化器 2 ) for i 范围(0, 打印选项.边缘项目) ] + ["..."] + [ _tensor_str_with_formatter( self[i] 缩进 + 1, 总结, 格式化器 1, formatter2 ) for i 范围(长度(self) - 打印选项.edgeitems, 长度(self)) ] ) 否则: slices = [ _tensor_str_with_formatter( self[i] 缩进 + 1, 概括, 格式化器 1, 格式化器 2 ) for i 范围(0, self.尺寸(0)) ] tensor_str = (逗号 + "输入文本翻译为简体中文为:\n" * (维度 - 1) + 输入文本为空,请提供需要翻译的文本 * (indent + 1)).连接(切片) 返回 [ + 张量_str + `]` def _tensor_str(self, 缩进): 如果 self.元素数量() == 0: 返回 `[]` 如果 self.有名称(): 张量打印主要经过两条代码路径(可能还有更多) - 张量数据可以舒适地显示在屏幕上 - 张量数据需要被总结 - 一些代码路径并不完全支持命名张量,所以我们发送 # 一个未命名的张量作为格式化代码的解决方案。 self = self.重命名() 摘要 = self.元素数量() > 打印选项.阈值 如果 self._is_zerotensor(): self = self.克隆() # 处理负数位 如果 self.是否定(): self = self.解决否定() # TODO: 当实现 FP8 的掩码选择时移除我 如果 self.dtype [ PyTorch.float8_e5m2, PyTorch.float8_e5m2fnuz, PyTorch.float8_e4m3fn, PyTorch.float8_e4m3fnuz, ] self = self.() 如果 self.数据类型.是复杂的: # 处理共轭位 self = self.解决连词() 实数格式化器 = _格式化器( 获取总结数据(self.真实) 如果 摘要 否则 self.真实 ) 图片格式化器 = _格式化器( 获取摘要数据(self.图像) 如果 摘要 否则 self.图像 ) 返回 使用格式化器的张量字符串( self, 缩进, 摘要, 实际格式化器, 图像格式化器 ) 否则: 格式化器 = _格式化器(获取摘要数据(self) 如果 摘要 否则 self) 返回 使用格式化器的张量字符串(self, 缩进, 总结, 格式化器) def _添加后缀(张量字符串, 后缀, 缩进, 强制换行): 矩阵字符串 = [矩阵字符串] last_line_len = 长度(tensor_str) - tensor_str.向后查找("输入文本翻译为简体中文为:\n") + 1 for 后缀 suffixes: 后缀长度 = 长度(后缀) 如果 强制换行 或者 最后一行长度 + 后缀长度 + 2 > 打印选项.线宽: 张量字符串.添加(输入文本翻译为简体中文为:\n" + 输入文本为空,请提供需要翻译的文本 * 缩进 + 后缀) 最后一行长度 = 缩进 + 后缀长度 强制换行 = 否则: 张量字符串.添加("," + 后缀) 最后一行长度 += 后缀长度 + 2 张量字符串.添加(“)”) 返回 输入文本翻译为简体中文为:"".连接(张量字符串) def 获取摘要数据(self): 维度 = self.维度() 如果 维度 == 0: 返回 self 如果 维度 == 1: 如果 self.尺寸(0) > 2 * 打印选项.边缘项目: 返回 PyTorch.( (self[ 打印选项.边缘项目] self[-打印选项.边缘项目 ]) ) 否则: 返回 self 如果 打印选项.边缘项目: 返回 self.新空[0] * self.维度()) 如果...否则 self.尺寸(0) > 2 * 打印选项.边缘项目: 开始 = [self[i] for i 范围(0, 打印选项.边缘项目)] 末端 = [self[i] for i 范围(长度(self) - 打印选项.边缘项目, 长度(self))] 返回 PyTorch.[获取总结数据(x) for x (开始 + 结束)]]) 否则: 返回 PyTorch.[获取摘要数据(x) for x self]) def 内部字符串(输入, *, 张量内容=): 如果 PyTorch._C._functorch.是 functorch 包装的 tensor(输入文本翻译为简体中文:inp): 返回 _functorch_wrapper_str_intern(inp, 张量内容=张量内容) is_plain_tensor = 类型(inp) PyTorch.张量 或者 类型(输入) PyTorch.神经网络.参数 如果 输入.是嵌套的: 前缀 = "嵌套张量(" 如果...否则 是否为普通张量: 前缀 = tensor( 否则: 前缀 = f"{类型(输入).__name__}( 缩进 = 长度(前缀) 后缀 = 输入文本为空,请提供需要翻译的文本 自定义提供的内容 = 张量内容 如果 自定义提供的内容: 张量_str = 张量内容 # 用于提取原始值,从而禁用前向自动微分 # 在此函数内部。 # TODO(albanD) 需要更新当支持多级时 self, 切线 = PyTorch.自动微分.forward_ad.解包双倍(输入) # 注意 [打印张量设备]: 这里的一般逻辑是,只有当设备不匹配时才打印设备 指定的默认张量类型中的设备。 当前 torch.set_default_tensor_type()仅支持 CPU/CUDA。 只返回 cpu 或 cuda。 在其他情况下,我们还没有办法将它们设置为默认值。 并且我们应该始终为它们打印出设备。 如果 ( self.设备.类型 != PyTorch._C._get_default_device() 或者 ( self.设备.类型 == "cuda" PyTorch.cuda.当前设备() != self.设备.索引 ) 或者 (self.设备.类型 == 国会议员) ): 后缀.添加("设备='" + str(self.设备) + "'") 张量打印执行张量操作,如切片、索引等,以便将其 这些操作在 ipu/xla/lazy/mtia 张量结果上会导致编译。因此, 为了避免编译,在打印之前将张量复制到 CPU。 如果 self.设备.类型 ["xla", 懒惰, 知识产权, 翻译] self = self.("cpu") TODO:添加一个将真实数据类型映射到复杂数据类型的 API。 _默认复杂数据类型 = ( PyTorch.cdouble 如果 PyTorch.获取默认数据类型() == PyTorch.double 否则 PyTorch.cfloat ) 默认数据类型 = self.dtype ( PyTorch.获取默认数据类型(), 默认复杂数据类型, PyTorch.int64, PyTorch.bool, ) 如果 self.is_sparse: 后缀.添加(size= + str(元组(self.形状))) 来自 torch._subclasses.fake_tensor 导入 模拟 Tensor 是否是元数据 = self.是否是元数据 或者 isinstance(self, 假 Tensor) 如果 is_meta: 后缀.添加("nnz=" + str(self._nnz())) 如果 默认数据类型: 后缀.添加("数据类型=" + str(self.数据类型)) 如果 提供自定义内容: 索引前缀 = "indices=tensor(" 索引 = self.索引().detach() 如果 is_meta: 索引字符串 = "..." 否则: 索引字符串 = _tensor_str(索引, 缩进 + 长度(索引前缀)) 如果 是否是元数据 或者 索引.元素数量() == 0: 索引字符串 += ", 大小=" + str(元组(索引.形状)) 值前缀 = "values=tensor(" values = self.().detach() 如果 is_meta: values_str = "..." 否则: values_str = _tensor_str(, 缩进 + 长度(values_prefix)) 如果 是元数据 或者 .元素数量() == 0: values_str += ", 大小=" + str(元组(.形状)) 张量_str = ( 索引前缀 + 索引字符串 + ")输入文本翻译为简体中文为:\n" + 输入文本为空,请提供需要翻译的文本 * 缩进 + 值前缀 + 值字符串 + )" ) 如果...否则 self.布局 { PyTorch.稀疏压缩存储格式, PyTorch.稀疏压缩存储格式, PyTorch.稀疏_bsr, PyTorch.稀疏矩阵, }: 来自 torch._subclasses.fake_tensor 导入 模拟 Tensor 后缀.添加("大小=" + str(元组(self.形状))) 是否是元数据 = self.是否是元数据 或者 isinstance(self, 假 Tensor) 如果 是否是元数据: 后缀.添加("nnz=" + str(self._nnz())) 如果 has_default_dtype: suffixes.添加("dtype=" + str(self.数据类型)) 如果 自定义内容提供: 压缩索引方法, 纯索引方法 = { PyTorch.稀疏压缩存储格式: (PyTorch.张量.鸡索引, PyTorch.张量.列索引), PyTorch.稀疏压缩存储格式: (PyTorch.张量.c 列索引, PyTorch.张量.行索引), PyTorch.稀疏_bsr: (PyTorch.张量.鸡索引, PyTorch.张量.列索引), PyTorch.稀疏矩阵: (PyTorch.张量.c 列索引, PyTorch.张量.行索引), }self.布局] 如果 self.布局 {PyTorch.稀疏压缩存储格式, PyTorch.稀疏_bsr}: cdim 名称, pdim 名称 = , 否则: cdimname, pdimname = , 压缩索引前缀 = fc{cdimname[3]}_indices=tensor(" 压缩索引 = 压缩索引方法(self).detach() 如果 is_meta: compressed_indices_str = "..." 否则: compressed_indices_str = _tensor_str( 压缩索引, 缩进 + 长度(compressed_indices_prefix) ) 如果 压缩索引.元素数量() == 0 或者 is_meta: 压缩索引字符串 += ", 大小=" + str( 元组(压缩索引.形状) ) 索引前缀 = f"{pdimname[3]}_indices=tensor(" 平凡索引 = 索引方法(self).detach() 如果 是否是元数据: 索引字符串 = "..." 否则: 平常索引字符串 = _tensor_str( 平凡索引, 缩进 + 长度(平常索引前缀) ) 如果 平凡索引.元素数量() == 0 或者 是否是元数据: 平常索引字符串 += ", 大小=" + str(元组(平凡索引.形状)) values_prefix = "values=tensor(" values = self.().detach() 如果 是否是元数据: 值字符串 = "..." 否则: 值字符串 = _tensor_str(, 缩进 + 长度(值前缀)) 如果 .元素数量() == 0 或者 是否元数据: 值字符串 += ", 大小=" + str(元组(.形状)) 张量_str = ( 压缩索引前缀 + 压缩索引字符串 + "),输入文本翻译为简体中文为:\n" + 输入文本为空,请提供需要翻译的文本 * 缩进 + 纯索引前缀 + 平凡索引字符串 + "),输入文本翻译为简体中文为:\n" + 输入文本为空,请提供需要翻译的文本 * 缩进 + 值前缀 + 值字符串 + )" ) 如果...否则 self.是否量化: 后缀.添加(size= + str(元组(self.形状))) 如果 默认数据类型: 后缀.添加("dtype=" + str(self.数据类型)) 后缀.添加("量化方案=" + str(self.q 方案())) 如果 ( self.q 方案() == PyTorch.每张张量仿射 或者 self.q 方案() == PyTorch.每张张量对称 ): 后缀名.添加(scale= + str(self.q_scale())) 后缀.添加("零点=" + str(self.q_zero_point())) 如果...否则 ( self.q 方案() == PyTorch.单通道仿射 或者 self.q 方案() == PyTorch.单通道对称 或者 self.q 方案() == PyTorch.单通道仿射浮点 Q 参数 ): 后缀.添加("scale=" + str(self.每通道缩放的 q())) 后缀.添加("zero_point=" + str(self.q_per_channel_zero_points q_per_channel_零点())) 后缀.添加("轴=" + str(self.每通道轴的 q())) 如果 自定义提供的内容: 张量_str = _tensor_str(self.反量化(), 缩进) 如果...否则 self.是嵌套的: 如果 自定义提供的内容: def 缩进字符串(s, 缩进): 返回 "输入文本翻译为简体中文为:\n".连接(f" {}" for s.分割("输入文本翻译为简体中文为:\n")) 字符串 = 输入文本翻译为简体中文为:\n".连接( 缩进字符串(str(t), 缩进 + 1) for t PyTorch.操作.aten.解绑.int(self, 0) ) 张量_str = f"[输入文本翻译为简体中文为:\n{strs}输入文本翻译为简体中文为:\n]" 如果...否则 PyTorch._is_functional_tensor(self): 前缀 = "_to_functional_tensor(" 张量_str = 表示(PyTorch._from_functional_tensor(self)) 否则: # 循环导入问题,因此在此处导入 来自 torch._subclasses.fake_tensor 导入 模拟 Tensor 如果 self.is_meta 或者 isinstance(self, 假 Tensor): 后缀.添加(size= + str(元组(self.形状))) 如果 self.dtype != PyTorch.获取默认数据类型(): 后缀.添加(dtype= + str(self.数据类型)) # TODO:这表示省略号是分配的合法语法 # 这是一个元张量或 FakeTensor,它可能是,但现在并不正确 如果 自定义提供的内容: 张量_str = "..." 否则: 如果 self.元素数量() == 0 self.is_sparse: # 如果形状不是(0,),则显式打印形状,以匹配 NumPy 的行为 如果 self.维度() != 1: 后缀.添加("size=" + str(元组(self.形状))) # 在一个空张量中,没有元素可以推断其数据类型 # 因此必须显式地指定为 int64。 如果 self.dtype != PyTorch.获取默认数据类型(): 后缀.添加("dtype=" + str(self.数据类型)) 如果 自定义提供的内容: 张量_str = `[]` 否则: 如果 打印选项.边缘项目: 后缀.添加("大小=" + str(元组(self.形状))) 如果 具有默认数据类型: 后缀.添加("数据类型=" + str(self.数据类型)) 如果 自定义提供的内容: 如果 self.布局 != PyTorch.strided: 张量_str = _tensor_str(self.转换为稠密格式(), 缩进) 否则: 张量_str = _tensor_str(self, 缩进) 如果 self.布局 != PyTorch.strided: 后缀.添加("布局=" + str(self.布局)) # 使用 inp 来获取原始 grad_fn,而不是由 forward grad 生成的那个 # 解包。 grad_fn_name = 尝试: grad_fn = 输入.grad_fn 除了 运行时错误: # 访问 grad_fn 调用重置逻辑,这会导致错误 # 如果该张量是在无梯度模式下创建的视图,并在原地修改 无梯度模式。参见:https://github.com/pytorch/pytorch/issues/99968 grad_fn_name = "无效" 如果 grad_fn_name grad_fn : # type: ignore[possibly-undefined] grad_fn_name = 类型(grad_fn).__name__ 如果 grad_fn_name == Cpp 函数名: grad_fn_name = grad_fn.名称().右分割(双冒号, 1)]-1] 如果 grad_fn_name : 后缀.添加(f"grad_fn=<"{grad_fn_name}>") 如果...否则 输入.需要梯度: 后缀.添加(requires_grad=True) 如果 self.有名称(): 后缀.添加(fnames={self.names}") 如果 切线 : 后缀.添加(f"切线="{切线}") 字符串表示 = _添加后缀( 前缀 + 张量字符串, # type: ignore[possibly-undefined] 后缀, 缩进, 强制换行=self.is_sparse, ) # 检查此实例是否被标记为参数并相应地更改 repr。 # 很遗憾,这个函数必须知道这个细节。 # 注意:目前为了保持向后兼容性,对于普通张量参数要跳过此操作。 # 在未来,这也应该适用于那些参数以生成有效的 repr。 如果 isinstance(self, PyTorch.神经网络.参数) is_plain_tensor: string_repr = f参数({string_repr})" 返回 字符串表示 def _functorch_wrapper_str_intern(张量, *, 张量内容=): 级别 = PyTorch._C._functorch.可能获得等级(张量) 断言 等级 != -1 如果 PyTorch._C._functorch.是功能性张量(张量): 解包 FunctionalTensorWrapper 时,我们需要确保它是最新的 首先 PyTorch.同步_(张量) = PyTorch._C._functorch.获取解包后的(张量) 值表示 = 表示(value) 缩进值表示 = textwrap.缩进(值表示, 输入文本为空,请提供需要翻译的文本 * 4) 如果 PyTorch._C._functorch.is_batchedtensor(张量): bdim = PyTorch._C._functorch.maybe_get_bdim(张量) 断言 bdim != -1 返回 ( f"BatchedTensor(層級={層級},bdim={bdim},值=输入文本翻译为简体中文为:\n{缩进值表示}输入文本翻译为简体中文为:\n)" ) 如果 PyTorch._C._functorch.是否为 gradtrackingtensor(张量): 返回 fGradTrackingTensor(lvl={级别}, 值=输入文本翻译为简体中文为:\n{缩进值表示}输入文本翻译为简体中文为:\n)" 如果 PyTorch._C._functorch.是功能性张量(张量): 返回 f"功能性张量(lvl={级别},值=\n{值表示})" 抛出 值错误(我们不知道如何打印这个,请向我们提交一个问题) def 字符串(self, *, 张量内容=): 替换为 PyTorch.不梯度(), PyTorch.工具._python_dispatch.禁用当前模式(): 守卫 = PyTorch._C.禁用功能手电筒() # noqa: F841 返回 字符串内联(self, 张量内容=张量内容)

© 版权所有 PyTorch 贡献者。

使用 Sphinx 构建,并使用 Read the Docs 提供的主题。

文档

查看 PyTorch 的全面开发者文档

查看文档

教程

深入了解初学者和高级开发者的教程

查看教程

资源

查找开发资源,获取您的疑问解答

查看资源