ó ùµÈ[c@`sÄdZddlmZddlmZddlmZddlmZddlZddlZddlZ ddl m Z dd l m Z dd l mZdd l mZd efd „ƒYZdS(u'MXNet to ONNX graph converter functionsi(tabsolute_import(tdivision(tprint_function(tunicode_literalsNi(tcontext(tndarray(tio(tmodulet MXNetGraphcB`s‰eZdZiZiZd„Zed„ƒZed„ƒZed„ƒZ ed„ƒZ ed„ƒZ ed„ƒZ e d„ZRS( u$Class to convert MXNet to ONNX graphcC`sg|_g|_g|_dS(N(tnodest input_tensorstoutput_tensors(tself((sf/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/export_onnx.pyt__init__Es  c`s‡fd†}|S(uRegister operatorsc`s|tjˆ<|S(u Helper function to map functions(Rt registry_(tfunc(top_name(sf/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/export_onnx.pytwrapperNs ((RR((Rsf/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/export_onnx.pytregisterKscK`sLt|dƒ}|tjkr2td|ƒ‚ntj|}|||S(uConvert MXNet layer to ONNXuopu5No conversion function registered for op type %s yet.(tstrRRtAttributeError(tnodetkwargstopt convert_func((sf/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/export_onnx.pyt convert_layerUs  c C`sƒg|jƒD]0}||kr ||kr ||kr |^q }g}x4t|ƒD]&\}} |j| ||jfƒqVWtjƒ} tjd|d|d| dd ƒ} | j dt d|dd ƒ|d krñ|d krñ| j ƒn| j d|d |d t ƒg} x:t|ƒD],\}} ||} | jtj| ƒƒq W| jtj| ƒƒ| jƒd jƒ}|jS( u‰Do a forward pass based on the sym and params to get the shape of the output using dummy data Parameters ---------- inputs : json string sym : :class:`~mxnet.symbol.Symbol` MXNet symbol object arg_params : dict of ``str`` to :class:`~mxnet.ndarray.NDArray` Dict of converted parameters stored in ``mxnet.ndarray.NDArray`` format aux_params : dict of ``str`` to :class:`~mxnet.ndarray.NDArray` Dict of converted parameters stored in ``mxnet.ndarray.NDArray`` format Returns ------- shape : Shape Output shape tsymbolt data_namesRt label_namest for_trainingt data_shapest label_shapest arg_paramst aux_paramst allow_missingiN(t list_inputst enumeratetappendtshapeRtcputmodtModuletNonetbindtFalset init_paramst set_paramstTruetndtarraytforwardRt DataBatcht get_outputstasnumpy(tinputstsymR R!t output_labelt graph_inputRRtidxt input_nametctxttest_modt data_forwardtvaltresult((sf/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/export_onnx.pyt forward_pass^s& $  cC`s¤i}i}xD|jƒD]6}||kr|jitj||ƒ|6ƒqqWxD|jƒD]6}||kr`|jitj||ƒ|6ƒq`q`W||fS(u°Helper function to split params dictionary into args and aux params Parameters ---------- sym : :class:`~mxnet.symbol.Symbol` MXNet symbol object params : dict of ``str`` to :class:`~mxnet.ndarray.NDArray` Dict of converted parameters stored in ``mxnet.ndarray.NDArray`` format Returns ------- arg_params : dict of ``str`` to :class:`~mxnet.ndarray.NDArray` Dict of converted parameters stored in ``mxnet.ndarray.NDArray`` format aux_params : dict of ``str`` to :class:`~mxnet.ndarray.NDArray` Dict of converted parameters stored in ``mxnet.ndarray.NDArray`` format (tlist_argumentstupdateR0R1tlist_auxiliary_states(R7tparamsR R!targstaux((sf/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/export_onnx.pyt split_params”s ( (cC`sVg|D]}tjj|Œ^q}tj||ƒ\}}tj|||||ƒS(u>Infer output shape by doing a forward pass using dummy inputs (tnptrandomtrandnRRHRA(R7REtin_shapeR8t input_shapeR6targRG((sf/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/export_onnx.pytinfer_output_shape±s%cC`sMtg|jƒD]6\}}|jddƒjddƒ|jƒf^qƒS(uConvert weights to numpyuarg:uuaux:(tdicttitemstreplaceR5(t weights_dicttktv((sf/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/export_onnx.pytconvert_weights_to_numpyºscC`sy<ddlm}m}m}m} m} ddlm} Wn!tk r_tddƒ‚nX|j ƒt |j ƒƒdj d} t j |||| ƒ} t j|ƒ}tj|jƒƒd}g}g}g}g}g}g}d}xÚt|ƒD]Ì\}}|d }|d }|r=tjd |||ƒn|d kr·||kr·|| krgqþnt j|d td|d|d||d|d|d|d|ƒ}|d7}nEt j|d td|d|d|d|d|d|d|d|ƒ }t|tƒr½x|D]}t|| ƒr7|j|ƒnât||ƒrå|j|ƒ|t |ƒdkr|j sž|j| d|jdd|d| ƒƒn%|j| d|j d|d| ƒƒ|râtjd|j ƒqâqn4t|| ƒrtdƒ‚ntdt|ƒƒ‚|j|ƒqW|dkr£|t |ƒdkr{|t |ƒdd | kr{||d}n||d}|j|t |ƒƒqÊ|jt |ƒdƒqþtjdƒqþW|j|d||ƒ}|jj |ƒ|j!|ƒ|S(u€Convert MXNet graph to ONNX graph Parameters ---------- sym : :class:`~mxnet.symbol.Symbol` MXNet symbol object params : dict of ``str`` to :class:`~mxnet.ndarray.NDArray` Dict of converted parameters stored in ``mxnet.ndarray.NDArray`` format in_shape : List of tuple Input shape of the model e.g [(1,3,224,224)] in_type : data type Input data type e.g. np.float32 verbose : Boolean If true will print logs of the model conversion Returns ------- graph : GraphProto ONNX graph i(tcheckerthelpert NodePrototValueInfoProtot TensorProto(tmake_tensor_value_infou(Onnx and protobuf need to be installed. u6Instructions to install - https://github.com/onnx/onnxiu_labelunodesuopunameu$Converting idx: %d, op: %s, name: %sunulltis_inputtmx_graphtweightsRLtin_typet proc_nodest initializert index_lookupR:tnamet elem_typeR&uOutput node is: %suDid not expect TensorProtou#node is of an unrecognized type: %siu7Operator converter function should always return a listumxnet_converted_model("tonnxRWRXRYRZR[t onnx.helperR\t ImportErrort get_internalstlenRdRRORVtjsontloadsttojsonR$tloggingtinfoRR/R,t isinstancetlistR%toutputt ValueErrorttypet make_graphRbtextendt check_graph(R R7RERLR`tverboseRWRXRYRZR[R\R8t output_shapeR_R^Rbtall_processed_nodestonnx_processed_nodestonnx_processed_inputstonnx_processed_outputsRctgraph_input_idxR:RRRdt convertedtconverted_nodet prev_indextgraph((sf/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/export_onnx.pytcreate_onnx_graph_protoÀs®( '                 (t__name__t __module__t__doc__Rtinput_output_maps_R t staticmethodRRRARHRORVR,Rƒ(((sf/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/export_onnx.pyR@s   6 (R†t __future__RRRRRnRktnumpyRItRRR0RRR(tobjectR(((sf/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/export_onnx.pyt1s