ó R;]c@s5dZdddgZddlZddlZddlZddlmZddlmZm Z m Z dd lm Z dd l m Z dd lm Zd d lmZmZmZd dlmZmZdefd„ƒYZd„Zd„Zdefd„ƒYZdefd„ƒYZdefd„ƒYZdS(s3Base container class for all neural network models.tBlockt HybridBlockt SymbolBlockiÿÿÿÿN(t OrderedDicti(tsymboltndarrayt initializer(tSymbol(tNDArray(tnamei(t Parametert ParameterDicttDeferredInitializationError(t_indentt_brief_print_listt _BlockScopecBs>eZdZdZd„Zed„ƒZd„Zd„Z RS(s%Scope for collecting child `Block` s.cCs(||_i|_d|_d|_dS(N(t_blockt_countertNonet _old_scopet _name_scope(tselftblock((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyt__init__(s   cCstj}|dkrw|dkr@tjjjd|ƒd}n|dkr[t|ƒ}nt|j|ƒ}||fS|dkr¼|j j|dƒ}d||f}|d|j |`_ for more info on prefix and naming. params : ParameterDict or None :py:class:`ParameterDict` for sharing weights with the new :py:class:`Block`. For example, if you want ``dense1`` to share ``dense0``'s weights, you can do:: dense0 = nn.Dense(20) dense1 = nn.Dense(20, params=dense0.collect_params()) cCs‰|dk|_tj|||jƒƒ\|_|_|jjdƒrU|jd n|j|_t|ƒ|_t ƒ|_ i|_ dS(NtRiÿÿÿÿ( R%RR$t_aliast_prefixt_paramstendswithRt_scopeRt _childrent _reg_params(RRR((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyR©s '+ c Csƒd}djg|jjƒD]B\}}t|tƒrdjd|dt|jƒdƒƒ^qƒ}|jd|jj d|ƒS( Ns{name}( {modstr} )s s ({key}): {block}tkeyRiR tmodstr( tjoint__dict__titemsR0RtformatR t__repr__t __class__R,(RtsRORRP((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyRU±s Xc Csøt||ƒrt||ƒ}t|ttfƒrt|t|ƒƒ rtdjd|dt|ƒdt|ƒƒƒ‚qnt|tƒr¡|j||ƒn:t|tƒrÛ||j ksËt dƒ‚||j |`_ for more info on prefix and naming. (RL(R((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyt name_scopeõs cCs|jS(skReturns this :py:class:`Block`'s parameter dictionary (does not include its children's parameters).(RJ(R((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyRscs¡|jƒt|jjƒ}|s5|j|jƒn5tj|ƒ‰|j‡fd†|jjƒDƒƒx0|j j ƒD]}|j|j d|ƒƒqzW|S(sReturns a :py:class:`ParameterDict` containing this :py:class:`Block` and all of its children's Parameters(default), also can returns the select :py:class:`ParameterDict` which match some given regular expressions. For example, collect the specified parameters in ['conv1_weight', 'conv1_bias', 'fc_weight', 'fc_bias']:: model.collect_params('conv1_weight|conv1_bias|fc_weight|fc_bias') or collect all parameters whose names end with 'weight' or 'bias', this can be done using regular expressions:: model.collect_params('.*weight|.*bias') Parameters ---------- select : str regular expressions Returns ------- The selected :py:class:`ParameterDict` cs.i|]$\}}ˆj|ƒr||“qS((tmatch(t.0R R*(tpattern(sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pys 's tselect( RoR RJRtupdateRtretcompileRSRMtvaluestcollect_params(RRuREtcld((RtsQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyRzs &RGcspˆrˆd7‰n‡fd†|jjƒDƒ}x7|jjƒD]&\}}|j|jˆ|ƒƒqBW|S(NRics#i|]\}}|ˆ|“qS(((RsROtval(R(sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pys /s (RNRSRMRvt_collect_params_with_prefix(RRRER tchild((RsQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyR},s  cCs6|jƒ}d„|jƒDƒ}tj||ƒdS(sSave parameters to file. Saved parameters can only be loaded with `load_parameters`. Note that this method only saves parameters, not model structure. If you want to save model structures, please use :py:meth:`HybridBlock.export`. Parameters ---------- filename : str Path to file. References ---------- `Saving and Loading Gluon Models `_ cSs%i|]\}}|jƒ|“qS((t_reduce(RsROR|((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pys Fs N(R}RSRtsave(RtfilenameRtarg_dict((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pytsave_parameters4s cCsZtjdƒy |jƒj|d|jƒWn&tk rU}td|jƒ‚nXdS(sÞ[Deprecated] Please use save_parameters. Note that if you want to load from SymbolBlock later, please use export instead. Save parameters to file. filename : str Path to file. sásave_params is deprecated. Please use save_parameters. Note that if you want to load from SymbolBlock later, please use export instead. For details, see https://mxnet.incubator.apache.org/tutorials/gluon/save_load_params.htmlt strip_prefixsK%s save_params is deprecated. Using save_parameters may resolve this error.N(RlRmRzR€Rt ValueErrortmessage(RRte((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyt save_paramsIs  cCs.tj|ƒ}|jƒ}| r-| r-dStd„|jƒDƒƒsr~|jƒj|||||jƒdS|sÃxH|jƒD]7}||ks…td||t|jƒƒfƒ‚q…Wnxd|D]\}| r||krt d||t|j jƒƒfƒ‚n||j |||ƒqÊWdS(sÞLoad parameters from file previously saved by `save_parameters`. Parameters ---------- filename : str Path to parameter file. ctx : Context or list of Context, default cpu() Context(s) to initialize loaded parameters on. allow_missing : bool, default False Whether to silently skip loading parameters not represents in the file. ignore_extra : bool, default False Whether to silently ignore parameters from the file that are not present in this Block. References ---------- `Saving and Loading Gluon Models `_ Ncss|]}d|kVqdS(RiN((RsRA((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pys wss{Parameter '%s' is missing in file '%s', which contains parameters: %s. Set allow_missing=True to ignore missing parameters.s…Parameter '%s' loaded from file '%s' is not present in ParameterDict, which contains parameters %s. Set ignore_extra=True to ignore. ( RtloadR}tanytkeysRzRR6RR…RJt _load_init(RRtctxt allow_missingt ignore_extratloadedRR ((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pytload_parameters]s(  & %cCs'tjdƒ|j||||ƒdS(s[Deprecated] Please use load_parameters. Load parameters from file. filename : str Path to parameter file. ctx : Context or list of Context, default cpu() Context(s) to initialize loaded parameters on. allow_missing : bool, default False Whether to silently skip loading parameters not represents in the file. ignore_extra : bool, default False Whether to silently ignore parameters from the file that are not present in this Block. s6load_params is deprecated. Please use load_parameters.N(RlRmR‘(RRRRŽR((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyt load_paramss cCs5|dkr$tt|jƒƒ}n||j|`_ cCsbtt|ƒjd|d|ƒd|_d|_d|_d|_d|_t |_ i|_ dS(NRR(( R^RRt _cached_graphRt _cached_opt_cached_op_argst _out_formatt _in_formatRbt_activet_flags(RRR((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyRs      cCs9tt|ƒj||ƒt|tƒr5|jƒndS(sRegisters parameters.N(R^RR_R0t_clear_cached_op(RR R*((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyR_scGs |jst|dƒ\}|_t|ƒdkrhgtt|ƒƒD]}tjd|ƒ^qF}ntjdƒg}t||jƒd}d„|jj ƒDƒ}|j ƒ|j t||Ž}WdQXt|dƒ\}|_ |tj |ƒf|_n|jS(Ntinputisdata%dRdicSs%i|]\}}|jƒ|“qS((tvar(RsRAtj((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pys +s toutput(R¢R9R¦R2trangeRR«RDRNRSRqthybrid_forwardR¥tGroup(RR<RAtinputstgrouped_inputsRtout((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyt _get_graph"s 5 c Gsl|j|Œ\}}d„t|ƒDƒ}tj||jƒ|_t|jƒjƒƒ}t |j ƒƒ}x6|D].}||kst||kstt d|ƒ‚qtWx@|jƒD]2\}}||kr³t j d|ddƒq³q³Wx4|D],}||krðt j d|ddƒqðqðWg|j ƒD]2}||krOt||fn t||f^q-|_dS(NcSs"i|]\}}||j“qS((R (RsRAR«((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pys 6s s Unknown input to HybridBlock: %ssPThe %d-th input to HybridBlock is not used by any computation. Is this intended?Rjis>Parameter %s is not used by any computation. Is this intended?(R´t enumerateRtCachedOpR¨R£RcRzRStsett list_inputsR6RlRmRbRaR¤( RR<R±R³t input_idxRtexpected_inputsR RA((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyt _build_cache4s$      cGs¦y|j|ŒWn.tk rA}dj|ƒ}t|ƒ‚nX|rxxW|jD]\}}|sR|jƒqRqRWn*x'|jjƒD]\}}|jƒqˆWdS(NsDDeferred initialization failed because shape cannot be inferred {}(t infer_shapet ExceptionRTR…R¤t_finish_deferred_initRRS(RthybridR<R‡t error_msgtis_argRAR((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyR¾Ls cGsÅ|jdkr|j|Œnt|dƒ\}}||jksOtdƒ‚g|jD](\}}|ru||n |jƒ^qY}|j|Œ}t|t ƒr±|g}nt ||j ƒdS(NRªsInvalid input formati( R£RR»R9R¦R6R¤RdR0RRDR¥(RR<RCRÁRAtcargsR³((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyt_call_cached_op\s5 cCsd|_d|_d|_dS(N((R¢RR£R¤(R((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyR©is  cCsat|tƒs:tdt|ƒtt|ƒƒfƒ‚ntt|ƒj||ƒ|jƒdS(Ns‡Children of HybridBlock must also be HybridBlock, but %s has type %s. If you are using Sequential, please try HybridSequential instead.(R0RR…R7R8R^R]R©(RRR ((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyR]ns %cKs?||_|jƒ|_|jƒtt|ƒj||dS(N(R§RSR¨R©R^RR—(RR˜R™((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyR—xs  cCs$|jƒtt|ƒj|ƒdS(N(R©R^RRš(RR›((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyRš~s c s|j|Œ\}}t|dƒ\}}tjdtƒ`}t||ƒ‡fd†t||ƒDƒ\}}} |dkr˜t|dj ƒ‚nWdQXd„t|j ƒ|ƒDƒ} | j d„t|j ƒ| ƒDƒƒx1|j ƒjƒD]} t| ˆ| | jƒqöWdS(sGeneric infer attributes.Rªtrecordcs+i|]!\}}t|ˆƒ|j“qS((R[R (RsRAR¬(tattr(sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pys ˆs iNcSsi|]\}}||“qS(((RsRAR¬((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pys ‹s cSsi|]\}}||“qS(((RsR RÅ((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pys Œs (R´R9Rltcatch_warningsRaR[tzipRR…R†tlist_argumentsRvtlist_auxiliary_statesRzRytsetattrR ( Rtinfer_fnRÅR<R±R³Rtwt arg_attrst aux_attrstsdictRA((RÅsQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyt _infer_attrs‚s +  cGs|jdd|ŒdS(s'Infers shape of Parameters from inputs.R¼tshapeN(RÐ(RR<((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyR¼‘scGs|jdd|ŒdS(s+Infers data type of Parameters from inputs.t infer_typeR›N(RÐ(RR<((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyRÒ•sic Csê|jstdƒ‚n|jd}|jd|ƒt|jƒƒ}t|jƒƒ}i}xi|jƒjƒD]U\}}||kr¢|jƒ|d|Âs cs(i|]\}}|jˆƒ|“qS((Rd(RsRAR¬(R(sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pys Ès NsZHybridBlock requires the first argument to forward be either Symbol or NDArray, but got %scSs%i|]\}}|jƒ|“qS((R«(RsRAR¬((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pys Îs (R0RtcontextR§RÃRNRSR R¾R¯RRR6R8RqR(RtxR<R((RsQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyRºs$  #   cOs t‚dS(sOverrides to construct symbolic graph for this `Block`. Parameters ---------- x : Symbol or NDArray The first input tensor. *args : list of Symbol or list of NDArray Additional input tensors. N(RŸ(RtFRÛR<R™((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyR¯Òs N(R,R-R.RRR_R´R»R¾RÃR©R]RaR—RšRÐR¼RÒRÙRR¯(((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyRæs"+           ! cBsJeZdZeddd„ƒZdd„Zd„Zd„Zd„Z RS(siConstruct block from symbol. This is useful for using pre-trained models as feature extractors. For example, you may want to extract the output from fc2 layer in AlexNet. Parameters ---------- outputs : Symbol or list of Symbol The desired output for SymbolBlock. inputs : Symbol or list of Symbol The Variables in output's argument that should be used as inputs. params : ParameterDict Parameter dictionary for arguments and auxililary states of outputs that are not inputs. Examples -------- >>> # To extract the feature from fc1 and fc2 layers of AlexNet: >>> alexnet = gluon.model_zoo.vision.alexnet(pretrained=True, ctx=mx.cpu(), prefix='model_') >>> inputs = mx.sym.var('data') >>> out = alexnet(inputs) >>> internals = out.get_internals() >>> print(internals.list_outputs()) ['data', ..., 'model_dense0_relu_fwd_output', ..., 'model_dense1_relu_fwd_output', ...] >>> outputs = [internals['model_dense0_relu_fwd_output'], internals['model_dense1_relu_fwd_output']] >>> # Create SymbolBlock that shares parameters with alexnet >>> feat_model = gluon.SymbolBlock(outputs, inputs, params=alexnet.collect_params()) >>> x = mx.nd.random.normal(shape=(16, 3, 224, 224)) >>> print(feat_model(x)) cCs‡tj|ƒ}t|tƒr*|g}ng|D]}tj|ƒ^q1}t||ƒ}|dk rƒ|jƒj|d|ƒn|S(sImport model previously saved by `HybridBlock.export` or `Module.save_checkpoint` as a SymbolBlock for use in Gluon. Parameters ---------- symbol_file : str Path to symbol file. input_names : list of str List of input variable names param_file : str, optional Path to parameter file. ctx : Context, default None The context to initialize SymbolBlock on. Returns ------- SymbolBlock SymbolBlock loaded from symbol and parameter files. Examples -------- >>> net1 = gluon.model_zoo.vision.resnet18_v1( ... prefix='resnet', pretrained=True) >>> net1.hybridize() >>> x = mx.nd.random.normal(shape=(1, 3, 32, 32)) >>> out1 = net1(x) >>> net1.export('net1', epoch=1) >>> >>> net2 = gluon.SymbolBlock.imports( ... 'net1-symbol.json', ['data'], 'net1-0001.params') >>> out2 = net2(x) RN(RR‰R0R7R«RRRz(t symbol_filet input_namest param_fileRRÖRAR±RE((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pytimportss" " cCsÜtt|ƒjddddƒd|_td|ƒ|_t|tj ƒrpt |j ƒƒdkrp|g}nt|t t fƒr¤t |ƒdkr¤|d}nt|dƒ\}|_t|dƒ\}|_tj|ƒ}tƒ}xR|D]J}t |jƒj ƒƒdks-tdt|ƒƒ‚|j|jƒqóWx9|jƒD]+}||krN|jj|d tƒqNqNWx?|jƒD]1}||krŠ|jj|d d d tƒqŠqŠW||f|_|jƒdS( NRRRGiiRªR­s@Input symbols must be variable, but %s is an output of operatorstallow_deferred_inittgrad_reqtnull(R^RRRRIR RJR0RRR2R3R4R5R9R¦R¥R°R·t get_internalsR6R7taddR RÈRRRaRÉR¢R»(RtoutputsR±RtsymsR³RÞRA((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyR,s. * '   !  #c Gs&t|tƒrm|jPy|j||ŒSWn$tk rS|jt||ŒnX|j||ŒSWdQXnt|tƒs’tdt |ƒƒ‚t |gt |ƒdƒ\}}||j ksÏtdƒ‚t j |jdƒ}|jd„t|jd|ƒDƒtt |ƒ|jƒdS(NsZHybridBlock requires the first argument to forward be either Symbol or NDArray, but got %sRªsInvalid input formaticSs"i|]\}}||j“qS((R (RsRnRf((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pys Zs i(R0RRÚRÃR R¾RaRR6R8R9R4R¦tcopyR¢t_composeRÇRDR¥(RRÛR<tin_fmtRE((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyRJs  "'cCs)|j}tt|ƒjƒ||_dS(N(R¢R^RR©(Rttmp((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyR©]s cOs t‚dS(N(RŸ(RRÜRÛR<R™((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyR¯bsN( R,R-R.R/RRàRRR©R¯(((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyRàs+   (R.t__all__RèRlRwt collectionsRRGRRRRRR Rt parameterR R R tutilsR RtobjectRR9RDRRR(((sQ/usr/local/lib/python2.7/site-packages/mxnet-1.2.1-py2.7.egg/mxnet/gluon/block.pyts$   3  ÿlú