ONNX 類型¶
可選類型¶
可選類型代表對元素(可以是張量、序列、映射或稀疏張量)或空值的參考。可選類型會出現在模型輸入、輸出以及中間值中。
使用案例¶
可選類型讓使用者能夠在 ONNX 中表示更多動態類型情境。類似於 Python 類型提示中的 Optional[X] 類型,相當於 Union[None, X],ONNX 中的可選類型可以參考單一元素或空值。
PyTorch 中的範例¶
可選類型只會出現在 jit script 編譯器產生的 TorchScript 圖形中。編寫模型腳本會擷取動態類型,其中可選值可以指定為 None 或值。
範例 1
class Model(torch.nn.Module): def forward(self, x, y:Optional[Tensor]=None): if y is not None: return x + y return x
對應的 TorchScript 圖形
Graph( %self : __torch__.Model, %x.1 : Tensor, %y.1 : Tensor? ): %11 : int = prim::Constant[value=1]() %4 : None = prim::Constant() %5 : bool = aten::__isnot__(%y.1, %4) %6 : Tensor = prim::If(%5) block0(): %y.4 : Tensor = prim::unchecked_cast(%y.1) %12 : Tensor = aten::add(%x.1, %y.4, %11) -> (%12) block1(): -> (%x.1) return (%6)
ONNX 圖形
Graph( %x.1 : Float(2, 3), %y.1 : Float(2, 3) ): %2 : Bool(1) = onnx::OptionalHasElement(%y.1) %5 : Float(2, 3) = onnx::If(%2) block0(): %3 : Float(2, 3) = onnx::OptionalGetElement(%y.1) %4 : Float(2, 3) = onnx::Add(%x.1, %3) -> (%4) block1(): %x.2 : Float(2, 3) = onnx::Identity(%x.1) -> (%x.2) return (%5)
範例 2
class Model(torch.nn.Module): def forward( self, src_tokens, return_all_hiddens=torch.tensor([False]), ): encoder_states: Optional[Tensor] = None if return_all_hiddens: encoder_states = src_tokens return src_tokens, encoder_states
對應的 TorchScript 圖形
Graph( %src_tokens.1 : Float(3, 2, 4,), %return_all_hiddens.1 : Bool(1) ): %3 : None = prim::Constant() %encoder_states : Tensor? = prim::If(%return_all_hiddens.1) block0(): -> (%src_tokens.1) block1(): -> (%3) return (%src_tokens.1, %encoder_states)
ONNX 圖形
Graph( %src_tokens.1 : Float(3, 2, 4), %return_all_hiddens.1 : Bool(1) ): %2 : Float(3, 2, 4) = onnx::Optional[type=tensor(float)]() %3 : Float(3, 2, 4) = onnx::If(%return_all_hiddens.1) block0(): -> (%src_tokens.1) block1(): -> (%2) return (%3)