RuntimeError: ONNX symbolic expected a constant value in the trace
在把pytorch训练的模型转换到onnx的时候出现了这个问题,网上查询以后发现需要把网络定义中的可变参数(结构的超参数)转换为固定数值。我理解是因为在export的时候程序不会再计算涉及到超参数的数值,只会按照固定的数值转换网络结构。
原始程序中
def forward(self, x):
#报错的原程序代码如下,其中x.size()[2:]这种表示即H和W的值是通过计算得出的,
#需要替换成确定的数值
H0, W0 = x.size()[2:]
feat8, feat16, feat32 = self.resnet(x)
H8, W8 = feat8.size()[2:]
H16, W16 = feat16.size()[2:]
H32, W32 = feat32.size()[2:]
avg = F.avg_pool2d(feat32, feat32.size()[2:])
avg = self.conv_avg(avg)
avg_up = F.interpolate(avg, (H32, W32), mode='nearest')
我的修改如下,可以类似参考
def forward(self, x):
#H0, W0 = x.size()[2:]
#print("H0 and W0 is:", x.size()[2:])
#不清楚网络结构不知道参数实际是多少可以先打印出来然后再参照修改
H0 = 1101
W0 = 1101
feat8, feat16, feat32 = self.resnet(x)
#H8, W8 = feat8.size()[2:]
#print("H8 and W8 is :", feat8.size()[2:])
H8 = 138
W8 = 138
#H16, W16 = feat16.size()[2:]
#print("H16 and W16 is :", feat16.size()[2:])
H16 = 69
W16 = 69
#H32, W32 = feat32.size()[2:]
#print("H32 and W32 is :", feat32.size()[2:])
H32 = 35
W32 = 35
同理其他的网络层,如
F.avg_pool2d(feat, feat.size()[2:]) #也需要使用实际值替换
全部替换完成问题解决。
欢迎交流指导: vx fjj19930707