1. Errores comunes
1.1 La variable cambia de tipo tensor a tipo int
Nota importante: TracerWarning: La conversión de un tensor a un entero de Python puede provocar que el seguimiento sea incorrecto. No podemos registrar el flujo de datos de los valores de Python.。
错误代码:
```python
x0 = torch.randn(1, 3, 640, 480)
h, w = x0.size()[-2:] #{tensor:()} tenrsor(640)
paddingBottom = int(np.ceil(h/64)*64-h) #{int} 0
paddingRight = int(np.ceil(w/64)*64-w) # {int} 32
x0 = nn.ReplicationPad2d((0, paddingRight, 0, paddingBottom))(x0) ##{tensor:(tenrsor(1),tenrsor(3),tenrsor(640),tenrsor(512))}
正确代码
x0 = torch.randn(1, 3, 640, 480)
h, w = x0.size()[-2:]
paddingBottom = np.ceil(h/64)*64-h # 修改第一处:去掉int,保持tensor类型
paddingRight = np.ceil(w/64)*64-w # 修改第二处:去掉int,保持tensor类型
x0 = nn.ReplicationPad2d((0, paddingRight.numel(), 0, paddingBottom.numel()))(x0) # 修改第三处:增加.numel()
Solución de referencia: torch.jit.trace Elimine TracerWarning [1] como en el área de comentarios, mantenga la variable como tipo tensor y obtenga el valor int a través de .numel().
Actualización 1.2: Floordiv está en desuso y su comportamiento cambiará en una versión futura de pytorch. Actualmente se redondea hacia 0 (como la función 'trunc' NO 'piso').
Del módulo: einops/einops.py
inferred_length: int = length // known_product #报错代码
# 修改为:
inferred_length: int = torch.div(length, known_product, rounding_mode='floor') # 修改:引入 torch.div实现
Soluciones de referencia: Documento [2] y Documento [3]
1.3 einops.Rearrange reemplazado por el módulo torch.transpose
采用einops.Rearrange报错:
TracerWarning: La conversión de un tensor a un booleano de Python puede provocar que el seguimiento sea incorrecto. No podemos registrar el flujo de datos de los valores de Python, por lo que este valor se tratará como una constante en el futuro. ¡Esto significa que es posible que el seguimiento no se generalice a otras entradas!
conocido: Establecer[cadena] = {eje para eje en eje_compuesto si nombre_eje2longitud_conocida[eje]!= _longitud_eje_desconocido}
from einops.layers.torch import Rearrange
trans_x = Rearrange('b h w c -> b c h w')(trans_x) #原始代码
----------------------修改为--------------------
trans_x = trans_x.transpose(3, 2).transpose(2, 1) #修改代码,运行速度上有轻微的可忽略不计的提升
from einops import rearrange
attn_mask0 = rearrange(attn_mask, 'w1 w2 p1 p2 p3 p4 -> 1 1 (w1 w2) (p1 p2) (p3 p4)') #原始代码
----------------------修改为--------------------
w1, w2, p1, p2, p3, p4 = attn_mask.size() #修改代码
attn_mask = attn_mask.reshape(1, 1, w1 * w2, p1 * p2, p3 * p4) #修改代码
referencias
[1] torch.jit.trace elimina TracerWarning, https://blog.csdn.net/WANGWUSHAN/article/details/118052523
[2] Problemas que ocurren al usar python (buscando soluciones) https://zhuanlan.zhihu.com /p/562922076
[3] Advertencia de usuario: Floordiv está en desuso y su comportamiento cambiará en una versión futura de pytorch. https://blog.csdn.net/weixin_43564920/article/details/127004030