Resumen de problemas al convertir el modelo pytorch al modelo onnx

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().
Insertar descripción de la imagen aquí

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]
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

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

Supongo que te gusta

Origin blog.csdn.net/sanxiaw/article/details/132839440
Recomendado
Clasificación