1. 程式人生 > 實用技巧 >pytorch upsample層到onnx,以及到tensorRT的轉換(二)

pytorch upsample層到onnx,以及到tensorRT的轉換(二)

之前的部落格介紹了upsample層轉換到tensorRT出錯的解決方法,就是回退onnx版本到1.5.0。雖然暫時解決了問題,但無法使用高版本的pytorch和onnx,https://www.cnblogs.com/hypnus-ly/p/12932110.html

最近又上github,發現更簡單的解決方法,就是修改下upsample層初始化時的引數就可以了。突然發現之前的部落格好low啊,還是需要多多學習,發現問題的根源,找到本質解決方法。

if self.training:
    x = F.interpolate(x, scale_factor=2, mode="nearest") # 使用 scale_factor 動態引數時,轉換tensorRT會報錯
else: # hack in order to generate a simpler onnx 
   x = F.interpolate(x, size=[int(2 * x.shape[2]), int(2 * x.shape[3])], mode='nearest') # 如要轉換tensorRT模型的話,需要使用 size 引數,靜態的指定圖片大小

upsample函式修改方式和上述程式碼一樣

在使用upsample函式時,經常會先定義upsample module

m = nn.Upsample(scale_factor=2, mode="nearest")

然後在前向推理時,才動態的輸入資料,此時沒法預先設定 size 大小,解決方法:

在進行前向推理時,先獲取輸入的大小,再改變函式引數:

n,c,h,w = input.size()
size = (h*2, w*2)
m.scale_factor=None
m.size = (h * 2, w * 2)
output = m(input)

主要:scale_factor 引數 和 size 引數不能同時存在,所以要將scale_factor 設定為 None