onnx转paddle,Upsample动态shape
Created by: richlaji
模型转换Pytorch->onnx->paddle。
- Pytorch代码中对应部分代码:
def forward(self, x):
n,c,h,w = x.shape
up = nn.functional.interpolate(rb2, size=((h+1)//2, (w+1)//2), mode='bilinear', align_corners=False)
return up
-
转onnx时候,Upsample对应层是: %827 : Float(1, 576, 4, 35) = onnx::Upsamplemode="linear",其中%826是计算动态shape
-
使用develop分支的X2Paddle转,在model = ONNXDecoder(model_path)这步里有一个model = onnx.shape_inference.infer_shapes(model),onnx貌似不支持动态的shape推断,打印出来Upsample的四个dim都是空
-
由于3中所述,在onnx转paddle的时,Upsample转成paddle的out_shape=[0,0],转出来的model.py对应层是_827 = fluid.layers.resize_bilinear(_808, scale=None, out_shape=[0, 0], name='_827'),这里手动把2中的mode=“linear”改成了paddle支持的“bilinear”。
我看到paddle的文档中写了“根据指定的out_shape执行双线性插值调整输入大小,输出形状按优先级由actual_shape、out_shape和scale指定。”其中acutal_shape是动态图时用到的。 我现在想法是在ONNXOpMapper这里改,Upsample层对应的是_interpolate函数,但不清楚用actual_shape参数要怎么改,或者有更方便的改法嘛~ 其中_interpolate函数里层的现在是提供scale和out_shape的参数,如下:
attr = {
'scale': scale,
'out_shape': out_shape,
'name': string(node.layer_name)
}
node.fluid_code.add_layer(fluid_op,
inputs=val_x,
output=node,
param_attr=attr)