Python?torch.onnx.export用法詳細介紹
函數(shù)原型
參數(shù)介紹
mode (torch.nn.Module, torch.jit.ScriptModule or torch.jit.ScriptFunction)
需要轉(zhuǎn)換的模型,支持的模型類型有:torch.nn.Module, torch.jit.ScriptModule or torch.jit.ScriptFunction
args (tuple or torch.Tensor)
args可以被設(shè)置成三種形式
1.一個tuple
args = (x, y, z)
這個tuple應(yīng)該與模型的輸入相對應(yīng),任何非Tensor的輸入都會被硬編碼入onnx模型,所有Tensor類型的參數(shù)會被當(dāng)做onnx模型的輸入。
2.一個Tensor
args = torch.Tensor([1, 2, 3])
一般這種情況下模型只有一個輸入
3.一個帶有字典的tuple
args = (x, {'y': input_y, 'z': input_z})
這種情況下,所有字典之前的參數(shù)會被當(dāng)做“非關(guān)鍵字”參數(shù)傳入網(wǎng)絡(luò),字典種的鍵值對會被當(dāng)做關(guān)鍵字參數(shù)傳入網(wǎng)絡(luò)。如果網(wǎng)絡(luò)中的關(guān)鍵字參數(shù)未出現(xiàn)在此字典中,將會使用默認值,如果沒有設(shè)定默認值,則會被指定為None。
NOTE:
一個特殊情況,當(dāng)網(wǎng)絡(luò)本身最后一個參數(shù)為字典時,直接在tuple最后寫一個字典則會被誤認為關(guān)鍵字傳參。所以,可以通過在tuple最后添加一個空字典來解決。
#錯誤寫法: torch.onnx.export( model, (x, # WRONG: will be interpreted as named arguments {y: z}), "test.onnx.pb") # 糾正 torch.onnx.export( model, (x, {y: z}, {}), "test.onnx.pb")
f
一個文件類對象或一個路徑字符串,二進制的protocol buffer將被寫入此文件
export_params (bool, default True)
如果為True則導(dǎo)出模型的參數(shù)。如果想導(dǎo)出一個未訓(xùn)練的模型,則設(shè)為False
verbose (bool, default False)
如果為True,則打印一些轉(zhuǎn)換日志,并且onnx模型中會包含doc_string信息。
training (enum, default TrainingMode.EVAL)
枚舉類型包括:
TrainingMode.EVAL - 以推理模式導(dǎo)出模型。
TrainingMode.PRESERVE - 如果model.training為False,則以推理模式導(dǎo)出;否則以訓(xùn)練模式導(dǎo)出。
TrainingMode.TRAINING - 以訓(xùn)練模式導(dǎo)出,此模式將禁止一些影響訓(xùn)練的優(yōu)化操作。
input_names (list of str, default empty list)
按順序分配給onnx圖的輸入節(jié)點的名稱列表。
output_names (list of str, default empty list)
按順序分配給onnx圖的輸出節(jié)點的名稱列表。
operator_export_type (enum, default None)
默認為OperatorExportTypes.ONNX, 如果Pytorch built with DPYTORCH_ONNX_CAFFE2_BUNDLE,則默認為OperatorExportTypes.ONNX_ATEN_FALLBACK。
枚舉類型包括:
OperatorExportTypes.ONNX - 將所有操作導(dǎo)出為ONNX操作。
OperatorExportTypes.ONNX_FALLTHROUGH - 試圖將所有操作導(dǎo)出為ONNX操作,但碰到無法轉(zhuǎn)換的操作(如onnx未實現(xiàn)的操作),則將操作導(dǎo)出為“自定義操作”,為了使導(dǎo)出的模型可用,運行時必須支持這些自定義操作。支持自定義操作方法見鏈接。
OperatorExportTypes.ONNX_ATEN - 所有ATen操作導(dǎo)出為ATen操作,ATen是Pytorch的內(nèi)建tensor庫,所以這將使得模型直接使用Pytorch實現(xiàn)。(此方法轉(zhuǎn)換的模型只能被Caffe2直接使用)
OperatorExportTypes.ONNX_ATEN_FALLBACK - 試圖將所有的ATen操作也轉(zhuǎn)換為ONNX操作,如果無法轉(zhuǎn)換則轉(zhuǎn)換為ATen操作(此方法轉(zhuǎn)換的模型只能被Caffe2直接使用)。例如:
# 轉(zhuǎn)換前: graph(%0 : Float): %3 : int = prim::Constant[value=0]() # conversion unsupported %4 : Float = aten::triu(%0, %3) # conversion supported %5 : Float = aten::mul(%4, %0) return (%5) # 轉(zhuǎn)換后: graph(%0 : Float): %1 : Long() = onnx::Constant[value={0}]() # not converted %2 : Float = aten::ATen[operator="triu"](%0, %1) # converted %3 : Float = onnx::Mul(%2, %0) return (%3)
opset_version (int, default 9)
默認是9。值必須等于_onnx_main_opset或在_onnx_stable_opsets之內(nèi)。具體可在torch/onnx/symbolic_helper.py中找到。例如:
_default_onnx_opset_version = 9 _onnx_main_opset = 13 _onnx_stable_opsets = [7, 8, 9, 10, 11, 12] _export_onnx_opset_version = _default_onnx_opset_version
do_constant_folding (bool, default False)
是否使用“常量折疊”優(yōu)化。常量折疊將使用一些算好的常量來優(yōu)化一些輸入全為常量的節(jié)點。
example_outputs (T or a tuple of T, where T is Tensor or convertible to Tensor, default None)
當(dāng)需輸入模型為ScriptModule 或 ScriptFunction時必須提供。此參數(shù)用于確定輸出的類型和形狀,而不跟蹤(tracing )模型的執(zhí)行。
dynamic_axes (dict<string, dict<python:int, string>> or dict<string, list(int)>, default empty dict)
通過以下規(guī)則設(shè)置動態(tài)的維度:
KEY(str) - 必須是input_names或output_names指定的名稱,用來指定哪個變量需要使用到動態(tài)尺寸。
VALUE(dict or list) - 如果是一個dict,dict中的key是變量的某個維度,dict中的value是我們給這個維度取的名稱。如果是一個list,則list中的元素都表示此變量的某個維度。
具體可參考如下示例:
class SumModule(torch.nn.Module): def forward(self, x): return torch.sum(x, dim=1) # 以動態(tài)尺寸模式導(dǎo)出模型 torch.onnx.export(SumModule(), (torch.ones(2, 2),), "onnx.pb", input_names=["x"], output_names=["sum"], dynamic_axes={ # dict value: manually named axes "x": {0: "my_custom_axis_name"}, # list value: automatic names "sum": [0], }) ### 導(dǎo)出后的節(jié)點信息 ##input input { name: "x" ... shape { dim { dim_param: "my_custom_axis_name" # axis 0 } dim { dim_value: 2 # axis 1 ... ##output output { name: "sum" ... shape { dim { dim_param: "sum_dynamic_axes_1" # axis 0 ...
keep_initializers_as_inputs (bool, default None)
NONE
custom_opsets (dict<str, int>, default empty dict)
NONE
Torch.onnx.export執(zhí)行流程:
1、如果輸入到torch.onnx.export的模型是nn.Module類型,則默認會將模型使用torch.jit.trace轉(zhuǎn)換為ScriptModule
2、使用args參數(shù)和torch.jit.trace將模型轉(zhuǎn)換為ScriptModule,torch.jit.trace不能處理模型中的循環(huán)和if語句
3、如果模型中存在循環(huán)或者if語句,在執(zhí)行torch.onnx.export之前先使用torch.jit.script將nn.Module轉(zhuǎn)換為ScriptModule
4、模型轉(zhuǎn)換成onnx之后,預(yù)測結(jié)果與之前會有稍微的差別,這些差別往往不會改變模型的預(yù)測結(jié)果,比如預(yù)測的概率在小數(shù)點之后五六位有差別。
總結(jié)
到此這篇關(guān)于Python torch.onnx.export用法詳細介紹的文章就介紹到這了,更多相關(guān)Python torch.onnx.export用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python使用tkinter實現(xiàn)屏幕中間倒計時
這篇文章主要為大家詳細介紹了python使用tkinter實現(xiàn)屏幕中間倒計時,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-03-03Python數(shù)據(jù)結(jié)構(gòu)之遞歸方法詳解
這篇文章主要為大家介紹了遞歸的基本概念以及如何構(gòu)建遞歸程序。通過本章的學(xué)習(xí),大家可以理解遞歸的基本概念,了解遞歸背后蘊含的編程思想以及掌握構(gòu)建遞歸程序的方法,需要的可以參考一下2022-04-04