From 30ee432d56239cbfbc0e03303963bcdd99cc202e Mon Sep 17 00:00:00 2001 From: Wang Guo Date: Wed, 5 Sep 2018 10:52:59 +0100 Subject: [PATCH 1/2] Add files via upload --- convert.py | 120 ++++++++++++++++++++++++++--------------------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/convert.py b/convert.py index 30dcd4a..b649c92 100755 --- a/convert.py +++ b/convert.py @@ -1,60 +1,60 @@ -#!/usr/bin/env python - -import os -import sys -import numpy as np -import argparse -from kaffe import KaffeError, print_stderr -from kaffe.tensorflow import TensorFlowTransformer - - -def fatal_error(msg): - print_stderr(msg) - exit(-1) - - -def validate_arguments(args): - if (args.data_output_path is not None) and (args.caffemodel is None): - fatal_error('No input data path provided.') - if (args.caffemodel is not None) and (args.data_output_path is None): - fatal_error('No output data path provided.') - if (args.code_output_path is None) and (args.data_output_path is None): - fatal_error('No output path specified.') - - -def convert(def_path, caffemodel_path, data_output_path, code_output_path, phase): - try: - transformer = TensorFlowTransformer(def_path, caffemodel_path, phase=phase) - print_stderr('Converting data...') - if caffemodel_path is not None: - data = transformer.transform_data() - print_stderr('Saving data...') - with open(data_output_path, 'wb') as data_out: - np.save(data_out, data) - if code_output_path: - print_stderr('Saving source...') - with open(code_output_path, 'wb') as src_out: - src_out.write(transformer.transform_source()) - print_stderr('Done.') - except KaffeError as err: - fatal_error('Error encountered: {}'.format(err)) - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('def_path', help='Model definition (.prototxt) path') - parser.add_argument('--caffemodel', help='Model data (.caffemodel) path') - parser.add_argument('--data-output-path', help='Converted data output path') - parser.add_argument('--code-output-path', help='Save generated source to this path') - parser.add_argument('-p', - '--phase', - default='test', - help='The phase to convert: test (default) or train') - args = parser.parse_args() - validate_arguments(args) - convert(args.def_path, args.caffemodel, args.data_output_path, args.code_output_path, - args.phase) - - -if __name__ == '__main__': - main() +#!/usr/bin/env python + +import os +import sys +import numpy as np +import argparse +from kaffe import KaffeError, print_stderr +from kaffe.tensorflow import TensorFlowTransformer + + +def fatal_error(msg): + print_stderr(msg) + exit(-1) + + +def validate_arguments(args): + if (args.data_output_path is not None) and (args.caffemodel is None): + fatal_error('No input data path provided.') + if (args.caffemodel is not None) and (args.data_output_path is None): + fatal_error('No output data path provided.') + if (args.code_output_path is None) and (args.data_output_path is None): + fatal_error('No output path specified.') + + +def convert(def_path, caffemodel_path, data_output_path, code_output_path, phase): + try: + transformer = TensorFlowTransformer(def_path, caffemodel_path, phase=phase) + print_stderr('Converting data...') + if caffemodel_path is not None: + data = transformer.transform_data() + print_stderr('Saving data...') + with open(data_output_path, 'wb') as data_out: + np.save(data_out, data) + if code_output_path: + print_stderr('Saving source...') + with open(code_output_path, 'wb') as src_out: + src_out.write(transformer.transform_source()) + print_stderr('Done.') + except KaffeError as err: + fatal_error('Error encountered: {}'.format(err)) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('def_path', help='Model definition (.prototxt) path') + parser.add_argument('--caffemodel', help='Model data (.caffemodel) path') + parser.add_argument('--data-output-path', help='Converted data output path') + parser.add_argument('--code-output-path', help='Save generated source to this path') + parser.add_argument('-p', + '--phase', + default='test', + help='The phase to convert: test (default) or train') + args = parser.parse_args() + validate_arguments(args) + convert(args.def_path, args.caffemodel, args.data_output_path, args.code_output_path, + args.phase) + + +if __name__ == '__main__': + main() From aea6e8df36c0ce96ec79837d947e809e3982a919 Mon Sep 17 00:00:00 2001 From: Wang Guo Date: Wed, 5 Sep 2018 10:57:18 +0100 Subject: [PATCH 2/2] Add files via upload support python3 --- kaffe/__init__.py | 8 +- kaffe/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 302 bytes kaffe/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 286 bytes kaffe/__pycache__/errors.cpython-35.pyc | Bin 0 -> 468 bytes kaffe/__pycache__/errors.cpython-36.pyc | Bin 0 -> 446 bytes kaffe/__pycache__/graph.cpython-35.pyc | Bin 0 -> 11051 bytes kaffe/__pycache__/graph.cpython-36.pyc | Bin 0 -> 10095 bytes kaffe/__pycache__/layers.cpython-35.pyc | Bin 0 -> 4770 bytes kaffe/__pycache__/layers.cpython-36.pyc | Bin 0 -> 4268 bytes kaffe/__pycache__/shapes.cpython-35.pyc | Bin 0 -> 2837 bytes kaffe/__pycache__/shapes.cpython-36.pyc | Bin 0 -> 2611 bytes kaffe/__pycache__/transformers.cpython-35.pyc | Bin 0 -> 10907 bytes kaffe/__pycache__/transformers.cpython-36.pyc | Bin 0 -> 10028 bytes kaffe/caffe/__init__.py | 2 +- .../caffe/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 209 bytes .../caffe/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 203 bytes .../__pycache__/caffe_pb2.cpython-35.pyc | Bin 0 -> 114815 bytes .../caffe/__pycache__/caffepb.cpython-35.pyc | Bin 0 -> 114813 bytes .../caffe/__pycache__/caffepb.cpython-36.pyc | Bin 0 -> 84427 bytes .../caffe/__pycache__/resolver.cpython-35.pyc | Bin 0 -> 1721 bytes .../caffe/__pycache__/resolver.cpython-36.pyc | Bin 0 -> 1629 bytes kaffe/caffe/caffe_pb2.py | 5479 +++++++++++++++++ kaffe/caffe/resolver.py | 96 +- kaffe/errors.py | 14 +- kaffe/graph.py | 605 +- kaffe/layers.py | 294 +- kaffe/shapes.py | 166 +- kaffe/tensorflow/__init__.py | 4 +- .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 239 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 231 bytes .../__pycache__/network.cpython-35.pyc | Bin 0 -> 8479 bytes .../__pycache__/network.cpython-36.pyc | Bin 0 -> 7794 bytes .../__pycache__/transformer.cpython-35.pyc | Bin 0 -> 11417 bytes .../__pycache__/transformer.cpython-36.pyc | Bin 0 -> 10520 bytes kaffe/tensorflow/network.py | 488 +- kaffe/tensorflow/transformer.py | 570 +- kaffe/transformers.py | 580 +- 37 files changed, 6893 insertions(+), 1413 deletions(-) create mode 100644 kaffe/__pycache__/__init__.cpython-35.pyc create mode 100644 kaffe/__pycache__/__init__.cpython-36.pyc create mode 100644 kaffe/__pycache__/errors.cpython-35.pyc create mode 100644 kaffe/__pycache__/errors.cpython-36.pyc create mode 100644 kaffe/__pycache__/graph.cpython-35.pyc create mode 100644 kaffe/__pycache__/graph.cpython-36.pyc create mode 100644 kaffe/__pycache__/layers.cpython-35.pyc create mode 100644 kaffe/__pycache__/layers.cpython-36.pyc create mode 100644 kaffe/__pycache__/shapes.cpython-35.pyc create mode 100644 kaffe/__pycache__/shapes.cpython-36.pyc create mode 100644 kaffe/__pycache__/transformers.cpython-35.pyc create mode 100644 kaffe/__pycache__/transformers.cpython-36.pyc create mode 100644 kaffe/caffe/__pycache__/__init__.cpython-35.pyc create mode 100644 kaffe/caffe/__pycache__/__init__.cpython-36.pyc create mode 100644 kaffe/caffe/__pycache__/caffe_pb2.cpython-35.pyc create mode 100644 kaffe/caffe/__pycache__/caffepb.cpython-35.pyc create mode 100644 kaffe/caffe/__pycache__/caffepb.cpython-36.pyc create mode 100644 kaffe/caffe/__pycache__/resolver.cpython-35.pyc create mode 100644 kaffe/caffe/__pycache__/resolver.cpython-36.pyc create mode 100644 kaffe/caffe/caffe_pb2.py create mode 100644 kaffe/tensorflow/__pycache__/__init__.cpython-35.pyc create mode 100644 kaffe/tensorflow/__pycache__/__init__.cpython-36.pyc create mode 100644 kaffe/tensorflow/__pycache__/network.cpython-35.pyc create mode 100644 kaffe/tensorflow/__pycache__/network.cpython-36.pyc create mode 100644 kaffe/tensorflow/__pycache__/transformer.cpython-35.pyc create mode 100644 kaffe/tensorflow/__pycache__/transformer.cpython-36.pyc diff --git a/kaffe/__init__.py b/kaffe/__init__.py index 96af069..4e05be4 100644 --- a/kaffe/__init__.py +++ b/kaffe/__init__.py @@ -1,4 +1,4 @@ -from .graph import GraphBuilder, NodeMapper -from .errors import KaffeError, print_stderr - -from . import tensorflow +from .graph import GraphBuilder, NodeMapper +from .errors import KaffeError, print_stderr + +from . import tensorflow diff --git a/kaffe/__pycache__/__init__.cpython-35.pyc b/kaffe/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e98343764b4122949301b2fb30a145f60ec814c GIT binary patch literal 302 zcmYL@!Ait15QZmd(_PE%b$x~&^x#oML=+F=UcALZC^lV-NfV}BidVrW@F{$yTs`>; zo}59@F!N9H&G2Uq*X#22{q11}fKST5Bk6WQIkL1A0vv!BpapmdT7qCI!DZlc&^dSo zTK&=tTmgOodO`0T?kn{r$flBMb%RZOy4?4!wV29nXzg7SqebeKw@ugCYs7$Q6|o;C zGfp&yl}P1ehcRI1!o01PTJ6{dc}dJjQbA(@N6eWhCV&N%55NOPEZ^1DX+7^w>PP

6c`5B+4!aePV3GauT$v**0`$gUf)kw4TBNtXZs literal 0 HcmV?d00001 diff --git a/kaffe/__pycache__/__init__.cpython-36.pyc b/kaffe/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f8ee93deabd025be88606ede70da3cf4baeba0b GIT binary patch literal 286 zcmYLD!A`?43{BFe8`UQ5H+ld~a65Q+p51yUM1V`*jC>nOoLb{&}@Dgr0q6kKUr zDy~4q%vyX#p105Qd4Asg(a3*(d%bM|-~;nFTx3&BJweFuVNd`>09Tm<8HX1vagYqQ z93rf^kPWC9aT>h|ho86y^OW!>7?LTb-b0W$%Sf5FX~Qx8b&}_Drc|xwAvc~7RZ>bJ zj4wo4XX}D^AjJJTDf-Sks3B@u_&T~gjl0DpPD$msm6fhlUesNDM}=6Du0Clt%E1** zK8OU&zNci4f=+5)VCn+|yqXn*m38?9Fy1m?Xd4aBANis7(J9v(ZHBtd@Ec~(sbwoe zW_YO=fA-W4YMG!>%c>RqC|S22fT;j^=qitfc4rT%Y}#dAS!=fUPsskURrAjJYdI&= K+C>PQG5-c8TwX!| literal 0 HcmV?d00001 diff --git a/kaffe/__pycache__/errors.cpython-36.pyc b/kaffe/__pycache__/errors.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3ceba0a869077d82d51eafebe4deac4a28a0994 GIT binary patch literal 446 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 literal 0 HcmV?d00001 diff --git a/kaffe/__pycache__/graph.cpython-36.pyc b/kaffe/__pycache__/graph.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2490e6144bf767ffb279e6389d6e3eddb8c44944 GIT binary patch literal 10095 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 literal 0 HcmV?d00001 diff --git a/kaffe/__pycache__/layers.cpython-35.pyc b/kaffe/__pycache__/layers.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97f63c93678d0a1d30b87d9c01d43ddc33d3dcd0 GIT binary patch literal 4770 zcmb_fTXWP_5^hOz_xK97xr8ueL-3H;0Tz=Rx5neK;c>@4tyZ5tx9+dIk7h?lD?k7C>+_{kME{|o z-v;RsvK_oxdH6_whklrNk zmPl`rIxW&^NIxU*bCG^dYDT29kbXhlZIRwSl)@fx#~t$iM&4cWz9jD+d0&yYNZSQE zFv&j4PHong{$RH^>PA`#-L~?QZYNNG!0QB&an&v?ZN}fZfn8c^wYu7E?L(rsAG@#Z z@_jdH?KC3YwsZFzYio94ISN~DVvpmQXg5y$AJtkE$LR(NQPrCU$wH+ivf(%pP6swgTT%Zpf3^#nm9$^J8UOtFJqD@$0}%5*6B|2Pa!s?k=`hH=OH%=dn>BP#i3C-4(Y z8Tio4ZMfkByYjssdeNSosl2hHRlE}gURqvr_m$q*@2D30k$)yy4s97NJ`3U#y&-xz zPCps+M*e>@>4yR}eME(WqPcJe2i&OfE2a*V-4+ z@d!;qplWJiDdJy1#?TAO{R##$AK= zoWbeys~yZ-}r;4?oG@s)aRZr&D$@ZyYs!5AJ=>N z7uTH^H+qwEEVwp*`(?ks4#-)^ZfPE=Lh01hKv3M>1f0qYCy6T{3oairp@iPVwo05G zH}nFf1rtxObX)=CIev8e^Ki=~o5IwxG0YGsoM4*@&Cwybl8;iEg zzHon%4FOFEQ85vsa|lsOLe!BEg@K@efimi?D76}?;qX_B}VIcJ%>G}xmS@NrbV0zwN9sFOQ8N{H_75rzy#ywVij!Zk9a_#qt%xG zT3^A-Nn?%-8Rt3r<1r92#*JyiGA0q41*3On7*E62L|mSP`}@2GZ&QEDFe5TI@fP;mj5@Wxbcp)}Xfbu5?WJFa%yz4>L%_%(S^uvaYgueK|k94wIBKq zGWMlN^aq$KwfrzaHi%=Tx#0IJHE!wMex=T(g&0>) zSKB46I?6?2!65H-TJ+SGi;L_@$V#ToHsheWcNM@#@fi>@3%KYMj49A5bIdqnmW(R? zdKZqlgp;&K*WV$-wfppchq5tss7`c+XV;u)?& zfs*j-ca;yj5G3fzP@au~_c0dVfN-ajxC6`hDGQZMp?atw)ek|%3W%b?x}%~nb~ppC zZv2F?Z!2UoWC}$}#{0G84VJ@%7*eDI+^!iCjD`#sUxKSoWI2RyDLT)DEv9cXxyj@n zNLuRKcE=v+bFtr31Myy3icuO+On2aU;RcdD4r~t{79Q!uBSG9chq^>J0+_QIN(YN# z+uC(@nC#hB%v{V|hq;ckcM>*}{mmQ&K#Mik3s{)1+_60-PX}fX6F=FvtJ!-$@}{#lT*jTD z%lM%ZK7sjDc`{QP`XII|naJZ$;8Pjz^9QN}JIEJmf7!NbJEGJd(7_j|p631KcGZ5Y z*$HWm@BNy~id=g2EOVTV(?YcQ3a84l_mO4ZVb8R5H@k)3W8}sNUg88WVOH`5B!>U* UU)8Fb7tNW;nf%Q3%>0z`KSYcr?EnA( literal 0 HcmV?d00001 diff --git a/kaffe/__pycache__/layers.cpython-36.pyc b/kaffe/__pycache__/layers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..404467835e5e20aa8fe93a72401516d33a8fe47b GIT binary patch literal 4268 zcmb_fUvt~W5eE(+2vU?p$+m2#Ny<#?#TeGeMagt<-B;1_r0yr1{C%SNI0at#*DY^KOdU)g8(vk+aA()xMee>gM0LeDHjgcD z_8Wtjc=^4-%VHMtCCC%J0=XhCL%srel21XN5_6ERLZ0ST$W<+06BeK0v-}dj%&+h{ zes#||X5MvfHjVnV57@iWsGC_i4%&jNZYL5SOz5C8Z`E&k&eBf$eGqx>QmfUKL8}Li z+t?RJlJ-sEbx6@^>`F%9AsS0i;4royvU-*mj-qPMthkXR5vKGC8_AK7p1mp7 zzw-*sRuBoV*bMjDNyxpcLuOfGL#yyn(&^=UYle}CTV$H-sy3WEJ!F0e)xI_tp`0Jw|X7XqDaz@q1kB5Xz46SXbg;3 z<+tVl|DV~9cGLK`At%sLXBk_#lbK3On*93Z%7g8ry?fiOV0Tx{!|Q1xccbKJ`;Zjd z5lxpabb7y*AM&uJT1mU}=+870P3stP8jlv*=x2djL`#1UA`D75j{&A8XYT=e&jydA z(>ziHKy@;=k#O-08y;CGxE<-oiS zdTf%9n{d8jhh=%+H0ZCeRkD~v|2y-A5wpMN3ucY}5W=-|Kj?@W`Le45%A8u9s9M-Y zg0@Ah1h4HTvZfH_2elh%-Ogt6eXguFmp9iow!YnLN{V!LsgbC))7Ms|Ok`GmMxoO@ zB5ud~6cHY6Myd4Ijo z_&|g7t2Y;1y^U4Q#tf957B?#%z?)v&(~C|RgRSpgX?WX2?r zk#=_glM=y1rw9;(P>#7rXHj)eD1SeQc_gHc^(LlHT@Zs+n9ELJa^m%c^Y$%r9sOv{ zqnuiYfDIeimiZQ$b6^hGz}jUb^~#D3jDdB`bdFibu_wbEvpGX`gWX42W;HU?@84}C zwc%osO5He5DB5C;ssLqG?WTBxDvD&&IaV*oFR_-)K1jkiD`NFHgJd?f1RCyiRh~~8 z5OAWMifC8fpckBu6uaRY`3DH+oi;J%gqP?~$(4p#Mp7|NQGu?FBV^ob$gA^^{fy?I zWy%F27a{n!=-5Cz$()iT%^3_+02axFGVBDyd42XQ0gRngXW{TNcX;tVg5wp@CC?Q7yra&{aWtv0RZWKh{Kwu3Yr$Ju388Ap^i>_lx&OgFf-XTJT zZER~AeW)*C94g=6qcLd%hUuVskI%nwVsj?VMo4Sm9fi~a+6Y}pwgV&+XBul}ucB=9 z6oA7VZ4S`(bcnVhCE>xxShE}QCPvK)oj?Zd{`@l4-I^8z9Fpp)ehNRm-x2=mu8vF| zPQB+k#*(*)Xg}O0jtWqn<=(jnVdc}=4q>W`ArevpjA;Mr85f;eH(J_@c!!=8G99je zfEgIlrDJwr%5@YbQlb_OAr>Fo?phLtg4YxZy4eiWHacv8v=StBL0g@jt@i$qK zi`@X1!1K7%RWDzRj}x>j6y`~ z{vR+@105p5KM|3eKx5#gZTvW{egbsnGFJvxr?MjK6m8vAY zTqW{|$lr)85_wF7AmwRq9o0XPza!PxAlU>yl_H#YNR3odfrgXmBAR+r`su^-u?khs ztK{-9SFYp|uBiUl74^gjAAIy-IFlQVeg1jnT*c{w?^4c(^f~6k5Bhs-IBi?BeQh*+ zp@Z)&d70K{ABtWoXEaNm(8*2OtnzGQk}1u{{yB52l4;_ literal 0 HcmV?d00001 diff --git a/kaffe/__pycache__/shapes.cpython-35.pyc b/kaffe/__pycache__/shapes.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d9a3a1d22b0c9e9b8d11d8555deb245dc732d31 GIT binary patch literal 2837 zcmbVO+ioL85UrjWUt&A=WRq<6VzEMtL4=FMWiMKRc6mUENGM1PAuDT`9>o_arg|Vkx-Cf;Xed<)TH|FPCFaP-crw47Ke`w~Z zL;nJA{x^iiS5Zu~U+NCUiV}zR9a7pQ?NRJf;?cfGDs)KKNY_a>NHn=vZWv^p@!Jq_30S z799)TAbnHxMbfuO-xeKoDfDsIH~wG{eq~H%iuU(m znrCKj=#Rpp^|Nn-VLy*vghewL`e_=*c~KvR(c#b*wMnGyFz|R~Jd7XfkMZUf;#4p^ zb?As_ZG(RmZCZy|bLm{swsvUa%%fAqPI9+b8P=wT^$Wuq*#@1ubP9A8f2(G#Y7QJ6 z)ZKmMU~l6>^qNI&*hXdZ_KzC)`G;>@>2Gq)zvA$PFFWNHDe8k!Vtl-gc>-;Mf1 z7L%er@{OP5MayL4RQCttG$`B*i$F~NBC~-_|GoR<{=ww%jVj!0FqD(RN%o|Fn!adbzw|D&1^rq zn85(#!Wd=lLcg>%_siBjDA<~#F6o3|AA6K<6LPfTkR;|7NW>vEQZBs0jl;BPlmW}l z4Xk2rL0sYCLg^urEwzz7Var@fhT2xJaH>Ebm0?xsw=@(QLH{5bFHoaocPPu0u z__1&9!0t5|??Jz`AHy$Td<~`Kzgeo3JvfVW;)*4Sgz5xewva~1iM^-k8Y!hL3Oh1Q zvhK%J(GL3Ov&X2JneA$3YZ9elS4RkHjs(cN*`TX^>vttJc3OL3*bTCTW1e@T zw9D0nGo@P|Mob5p=_Z*8F+Rw4dJO@-a1(!IR&W5*g(zw=p>VO4VWh7Bsdcd~b0qIT zkeYKE%5`ojw_!d&dkPk_W*VG#&?vz=13oA>ipvd4RA)#j>5LOc43w^mV;9+2Cg(J< zdrrx1j`^DeujrG6NuLq82a}3EbIN>(*3?5jDyO=Ha{#6E5Zs1u@DqVSDSZB%0QGCU|6)8tq7Joal;r-bSFHvy^BW0k^rH(Nnr&L6b$ALRSl1d@D zR6-i&CMHW9W~e!hq+BDfsdL&@me@DYl7$p5%<$nL`N+-OU}02sdw5PuT#Uj0?E4f9}(;_WdHyG literal 0 HcmV?d00001 diff --git a/kaffe/__pycache__/shapes.cpython-36.pyc b/kaffe/__pycache__/shapes.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bcb27e43c5cf61ef65efad1d84bce9cabc402bca GIT binary patch literal 2611 zcmb7GOK;mo5Z>iWv?R;V*m0ghf+A3hx-Ya%lOSl3^biy^TDU-4)d9hBDT^{6%5qi5 z0dqTtOKgd4%x!U1>|kCN*Ti+q9dSe4#JnPIiQAZ01>a}A z?kRj?dp)k3d6>mQO~z?_%5g?V--Lrf{I!&Y)U6-lye#DYFdWCa`D>`6VNfQoV(mx6 zFwf(()ZQ>o4u?v+$B9tG$e}mmN8!`@2}XGUQ2~O=8nI2b%`o$;Oj(%i8NUutw%OFF zxY2Ot8tz=fTWGkdQQ4I<<1=nnF0BR@0h#Hw{l>sXJelWh_-v z9h`t+6{3JT35lb>2#rN?fQw{^BfF!$xGzbjBGS0Nbh z@FuQR?i(rJ!C6FALO+^mn3Pa-ioNE70X9yBwXs*IXBo;W10b<5K=ru11I3FDT`~C& z@G@0C>eOzbUUHSF6VfbAb@O#D-^K2nM+uXl?s4h%yGI@!)c5SYV z!Zeh3$=E#j_b!@h;=ly|01KkEY?It)C!30+sUYl;W5Rc5Xb#+5$`jTMrSdb&t)Eaj zrfC>pUOj(;R#vF4ATnl29(P58td-z**)0ZL5vs6jn7`ZHkK=AsWR%pho8(<;22=>$ z+IyoqC}cM)WQ_ZRVz<{YAZt4d$8sGW%Pxd=%>&woDM_eaf=cu4dx->P8-j7q^0;Mf za<3sjzUkXIvkG)28kt(W&HV^7)h-Kkw!XllOPMH{o> zC7)U^wkmk;vK>Yz6-fO#v)Lo|V(Ukyyb3w3E3P50^FQz{r z0s6q2gqZefI+~}*rZny+LBN(7S8x(JT%Vvk1{xv#*c{tB^4g=qiwC*zUQ}m M$9FN-A!+UW2i=t~oB#j- literal 0 HcmV?d00001 diff --git a/kaffe/__pycache__/transformers.cpython-35.pyc b/kaffe/__pycache__/transformers.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97b27a3a3927abe5fc447cd107145eb9d9b09675 GIT binary patch literal 10907 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 literal 0 HcmV?d00001 diff --git a/kaffe/__pycache__/transformers.cpython-36.pyc b/kaffe/__pycache__/transformers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05dcbbe883bcc125fad25e21533820b3fbd8389d GIT binary patch literal 10028 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 QKczG$)ehu{VjyM!0A=|!-~a#s literal 0 HcmV?d00001 diff --git a/kaffe/caffe/__pycache__/__init__.cpython-36.pyc b/kaffe/caffe/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95e2996d10d57f1b2a0ef888ae62a2366e587e0b GIT binary patch literal 203 zcmXr!<>hLc+!}4pz`*brh~a<<$Z`PUVi6#b!jQt4!;s4u#hA+!#l*;v!W7J)$^4QL zD5c4CODH|HBtAJYEiE;^D7830r!2MT7I#KsaeP4~SkzCGIf?@&Qv@=&h#5$%WGG?* zu|dQyeHW{k@^qsZum;_d)V$*SqO_d+@|bLpxe(!)`1s7c%#!$cy@JYH95%W6DWy57 Lb|6O-12F>tSAR72 literal 0 HcmV?d00001 diff --git a/kaffe/caffe/__pycache__/caffe_pb2.cpython-35.pyc b/kaffe/caffe/__pycache__/caffe_pb2.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62aef0c10ded233c2f469fd19b9faf14dd03e861 GIT binary patch literal 114815 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 bJhav||9AYae)-)0hX2iLt?Pi~?f?IOom%Uw literal 0 HcmV?d00001 diff --git a/kaffe/caffe/__pycache__/caffepb.cpython-36.pyc b/kaffe/caffe/__pycache__/caffepb.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0005102d609c612585ca61da785cf2f26fee6043 GIT binary patch literal 84427 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

URMlqAaf37UL(KPPl9HT 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 literal 0 HcmV?d00001 diff --git a/kaffe/caffe/__pycache__/resolver.cpython-35.pyc b/kaffe/caffe/__pycache__/resolver.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3623001486d0c753ba47817caf129b3bb78e6251 GIT binary patch literal 1721 zcmbtUUyIvD5TBK7`OnEE4ZUkFP*5l>sE{ihg+eGLhtHP;ih9`Bq;(G#*;?PpmL+#r zu5q|~y5zHzevNz#z4j?zp--I|*^d3tr!3Zbc6N4tGryVL&s(kL_kX?p{aqE{AJ`fd zl%L{f&T)$HCm;dnvk(e+7FiJ4@CMg5C=2dv=-UugAgYqGkAeeHjpZstb%+`)qf$W6 zZ@x#b5DaNv4-18-_?ho;Qs_evZXa<_u=q40Fvto49Xo4;8hWi4t#&vXsjf0v@~6^6 zfu3m4KYeZd%qKYA0E_|dP>T>fUj)7=+;}?6bS{VF0@oFzlF{Fwks0{++tVkPi>u>H z-h7;^)MR>;WQ)rQS(oZdy}~`3EsMI8aT@1RI)q8Nfp~qe6W-C2R(tqyoNrOU z=rB|XusmcMfQoP{;0AxJf0Z6XB^NMhf_@1?h_Wt;1ydVtEf6;rTUH>ia=yQ%0)8#i z*Luan*nzRVGNY{ujBC8CQ2;%^5@=%YJxxeVgGrFH!7(yko#_H}11sTIT4eZ zC?dT%zzIY{*p@3=qGjDf*%b}@zIgp`m*(xdZm6bQs47f#3x$#s%y-gQbp!|Di!vbU zf)8O7d)J|nvn6Nv5VzJ9KHP=gvI=~Mnj*zKr7W6KPP1s9knBqN$2?5R9bF?J%2MCk zK<! zj_h`NKmYWy(`BDq{BslpS=_%;t9v5XJ^uyjIUc}zGz8)R?8HNax5F-KCy zzz6<6W#ZyXI$ho*Hr%-1sU=kdUyNG@L4+}1fIG3e>Q)ebh4#(IA2FI9j#nq$;6?E4 ziFdx_ntN%Md!uZgMvr*^4BH*M+@qHF^2`gp*<34+dw!TD-e8UohxV{J6E#(79_DeD z9`Vs{ympr2`(;pLyhWU#welhznmit&+ofml=}~%ZeQ_Nd#!+eHq4-O1(dk`uP9J?- zmQCL-Y_l|lWAaF8T~rr3&gp5ir{-#_G5BIqS-++V(fx&nBQ$CJnx>1YKf|eTvcXsl l^Rlm~LCSiQ-IlixZC3xGydytSfek$guH{$<4_wE!{{tfER0jY6 literal 0 HcmV?d00001 diff --git a/kaffe/caffe/__pycache__/resolver.cpython-36.pyc b/kaffe/caffe/__pycache__/resolver.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9476d3b9bd1bf4f7cabffdd6428fb88441da10e GIT binary patch literal 1629 zcmbtUUvCpf5Z}E!pU)QurBQW=X_^o z*H}i$3!$H&pQ2x)ALL$n;w$jP%${xRhd!~=&d$!x&dhISc7NI24B!3p_pASEjD27$ z!$bZNPW=FhWRhpBi!|YnnRKN4o=I0ZS8mspo~*rRT~GS5j%!T@vVp5F`4MY{AMrMe z`$QMRLFN%o{R0xkx?HlZBe`_&mMhU7u4q&GxYlGHtpw%feli%Sj?zW;MnRwBO&YY) z+{dY#NG{lrU7<)ayvE}eFPrITT!0aMGJtzet8DNu1H{Wd{e1B7WO{o4#2(%=D%S-J zvSNC2PTH0D1m<3M$FnjJBF$4Hgijs`3FB|CuLZZeP+3OlqSgjZ8|45QiE#=x+eXkV zW0(Ab)BZWj?|RJe^AHX=Vn7s_=*$_pmkwta4(hnZBXloW?!2&A;RPWc)`mWvBJU3C z$ki==F9u4^MCH*J6dN(K$oD|hr+F%^R(%X&%wTuc+l)BLoo zjiE3_w_z`eaqoWFjFowoKr&KBLCXbd7zl}w9h={ZP^y4(KyrN@3FAI@oPdY?n$tuc zr`zOjZ>{HXwQ$Q^5*A9k%_Vsw{F0qF=JmD_w0IQ_)%Z&c<;Gc}#du~R+`^+p{cf)N zUD1kLK9xL2kV2H95Tim)GUA&;yq+XkbpmyAL=a(X>2lpUP|zgOl#YN0Zt#tj^>Mo# zOJv(9GK4FDYldI31a}oer`$REeXr9#5c_+Fhi%bmAN}$4uXe{8Tgke0Prl0SQ#EgY zv1sM*P;LWZSOuTM4(`_iSw1RCvB4)b#31GYSndA@N*VZ`>{qYDDlToWmG4{BlKc|w z5BU(=`-;yWt`jFeqGovSD@GXMc)r((pTv(JM$cxp#!+6FXi!XYdE1^JVw+=kN7U+( zDWW7APe4Vs*ZV~l^(OcYK!lx`sgcS}V$vetwO8*%`$dj_kw%G*rfG)SDw2?BllIZ< zEYkRqC|GD8pQYORQMrte{WCspA04+3Zhsxhu;rGnp6SxpMk;`^HigvCN9T_8=}JG? zSGb88|A}ftkCin%4kT&SfnFt0Jxagm4OQP%?L>W1RhslxtbOUO;MeL+{6?kK)GmSJ LIa@aZKX5+-q|sA$ literal 0 HcmV?d00001 diff --git a/kaffe/caffe/caffe_pb2.py b/kaffe/caffe/caffe_pb2.py new file mode 100644 index 0000000..993a741 --- /dev/null +++ b/kaffe/caffe/caffe_pb2.py @@ -0,0 +1,5479 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: caffe.proto + +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='caffe.proto', + package='caffe', + serialized_pb='\n\x0b\x63\x61\x66\x66\x65.proto\x12\x05\x63\x61\x66\x66\x65\"\x1c\n\tBlobShape\x12\x0f\n\x03\x64im\x18\x01 \x03(\x03\x42\x02\x10\x01\"\xcc\x01\n\tBlobProto\x12\x1f\n\x05shape\x18\x07 \x01(\x0b\x32\x10.caffe.BlobShape\x12\x10\n\x04\x64\x61ta\x18\x05 \x03(\x02\x42\x02\x10\x01\x12\x10\n\x04\x64iff\x18\x06 \x03(\x02\x42\x02\x10\x01\x12\x17\n\x0b\x64ouble_data\x18\x08 \x03(\x01\x42\x02\x10\x01\x12\x17\n\x0b\x64ouble_diff\x18\t \x03(\x01\x42\x02\x10\x01\x12\x0e\n\x03num\x18\x01 \x01(\x05:\x01\x30\x12\x13\n\x08\x63hannels\x18\x02 \x01(\x05:\x01\x30\x12\x11\n\x06height\x18\x03 \x01(\x05:\x01\x30\x12\x10\n\x05width\x18\x04 \x01(\x05:\x01\x30\"2\n\x0f\x42lobProtoVector\x12\x1f\n\x05\x62lobs\x18\x01 \x03(\x0b\x32\x10.caffe.BlobProto\"\x81\x01\n\x05\x44\x61tum\x12\x10\n\x08\x63hannels\x18\x01 \x01(\x05\x12\x0e\n\x06height\x18\x02 \x01(\x05\x12\r\n\x05width\x18\x03 \x01(\x05\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\x12\r\n\x05label\x18\x05 \x01(\x05\x12\x12\n\nfloat_data\x18\x06 \x03(\x02\x12\x16\n\x07\x65ncoded\x18\x07 \x01(\x08:\x05\x66\x61lse\"\x8a\x02\n\x0f\x46illerParameter\x12\x16\n\x04type\x18\x01 \x01(\t:\x08\x63onstant\x12\x10\n\x05value\x18\x02 \x01(\x02:\x01\x30\x12\x0e\n\x03min\x18\x03 \x01(\x02:\x01\x30\x12\x0e\n\x03max\x18\x04 \x01(\x02:\x01\x31\x12\x0f\n\x04mean\x18\x05 \x01(\x02:\x01\x30\x12\x0e\n\x03std\x18\x06 \x01(\x02:\x01\x31\x12\x12\n\x06sparse\x18\x07 \x01(\x05:\x02-1\x12\x42\n\rvariance_norm\x18\x08 \x01(\x0e\x32#.caffe.FillerParameter.VarianceNorm:\x06\x46\x41N_IN\"4\n\x0cVarianceNorm\x12\n\n\x06\x46\x41N_IN\x10\x00\x12\x0b\n\x07\x46\x41N_OUT\x10\x01\x12\x0b\n\x07\x41VERAGE\x10\x02\"\x8e\x02\n\x0cNetParameter\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05input\x18\x03 \x03(\t\x12%\n\x0binput_shape\x18\x08 \x03(\x0b\x32\x10.caffe.BlobShape\x12\x11\n\tinput_dim\x18\x04 \x03(\x05\x12\x1d\n\x0e\x66orce_backward\x18\x05 \x01(\x08:\x05\x66\x61lse\x12\x1e\n\x05state\x18\x06 \x01(\x0b\x32\x0f.caffe.NetState\x12\x19\n\ndebug_info\x18\x07 \x01(\x08:\x05\x66\x61lse\x12$\n\x05layer\x18\x64 \x03(\x0b\x32\x15.caffe.LayerParameter\x12\'\n\x06layers\x18\x02 \x03(\x0b\x32\x17.caffe.V1LayerParameter\"\x9c\n\n\x0fSolverParameter\x12\x0b\n\x03net\x18\x18 \x01(\t\x12&\n\tnet_param\x18\x19 \x01(\x0b\x32\x13.caffe.NetParameter\x12\x11\n\ttrain_net\x18\x01 \x01(\t\x12\x10\n\x08test_net\x18\x02 \x03(\t\x12,\n\x0ftrain_net_param\x18\x15 \x01(\x0b\x32\x13.caffe.NetParameter\x12+\n\x0etest_net_param\x18\x16 \x03(\x0b\x32\x13.caffe.NetParameter\x12$\n\x0btrain_state\x18\x1a \x01(\x0b\x32\x0f.caffe.NetState\x12#\n\ntest_state\x18\x1b \x03(\x0b\x32\x0f.caffe.NetState\x12\x11\n\ttest_iter\x18\x03 \x03(\x05\x12\x18\n\rtest_interval\x18\x04 \x01(\x05:\x01\x30\x12 \n\x11test_compute_loss\x18\x13 \x01(\x08:\x05\x66\x61lse\x12!\n\x13test_initialization\x18 \x01(\x08:\x04true\x12\x0f\n\x07\x62\x61se_lr\x18\x05 \x01(\x02\x12\x0f\n\x07\x64isplay\x18\x06 \x01(\x05\x12\x17\n\x0c\x61verage_loss\x18! \x01(\x05:\x01\x31\x12\x10\n\x08max_iter\x18\x07 \x01(\x05\x12\x14\n\titer_size\x18$ \x01(\x05:\x01\x31\x12\x11\n\tlr_policy\x18\x08 \x01(\t\x12\r\n\x05gamma\x18\t \x01(\x02\x12\r\n\x05power\x18\n \x01(\x02\x12\x10\n\x08momentum\x18\x0b \x01(\x02\x12\x14\n\x0cweight_decay\x18\x0c \x01(\x02\x12\x1f\n\x13regularization_type\x18\x1d \x01(\t:\x02L2\x12\x10\n\x08stepsize\x18\r \x01(\x05\x12\x11\n\tstepvalue\x18\" \x03(\x05\x12\x1a\n\x0e\x63lip_gradients\x18# \x01(\x02:\x02-1\x12\x13\n\x08snapshot\x18\x0e \x01(\x05:\x01\x30\x12\x17\n\x0fsnapshot_prefix\x18\x0f \x01(\t\x12\x1c\n\rsnapshot_diff\x18\x10 \x01(\x08:\x05\x66\x61lse\x12K\n\x0fsnapshot_format\x18% \x01(\x0e\x32%.caffe.SolverParameter.SnapshotFormat:\x0b\x42INARYPROTO\x12;\n\x0bsolver_mode\x18\x11 \x01(\x0e\x32!.caffe.SolverParameter.SolverMode:\x03GPU\x12\x14\n\tdevice_id\x18\x12 \x01(\x05:\x01\x30\x12\x17\n\x0brandom_seed\x18\x14 \x01(\x03:\x02-1\x12\x11\n\x04type\x18( \x01(\t:\x03SGD\x12\x14\n\x05\x64\x65lta\x18\x1f \x01(\x02:\x05\x31\x65-08\x12\x18\n\tmomentum2\x18\' \x01(\x02:\x05\x30.999\x12\x11\n\trms_decay\x18& \x01(\x02\x12\x19\n\ndebug_info\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\"\n\x14snapshot_after_train\x18\x1c \x01(\x08:\x04true\x12;\n\x0bsolver_type\x18\x1e \x01(\x0e\x32!.caffe.SolverParameter.SolverType:\x03SGD\"+\n\x0eSnapshotFormat\x12\x08\n\x04HDF5\x10\x00\x12\x0f\n\x0b\x42INARYPROTO\x10\x01\"\x1e\n\nSolverMode\x12\x07\n\x03\x43PU\x10\x00\x12\x07\n\x03GPU\x10\x01\"U\n\nSolverType\x12\x07\n\x03SGD\x10\x00\x12\x0c\n\x08NESTEROV\x10\x01\x12\x0b\n\x07\x41\x44\x41GRAD\x10\x02\x12\x0b\n\x07RMSPROP\x10\x03\x12\x0c\n\x08\x41\x44\x41\x44\x45LTA\x10\x04\x12\x08\n\x04\x41\x44\x41M\x10\x05\"l\n\x0bSolverState\x12\x0c\n\x04iter\x18\x01 \x01(\x05\x12\x13\n\x0blearned_net\x18\x02 \x01(\t\x12!\n\x07history\x18\x03 \x03(\x0b\x32\x10.caffe.BlobProto\x12\x17\n\x0c\x63urrent_step\x18\x04 \x01(\x05:\x01\x30\"N\n\x08NetState\x12!\n\x05phase\x18\x01 \x01(\x0e\x32\x0c.caffe.Phase:\x04TEST\x12\x10\n\x05level\x18\x02 \x01(\x05:\x01\x30\x12\r\n\x05stage\x18\x03 \x03(\t\"s\n\x0cNetStateRule\x12\x1b\n\x05phase\x18\x01 \x01(\x0e\x32\x0c.caffe.Phase\x12\x11\n\tmin_level\x18\x02 \x01(\x05\x12\x11\n\tmax_level\x18\x03 \x01(\x05\x12\r\n\x05stage\x18\x04 \x03(\t\x12\x11\n\tnot_stage\x18\x05 \x03(\t\"\xa3\x01\n\tParamSpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x31\n\nshare_mode\x18\x02 \x01(\x0e\x32\x1d.caffe.ParamSpec.DimCheckMode\x12\x12\n\x07lr_mult\x18\x03 \x01(\x02:\x01\x31\x12\x15\n\ndecay_mult\x18\x04 \x01(\x02:\x01\x31\"*\n\x0c\x44imCheckMode\x12\n\n\x06STRICT\x10\x00\x12\x0e\n\nPERMISSIVE\x10\x01\"\x98\x13\n\x0eLayerParameter\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0e\n\x06\x62ottom\x18\x03 \x03(\t\x12\x0b\n\x03top\x18\x04 \x03(\t\x12\x1b\n\x05phase\x18\n \x01(\x0e\x32\x0c.caffe.Phase\x12\x13\n\x0bloss_weight\x18\x05 \x03(\x02\x12\x1f\n\x05param\x18\x06 \x03(\x0b\x32\x10.caffe.ParamSpec\x12\x1f\n\x05\x62lobs\x18\x07 \x03(\x0b\x32\x10.caffe.BlobProto\x12\x16\n\x0epropagate_down\x18\x0b \x03(\x08\x12$\n\x07include\x18\x08 \x03(\x0b\x32\x13.caffe.NetStateRule\x12$\n\x07\x65xclude\x18\t \x03(\x0b\x32\x13.caffe.NetStateRule\x12\x37\n\x0ftransform_param\x18\x64 \x01(\x0b\x32\x1e.caffe.TransformationParameter\x12(\n\nloss_param\x18\x65 \x01(\x0b\x32\x14.caffe.LossParameter\x12\x30\n\x0e\x61\x63\x63uracy_param\x18\x66 \x01(\x0b\x32\x18.caffe.AccuracyParameter\x12,\n\x0c\x61rgmax_param\x18g \x01(\x0b\x32\x16.caffe.ArgMaxParameter\x12\x34\n\x10\x62\x61tch_norm_param\x18\x8b\x01 \x01(\x0b\x32\x19.caffe.BatchNormParameter\x12)\n\nbias_param\x18\x8d\x01 \x01(\x0b\x32\x14.caffe.BiasParameter\x12,\n\x0c\x63oncat_param\x18h \x01(\x0b\x32\x16.caffe.ConcatParameter\x12?\n\x16\x63ontrastive_loss_param\x18i \x01(\x0b\x32\x1f.caffe.ContrastiveLossParameter\x12\x36\n\x11\x63onvolution_param\x18j \x01(\x0b\x32\x1b.caffe.ConvolutionParameter\x12)\n\ncrop_param\x18\x90\x01 \x01(\x0b\x32\x14.caffe.CropParameter\x12(\n\ndata_param\x18k \x01(\x0b\x32\x14.caffe.DataParameter\x12.\n\rdropout_param\x18l \x01(\x0b\x32\x17.caffe.DropoutParameter\x12\x33\n\x10\x64ummy_data_param\x18m \x01(\x0b\x32\x19.caffe.DummyDataParameter\x12.\n\reltwise_param\x18n \x01(\x0b\x32\x17.caffe.EltwiseParameter\x12\'\n\telu_param\x18\x8c\x01 \x01(\x0b\x32\x13.caffe.ELUParameter\x12+\n\x0b\x65mbed_param\x18\x89\x01 \x01(\x0b\x32\x15.caffe.EmbedParameter\x12&\n\texp_param\x18o \x01(\x0b\x32\x13.caffe.ExpParameter\x12/\n\rflatten_param\x18\x87\x01 \x01(\x0b\x32\x17.caffe.FlattenParameter\x12\x31\n\x0fhdf5_data_param\x18p \x01(\x0b\x32\x18.caffe.HDF5DataParameter\x12\x35\n\x11hdf5_output_param\x18q \x01(\x0b\x32\x1a.caffe.HDF5OutputParameter\x12\x33\n\x10hinge_loss_param\x18r \x01(\x0b\x32\x19.caffe.HingeLossParameter\x12\x33\n\x10image_data_param\x18s \x01(\x0b\x32\x19.caffe.ImageDataParameter\x12\x39\n\x13infogain_loss_param\x18t \x01(\x0b\x32\x1c.caffe.InfogainLossParameter\x12\x39\n\x13inner_product_param\x18u \x01(\x0b\x32\x1c.caffe.InnerProductParameter\x12+\n\x0binput_param\x18\x8f\x01 \x01(\x0b\x32\x15.caffe.InputParameter\x12\'\n\tlog_param\x18\x86\x01 \x01(\x0b\x32\x13.caffe.LogParameter\x12&\n\tlrn_param\x18v \x01(\x0b\x32\x13.caffe.LRNParameter\x12\x35\n\x11memory_data_param\x18w \x01(\x0b\x32\x1a.caffe.MemoryDataParameter\x12&\n\tmvn_param\x18x \x01(\x0b\x32\x13.caffe.MVNParameter\x12.\n\rpooling_param\x18y \x01(\x0b\x32\x17.caffe.PoolingParameter\x12*\n\x0bpower_param\x18z \x01(\x0b\x32\x15.caffe.PowerParameter\x12+\n\x0bprelu_param\x18\x83\x01 \x01(\x0b\x32\x15.caffe.PReLUParameter\x12-\n\x0cpython_param\x18\x82\x01 \x01(\x0b\x32\x16.caffe.PythonParameter\x12\x33\n\x0freduction_param\x18\x88\x01 \x01(\x0b\x32\x19.caffe.ReductionParameter\x12(\n\nrelu_param\x18{ \x01(\x0b\x32\x14.caffe.ReLUParameter\x12/\n\rreshape_param\x18\x85\x01 \x01(\x0b\x32\x17.caffe.ReshapeParameter\x12+\n\x0bscale_param\x18\x8e\x01 \x01(\x0b\x32\x15.caffe.ScaleParameter\x12.\n\rsigmoid_param\x18| \x01(\x0b\x32\x17.caffe.SigmoidParameter\x12.\n\rsoftmax_param\x18} \x01(\x0b\x32\x17.caffe.SoftmaxParameter\x12\'\n\tspp_param\x18\x84\x01 \x01(\x0b\x32\x13.caffe.SPPParameter\x12*\n\x0bslice_param\x18~ \x01(\x0b\x32\x15.caffe.SliceParameter\x12(\n\ntanh_param\x18\x7f \x01(\x0b\x32\x14.caffe.TanHParameter\x12\x33\n\x0fthreshold_param\x18\x80\x01 \x01(\x0b\x32\x19.caffe.ThresholdParameter\x12)\n\ntile_param\x18\x8a\x01 \x01(\x0b\x32\x14.caffe.TileParameter\x12\x36\n\x11window_data_param\x18\x81\x01 \x01(\x0b\x32\x1a.caffe.WindowDataParameter\"\xb6\x01\n\x17TransformationParameter\x12\x10\n\x05scale\x18\x01 \x01(\x02:\x01\x31\x12\x15\n\x06mirror\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x14\n\tcrop_size\x18\x03 \x01(\r:\x01\x30\x12\x11\n\tmean_file\x18\x04 \x01(\t\x12\x12\n\nmean_value\x18\x05 \x03(\x02\x12\x1a\n\x0b\x66orce_color\x18\x06 \x01(\x08:\x05\x66\x61lse\x12\x19\n\nforce_gray\x18\x07 \x01(\x08:\x05\x66\x61lse\"\xc2\x01\n\rLossParameter\x12\x14\n\x0cignore_label\x18\x01 \x01(\x05\x12\x44\n\rnormalization\x18\x03 \x01(\x0e\x32&.caffe.LossParameter.NormalizationMode:\x05VALID\x12\x11\n\tnormalize\x18\x02 \x01(\x08\"B\n\x11NormalizationMode\x12\x08\n\x04\x46ULL\x10\x00\x12\t\n\x05VALID\x10\x01\x12\x0e\n\nBATCH_SIZE\x10\x02\x12\x08\n\x04NONE\x10\x03\"L\n\x11\x41\x63\x63uracyParameter\x12\x10\n\x05top_k\x18\x01 \x01(\r:\x01\x31\x12\x0f\n\x04\x61xis\x18\x02 \x01(\x05:\x01\x31\x12\x14\n\x0cignore_label\x18\x03 \x01(\x05\"M\n\x0f\x41rgMaxParameter\x12\x1a\n\x0bout_max_val\x18\x01 \x01(\x08:\x05\x66\x61lse\x12\x10\n\x05top_k\x18\x02 \x01(\r:\x01\x31\x12\x0c\n\x04\x61xis\x18\x03 \x01(\x05\"9\n\x0f\x43oncatParameter\x12\x0f\n\x04\x61xis\x18\x02 \x01(\x05:\x01\x31\x12\x15\n\nconcat_dim\x18\x01 \x01(\r:\x01\x31\"j\n\x12\x42\x61tchNormParameter\x12\x18\n\x10use_global_stats\x18\x01 \x01(\x08\x12&\n\x17moving_average_fraction\x18\x02 \x01(\x02:\x05\x30.999\x12\x12\n\x03\x65ps\x18\x03 \x01(\x02:\x05\x31\x65-05\"]\n\rBiasParameter\x12\x0f\n\x04\x61xis\x18\x01 \x01(\x05:\x01\x31\x12\x13\n\x08num_axes\x18\x02 \x01(\x05:\x01\x31\x12&\n\x06\x66iller\x18\x03 \x01(\x0b\x32\x16.caffe.FillerParameter\"L\n\x18\x43ontrastiveLossParameter\x12\x11\n\x06margin\x18\x01 \x01(\x02:\x01\x31\x12\x1d\n\x0elegacy_version\x18\x02 \x01(\x08:\x05\x66\x61lse\"\xfc\x03\n\x14\x43onvolutionParameter\x12\x12\n\nnum_output\x18\x01 \x01(\r\x12\x17\n\tbias_term\x18\x02 \x01(\x08:\x04true\x12\x0b\n\x03pad\x18\x03 \x03(\r\x12\x13\n\x0bkernel_size\x18\x04 \x03(\r\x12\x0e\n\x06stride\x18\x06 \x03(\r\x12\x10\n\x08\x64ilation\x18\x12 \x03(\r\x12\x10\n\x05pad_h\x18\t \x01(\r:\x01\x30\x12\x10\n\x05pad_w\x18\n \x01(\r:\x01\x30\x12\x10\n\x08kernel_h\x18\x0b \x01(\r\x12\x10\n\x08kernel_w\x18\x0c \x01(\r\x12\x10\n\x08stride_h\x18\r \x01(\r\x12\x10\n\x08stride_w\x18\x0e \x01(\r\x12\x10\n\x05group\x18\x05 \x01(\r:\x01\x31\x12-\n\rweight_filler\x18\x07 \x01(\x0b\x32\x16.caffe.FillerParameter\x12+\n\x0b\x62ias_filler\x18\x08 \x01(\x0b\x32\x16.caffe.FillerParameter\x12;\n\x06\x65ngine\x18\x0f \x01(\x0e\x32\".caffe.ConvolutionParameter.Engine:\x07\x44\x45\x46\x41ULT\x12\x0f\n\x04\x61xis\x18\x10 \x01(\x05:\x01\x31\x12\x1e\n\x0f\x66orce_nd_im2col\x18\x11 \x01(\x08:\x05\x66\x61lse\"+\n\x06\x45ngine\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\t\n\x05\x43\x41\x46\x46\x45\x10\x01\x12\t\n\x05\x43UDNN\x10\x02\"0\n\rCropParameter\x12\x0f\n\x04\x61xis\x18\x01 \x01(\x05:\x01\x32\x12\x0e\n\x06offset\x18\x02 \x03(\r\"\xa4\x02\n\rDataParameter\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x12\n\nbatch_size\x18\x04 \x01(\r\x12\x14\n\trand_skip\x18\x07 \x01(\r:\x01\x30\x12\x31\n\x07\x62\x61\x63kend\x18\x08 \x01(\x0e\x32\x17.caffe.DataParameter.DB:\x07LEVELDB\x12\x10\n\x05scale\x18\x02 \x01(\x02:\x01\x31\x12\x11\n\tmean_file\x18\x03 \x01(\t\x12\x14\n\tcrop_size\x18\x05 \x01(\r:\x01\x30\x12\x15\n\x06mirror\x18\x06 \x01(\x08:\x05\x66\x61lse\x12\"\n\x13\x66orce_encoded_color\x18\t \x01(\x08:\x05\x66\x61lse\x12\x13\n\x08prefetch\x18\n \x01(\r:\x01\x34\"\x1b\n\x02\x44\x42\x12\x0b\n\x07LEVELDB\x10\x00\x12\x08\n\x04LMDB\x10\x01\".\n\x10\x44ropoutParameter\x12\x1a\n\rdropout_ratio\x18\x01 \x01(\x02:\x03\x30.5\"\xa0\x01\n\x12\x44ummyDataParameter\x12+\n\x0b\x64\x61ta_filler\x18\x01 \x03(\x0b\x32\x16.caffe.FillerParameter\x12\x1f\n\x05shape\x18\x06 \x03(\x0b\x32\x10.caffe.BlobShape\x12\x0b\n\x03num\x18\x02 \x03(\r\x12\x10\n\x08\x63hannels\x18\x03 \x03(\r\x12\x0e\n\x06height\x18\x04 \x03(\r\x12\r\n\x05width\x18\x05 \x03(\r\"\xa5\x01\n\x10\x45ltwiseParameter\x12\x39\n\toperation\x18\x01 \x01(\x0e\x32!.caffe.EltwiseParameter.EltwiseOp:\x03SUM\x12\r\n\x05\x63oeff\x18\x02 \x03(\x02\x12\x1e\n\x10stable_prod_grad\x18\x03 \x01(\x08:\x04true\"\'\n\tEltwiseOp\x12\x08\n\x04PROD\x10\x00\x12\x07\n\x03SUM\x10\x01\x12\x07\n\x03MAX\x10\x02\" \n\x0c\x45LUParameter\x12\x10\n\x05\x61lpha\x18\x01 \x01(\x02:\x01\x31\"\xac\x01\n\x0e\x45mbedParameter\x12\x12\n\nnum_output\x18\x01 \x01(\r\x12\x11\n\tinput_dim\x18\x02 \x01(\r\x12\x17\n\tbias_term\x18\x03 \x01(\x08:\x04true\x12-\n\rweight_filler\x18\x04 \x01(\x0b\x32\x16.caffe.FillerParameter\x12+\n\x0b\x62ias_filler\x18\x05 \x01(\x0b\x32\x16.caffe.FillerParameter\"D\n\x0c\x45xpParameter\x12\x10\n\x04\x62\x61se\x18\x01 \x01(\x02:\x02-1\x12\x10\n\x05scale\x18\x02 \x01(\x02:\x01\x31\x12\x10\n\x05shift\x18\x03 \x01(\x02:\x01\x30\"9\n\x10\x46lattenParameter\x12\x0f\n\x04\x61xis\x18\x01 \x01(\x05:\x01\x31\x12\x14\n\x08\x65nd_axis\x18\x02 \x01(\x05:\x02-1\"O\n\x11HDF5DataParameter\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x12\n\nbatch_size\x18\x02 \x01(\r\x12\x16\n\x07shuffle\x18\x03 \x01(\x08:\x05\x66\x61lse\"(\n\x13HDF5OutputParameter\x12\x11\n\tfile_name\x18\x01 \x01(\t\"^\n\x12HingeLossParameter\x12\x30\n\x04norm\x18\x01 \x01(\x0e\x32\x1e.caffe.HingeLossParameter.Norm:\x02L1\"\x16\n\x04Norm\x12\x06\n\x02L1\x10\x01\x12\x06\n\x02L2\x10\x02\"\x97\x02\n\x12ImageDataParameter\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x15\n\nbatch_size\x18\x04 \x01(\r:\x01\x31\x12\x14\n\trand_skip\x18\x07 \x01(\r:\x01\x30\x12\x16\n\x07shuffle\x18\x08 \x01(\x08:\x05\x66\x61lse\x12\x15\n\nnew_height\x18\t \x01(\r:\x01\x30\x12\x14\n\tnew_width\x18\n \x01(\r:\x01\x30\x12\x16\n\x08is_color\x18\x0b \x01(\x08:\x04true\x12\x10\n\x05scale\x18\x02 \x01(\x02:\x01\x31\x12\x11\n\tmean_file\x18\x03 \x01(\t\x12\x14\n\tcrop_size\x18\x05 \x01(\r:\x01\x30\x12\x15\n\x06mirror\x18\x06 \x01(\x08:\x05\x66\x61lse\x12\x15\n\x0broot_folder\x18\x0c \x01(\t:\x00\"\'\n\x15InfogainLossParameter\x12\x0e\n\x06source\x18\x01 \x01(\t\"\xcb\x01\n\x15InnerProductParameter\x12\x12\n\nnum_output\x18\x01 \x01(\r\x12\x17\n\tbias_term\x18\x02 \x01(\x08:\x04true\x12-\n\rweight_filler\x18\x03 \x01(\x0b\x32\x16.caffe.FillerParameter\x12+\n\x0b\x62ias_filler\x18\x04 \x01(\x0b\x32\x16.caffe.FillerParameter\x12\x0f\n\x04\x61xis\x18\x05 \x01(\x05:\x01\x31\x12\x18\n\ttranspose\x18\x06 \x01(\x08:\x05\x66\x61lse\"1\n\x0eInputParameter\x12\x1f\n\x05shape\x18\x01 \x03(\x0b\x32\x10.caffe.BlobShape\"D\n\x0cLogParameter\x12\x10\n\x04\x62\x61se\x18\x01 \x01(\x02:\x02-1\x12\x10\n\x05scale\x18\x02 \x01(\x02:\x01\x31\x12\x10\n\x05shift\x18\x03 \x01(\x02:\x01\x30\"\xb8\x02\n\x0cLRNParameter\x12\x15\n\nlocal_size\x18\x01 \x01(\r:\x01\x35\x12\x10\n\x05\x61lpha\x18\x02 \x01(\x02:\x01\x31\x12\x12\n\x04\x62\x65ta\x18\x03 \x01(\x02:\x04\x30.75\x12\x44\n\x0bnorm_region\x18\x04 \x01(\x0e\x32\x1e.caffe.LRNParameter.NormRegion:\x0f\x41\x43ROSS_CHANNELS\x12\x0c\n\x01k\x18\x05 \x01(\x02:\x01\x31\x12\x33\n\x06\x65ngine\x18\x06 \x01(\x0e\x32\x1a.caffe.LRNParameter.Engine:\x07\x44\x45\x46\x41ULT\"5\n\nNormRegion\x12\x13\n\x0f\x41\x43ROSS_CHANNELS\x10\x00\x12\x12\n\x0eWITHIN_CHANNEL\x10\x01\"+\n\x06\x45ngine\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\t\n\x05\x43\x41\x46\x46\x45\x10\x01\x12\t\n\x05\x43UDNN\x10\x02\"Z\n\x13MemoryDataParameter\x12\x12\n\nbatch_size\x18\x01 \x01(\r\x12\x10\n\x08\x63hannels\x18\x02 \x01(\r\x12\x0e\n\x06height\x18\x03 \x01(\r\x12\r\n\x05width\x18\x04 \x01(\r\"d\n\x0cMVNParameter\x12 \n\x12normalize_variance\x18\x01 \x01(\x08:\x04true\x12\x1e\n\x0f\x61\x63ross_channels\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x12\n\x03\x65ps\x18\x03 \x01(\x02:\x05\x31\x65-09\"\xa2\x03\n\x10PoolingParameter\x12\x35\n\x04pool\x18\x01 \x01(\x0e\x32\".caffe.PoolingParameter.PoolMethod:\x03MAX\x12\x0e\n\x03pad\x18\x04 \x01(\r:\x01\x30\x12\x10\n\x05pad_h\x18\t \x01(\r:\x01\x30\x12\x10\n\x05pad_w\x18\n \x01(\r:\x01\x30\x12\x13\n\x0bkernel_size\x18\x02 \x01(\r\x12\x10\n\x08kernel_h\x18\x05 \x01(\r\x12\x10\n\x08kernel_w\x18\x06 \x01(\r\x12\x11\n\x06stride\x18\x03 \x01(\r:\x01\x31\x12\x10\n\x08stride_h\x18\x07 \x01(\r\x12\x10\n\x08stride_w\x18\x08 \x01(\r\x12\x37\n\x06\x65ngine\x18\x0b \x01(\x0e\x32\x1e.caffe.PoolingParameter.Engine:\x07\x44\x45\x46\x41ULT\x12\x1d\n\x0eglobal_pooling\x18\x0c \x01(\x08:\x05\x66\x61lse\".\n\nPoolMethod\x12\x07\n\x03MAX\x10\x00\x12\x07\n\x03\x41VE\x10\x01\x12\x0e\n\nSTOCHASTIC\x10\x02\"+\n\x06\x45ngine\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\t\n\x05\x43\x41\x46\x46\x45\x10\x01\x12\t\n\x05\x43UDNN\x10\x02\"F\n\x0ePowerParameter\x12\x10\n\x05power\x18\x01 \x01(\x02:\x01\x31\x12\x10\n\x05scale\x18\x02 \x01(\x02:\x01\x31\x12\x10\n\x05shift\x18\x03 \x01(\x02:\x01\x30\"g\n\x0fPythonParameter\x12\x0e\n\x06module\x18\x01 \x01(\t\x12\r\n\x05layer\x18\x02 \x01(\t\x12\x13\n\tparam_str\x18\x03 \x01(\t:\x00\x12 \n\x11share_in_parallel\x18\x04 \x01(\x08:\x05\x66\x61lse\"\xad\x01\n\x12ReductionParameter\x12=\n\toperation\x18\x01 \x01(\x0e\x32%.caffe.ReductionParameter.ReductionOp:\x03SUM\x12\x0f\n\x04\x61xis\x18\x02 \x01(\x05:\x01\x30\x12\x10\n\x05\x63oeff\x18\x03 \x01(\x02:\x01\x31\"5\n\x0bReductionOp\x12\x07\n\x03SUM\x10\x01\x12\x08\n\x04\x41SUM\x10\x02\x12\t\n\x05SUMSQ\x10\x03\x12\x08\n\x04MEAN\x10\x04\"\x8d\x01\n\rReLUParameter\x12\x19\n\x0enegative_slope\x18\x01 \x01(\x02:\x01\x30\x12\x34\n\x06\x65ngine\x18\x02 \x01(\x0e\x32\x1b.caffe.ReLUParameter.Engine:\x07\x44\x45\x46\x41ULT\"+\n\x06\x45ngine\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\t\n\x05\x43\x41\x46\x46\x45\x10\x01\x12\t\n\x05\x43UDNN\x10\x02\"Z\n\x10ReshapeParameter\x12\x1f\n\x05shape\x18\x01 \x01(\x0b\x32\x10.caffe.BlobShape\x12\x0f\n\x04\x61xis\x18\x02 \x01(\x05:\x01\x30\x12\x14\n\x08num_axes\x18\x03 \x01(\x05:\x02-1\"\xa5\x01\n\x0eScaleParameter\x12\x0f\n\x04\x61xis\x18\x01 \x01(\x05:\x01\x31\x12\x13\n\x08num_axes\x18\x02 \x01(\x05:\x01\x31\x12&\n\x06\x66iller\x18\x03 \x01(\x0b\x32\x16.caffe.FillerParameter\x12\x18\n\tbias_term\x18\x04 \x01(\x08:\x05\x66\x61lse\x12+\n\x0b\x62ias_filler\x18\x05 \x01(\x0b\x32\x16.caffe.FillerParameter\"x\n\x10SigmoidParameter\x12\x37\n\x06\x65ngine\x18\x01 \x01(\x0e\x32\x1e.caffe.SigmoidParameter.Engine:\x07\x44\x45\x46\x41ULT\"+\n\x06\x45ngine\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\t\n\x05\x43\x41\x46\x46\x45\x10\x01\x12\t\n\x05\x43UDNN\x10\x02\"L\n\x0eSliceParameter\x12\x0f\n\x04\x61xis\x18\x03 \x01(\x05:\x01\x31\x12\x13\n\x0bslice_point\x18\x02 \x03(\r\x12\x14\n\tslice_dim\x18\x01 \x01(\r:\x01\x31\"\x89\x01\n\x10SoftmaxParameter\x12\x37\n\x06\x65ngine\x18\x01 \x01(\x0e\x32\x1e.caffe.SoftmaxParameter.Engine:\x07\x44\x45\x46\x41ULT\x12\x0f\n\x04\x61xis\x18\x02 \x01(\x05:\x01\x31\"+\n\x06\x45ngine\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\t\n\x05\x43\x41\x46\x46\x45\x10\x01\x12\t\n\x05\x43UDNN\x10\x02\"r\n\rTanHParameter\x12\x34\n\x06\x65ngine\x18\x01 \x01(\x0e\x32\x1b.caffe.TanHParameter.Engine:\x07\x44\x45\x46\x41ULT\"+\n\x06\x45ngine\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\t\n\x05\x43\x41\x46\x46\x45\x10\x01\x12\t\n\x05\x43UDNN\x10\x02\"/\n\rTileParameter\x12\x0f\n\x04\x61xis\x18\x01 \x01(\x05:\x01\x31\x12\r\n\x05tiles\x18\x02 \x01(\x05\"*\n\x12ThresholdParameter\x12\x14\n\tthreshold\x18\x01 \x01(\x02:\x01\x30\"\xc1\x02\n\x13WindowDataParameter\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x10\n\x05scale\x18\x02 \x01(\x02:\x01\x31\x12\x11\n\tmean_file\x18\x03 \x01(\t\x12\x12\n\nbatch_size\x18\x04 \x01(\r\x12\x14\n\tcrop_size\x18\x05 \x01(\r:\x01\x30\x12\x15\n\x06mirror\x18\x06 \x01(\x08:\x05\x66\x61lse\x12\x19\n\x0c\x66g_threshold\x18\x07 \x01(\x02:\x03\x30.5\x12\x19\n\x0c\x62g_threshold\x18\x08 \x01(\x02:\x03\x30.5\x12\x19\n\x0b\x66g_fraction\x18\t \x01(\x02:\x04\x30.25\x12\x16\n\x0b\x63ontext_pad\x18\n \x01(\r:\x01\x30\x12\x17\n\tcrop_mode\x18\x0b \x01(\t:\x04warp\x12\x1b\n\x0c\x63\x61\x63he_images\x18\x0c \x01(\x08:\x05\x66\x61lse\x12\x15\n\x0broot_folder\x18\r \x01(\t:\x00\"\xeb\x01\n\x0cSPPParameter\x12\x16\n\x0epyramid_height\x18\x01 \x01(\r\x12\x31\n\x04pool\x18\x02 \x01(\x0e\x32\x1e.caffe.SPPParameter.PoolMethod:\x03MAX\x12\x33\n\x06\x65ngine\x18\x06 \x01(\x0e\x32\x1a.caffe.SPPParameter.Engine:\x07\x44\x45\x46\x41ULT\".\n\nPoolMethod\x12\x07\n\x03MAX\x10\x00\x12\x07\n\x03\x41VE\x10\x01\x12\x0e\n\nSTOCHASTIC\x10\x02\"+\n\x06\x45ngine\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\t\n\x05\x43\x41\x46\x46\x45\x10\x01\x12\t\n\x05\x43UDNN\x10\x02\"\xe0\x13\n\x10V1LayerParameter\x12\x0e\n\x06\x62ottom\x18\x02 \x03(\t\x12\x0b\n\x03top\x18\x03 \x03(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12$\n\x07include\x18 \x03(\x0b\x32\x13.caffe.NetStateRule\x12$\n\x07\x65xclude\x18! \x03(\x0b\x32\x13.caffe.NetStateRule\x12/\n\x04type\x18\x05 \x01(\x0e\x32!.caffe.V1LayerParameter.LayerType\x12\x1f\n\x05\x62lobs\x18\x06 \x03(\x0b\x32\x10.caffe.BlobProto\x12\x0e\n\x05param\x18\xe9\x07 \x03(\t\x12>\n\x0f\x62lob_share_mode\x18\xea\x07 \x03(\x0e\x32$.caffe.V1LayerParameter.DimCheckMode\x12\x10\n\x08\x62lobs_lr\x18\x07 \x03(\x02\x12\x14\n\x0cweight_decay\x18\x08 \x03(\x02\x12\x13\n\x0bloss_weight\x18# \x03(\x02\x12\x30\n\x0e\x61\x63\x63uracy_param\x18\x1b \x01(\x0b\x32\x18.caffe.AccuracyParameter\x12,\n\x0c\x61rgmax_param\x18\x17 \x01(\x0b\x32\x16.caffe.ArgMaxParameter\x12,\n\x0c\x63oncat_param\x18\t \x01(\x0b\x32\x16.caffe.ConcatParameter\x12?\n\x16\x63ontrastive_loss_param\x18( \x01(\x0b\x32\x1f.caffe.ContrastiveLossParameter\x12\x36\n\x11\x63onvolution_param\x18\n \x01(\x0b\x32\x1b.caffe.ConvolutionParameter\x12(\n\ndata_param\x18\x0b \x01(\x0b\x32\x14.caffe.DataParameter\x12.\n\rdropout_param\x18\x0c \x01(\x0b\x32\x17.caffe.DropoutParameter\x12\x33\n\x10\x64ummy_data_param\x18\x1a \x01(\x0b\x32\x19.caffe.DummyDataParameter\x12.\n\reltwise_param\x18\x18 \x01(\x0b\x32\x17.caffe.EltwiseParameter\x12&\n\texp_param\x18) \x01(\x0b\x32\x13.caffe.ExpParameter\x12\x31\n\x0fhdf5_data_param\x18\r \x01(\x0b\x32\x18.caffe.HDF5DataParameter\x12\x35\n\x11hdf5_output_param\x18\x0e \x01(\x0b\x32\x1a.caffe.HDF5OutputParameter\x12\x33\n\x10hinge_loss_param\x18\x1d \x01(\x0b\x32\x19.caffe.HingeLossParameter\x12\x33\n\x10image_data_param\x18\x0f \x01(\x0b\x32\x19.caffe.ImageDataParameter\x12\x39\n\x13infogain_loss_param\x18\x10 \x01(\x0b\x32\x1c.caffe.InfogainLossParameter\x12\x39\n\x13inner_product_param\x18\x11 \x01(\x0b\x32\x1c.caffe.InnerProductParameter\x12&\n\tlrn_param\x18\x12 \x01(\x0b\x32\x13.caffe.LRNParameter\x12\x35\n\x11memory_data_param\x18\x16 \x01(\x0b\x32\x1a.caffe.MemoryDataParameter\x12&\n\tmvn_param\x18\" \x01(\x0b\x32\x13.caffe.MVNParameter\x12.\n\rpooling_param\x18\x13 \x01(\x0b\x32\x17.caffe.PoolingParameter\x12*\n\x0bpower_param\x18\x15 \x01(\x0b\x32\x15.caffe.PowerParameter\x12(\n\nrelu_param\x18\x1e \x01(\x0b\x32\x14.caffe.ReLUParameter\x12.\n\rsigmoid_param\x18& \x01(\x0b\x32\x17.caffe.SigmoidParameter\x12.\n\rsoftmax_param\x18\' \x01(\x0b\x32\x17.caffe.SoftmaxParameter\x12*\n\x0bslice_param\x18\x1f \x01(\x0b\x32\x15.caffe.SliceParameter\x12(\n\ntanh_param\x18% \x01(\x0b\x32\x14.caffe.TanHParameter\x12\x32\n\x0fthreshold_param\x18\x19 \x01(\x0b\x32\x19.caffe.ThresholdParameter\x12\x35\n\x11window_data_param\x18\x14 \x01(\x0b\x32\x1a.caffe.WindowDataParameter\x12\x37\n\x0ftransform_param\x18$ \x01(\x0b\x32\x1e.caffe.TransformationParameter\x12(\n\nloss_param\x18* \x01(\x0b\x32\x14.caffe.LossParameter\x12&\n\x05layer\x18\x01 \x01(\x0b\x32\x17.caffe.V0LayerParameter\"\xd8\x04\n\tLayerType\x12\x08\n\x04NONE\x10\x00\x12\n\n\x06\x41\x42SVAL\x10#\x12\x0c\n\x08\x41\x43\x43URACY\x10\x01\x12\n\n\x06\x41RGMAX\x10\x1e\x12\x08\n\x04\x42NLL\x10\x02\x12\n\n\x06\x43ONCAT\x10\x03\x12\x14\n\x10\x43ONTRASTIVE_LOSS\x10%\x12\x0f\n\x0b\x43ONVOLUTION\x10\x04\x12\x08\n\x04\x44\x41TA\x10\x05\x12\x11\n\rDECONVOLUTION\x10\'\x12\x0b\n\x07\x44ROPOUT\x10\x06\x12\x0e\n\nDUMMY_DATA\x10 \x12\x12\n\x0e\x45UCLIDEAN_LOSS\x10\x07\x12\x0b\n\x07\x45LTWISE\x10\x19\x12\x07\n\x03\x45XP\x10&\x12\x0b\n\x07\x46LATTEN\x10\x08\x12\r\n\tHDF5_DATA\x10\t\x12\x0f\n\x0bHDF5_OUTPUT\x10\n\x12\x0e\n\nHINGE_LOSS\x10\x1c\x12\n\n\x06IM2COL\x10\x0b\x12\x0e\n\nIMAGE_DATA\x10\x0c\x12\x11\n\rINFOGAIN_LOSS\x10\r\x12\x11\n\rINNER_PRODUCT\x10\x0e\x12\x07\n\x03LRN\x10\x0f\x12\x0f\n\x0bMEMORY_DATA\x10\x1d\x12\x1d\n\x19MULTINOMIAL_LOGISTIC_LOSS\x10\x10\x12\x07\n\x03MVN\x10\"\x12\x0b\n\x07POOLING\x10\x11\x12\t\n\x05POWER\x10\x1a\x12\x08\n\x04RELU\x10\x12\x12\x0b\n\x07SIGMOID\x10\x13\x12\x1e\n\x1aSIGMOID_CROSS_ENTROPY_LOSS\x10\x1b\x12\x0b\n\x07SILENCE\x10$\x12\x0b\n\x07SOFTMAX\x10\x14\x12\x10\n\x0cSOFTMAX_LOSS\x10\x15\x12\t\n\x05SPLIT\x10\x16\x12\t\n\x05SLICE\x10!\x12\x08\n\x04TANH\x10\x17\x12\x0f\n\x0bWINDOW_DATA\x10\x18\x12\r\n\tTHRESHOLD\x10\x1f\"*\n\x0c\x44imCheckMode\x12\n\n\x06STRICT\x10\x00\x12\x0e\n\nPERMISSIVE\x10\x01\"\xfd\x07\n\x10V0LayerParameter\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x12\n\nnum_output\x18\x03 \x01(\r\x12\x16\n\x08\x62iasterm\x18\x04 \x01(\x08:\x04true\x12-\n\rweight_filler\x18\x05 \x01(\x0b\x32\x16.caffe.FillerParameter\x12+\n\x0b\x62ias_filler\x18\x06 \x01(\x0b\x32\x16.caffe.FillerParameter\x12\x0e\n\x03pad\x18\x07 \x01(\r:\x01\x30\x12\x12\n\nkernelsize\x18\x08 \x01(\r\x12\x10\n\x05group\x18\t \x01(\r:\x01\x31\x12\x11\n\x06stride\x18\n \x01(\r:\x01\x31\x12\x35\n\x04pool\x18\x0b \x01(\x0e\x32\".caffe.V0LayerParameter.PoolMethod:\x03MAX\x12\x1a\n\rdropout_ratio\x18\x0c \x01(\x02:\x03\x30.5\x12\x15\n\nlocal_size\x18\r \x01(\r:\x01\x35\x12\x10\n\x05\x61lpha\x18\x0e \x01(\x02:\x01\x31\x12\x12\n\x04\x62\x65ta\x18\x0f \x01(\x02:\x04\x30.75\x12\x0c\n\x01k\x18\x16 \x01(\x02:\x01\x31\x12\x0e\n\x06source\x18\x10 \x01(\t\x12\x10\n\x05scale\x18\x11 \x01(\x02:\x01\x31\x12\x10\n\x08meanfile\x18\x12 \x01(\t\x12\x11\n\tbatchsize\x18\x13 \x01(\r\x12\x13\n\x08\x63ropsize\x18\x14 \x01(\r:\x01\x30\x12\x15\n\x06mirror\x18\x15 \x01(\x08:\x05\x66\x61lse\x12\x1f\n\x05\x62lobs\x18\x32 \x03(\x0b\x32\x10.caffe.BlobProto\x12\x10\n\x08\x62lobs_lr\x18\x33 \x03(\x02\x12\x14\n\x0cweight_decay\x18\x34 \x03(\x02\x12\x14\n\trand_skip\x18\x35 \x01(\r:\x01\x30\x12\x1d\n\x10\x64\x65t_fg_threshold\x18\x36 \x01(\x02:\x03\x30.5\x12\x1d\n\x10\x64\x65t_bg_threshold\x18\x37 \x01(\x02:\x03\x30.5\x12\x1d\n\x0f\x64\x65t_fg_fraction\x18\x38 \x01(\x02:\x04\x30.25\x12\x1a\n\x0f\x64\x65t_context_pad\x18: \x01(\r:\x01\x30\x12\x1b\n\rdet_crop_mode\x18; \x01(\t:\x04warp\x12\x12\n\x07new_num\x18< \x01(\x05:\x01\x30\x12\x17\n\x0cnew_channels\x18= \x01(\x05:\x01\x30\x12\x15\n\nnew_height\x18> \x01(\x05:\x01\x30\x12\x14\n\tnew_width\x18? \x01(\x05:\x01\x30\x12\x1d\n\x0eshuffle_images\x18@ \x01(\x08:\x05\x66\x61lse\x12\x15\n\nconcat_dim\x18\x41 \x01(\r:\x01\x31\x12\x36\n\x11hdf5_output_param\x18\xe9\x07 \x01(\x0b\x32\x1a.caffe.HDF5OutputParameter\".\n\nPoolMethod\x12\x07\n\x03MAX\x10\x00\x12\x07\n\x03\x41VE\x10\x01\x12\x0e\n\nSTOCHASTIC\x10\x02\"W\n\x0ePReLUParameter\x12&\n\x06\x66iller\x18\x01 \x01(\x0b\x32\x16.caffe.FillerParameter\x12\x1d\n\x0e\x63hannel_shared\x18\x02 \x01(\x08:\x05\x66\x61lse*\x1c\n\x05Phase\x12\t\n\x05TRAIN\x10\x00\x12\x08\n\x04TEST\x10\x01') + +_PHASE = _descriptor.EnumDescriptor( + name='Phase', + full_name='caffe.Phase', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='TRAIN', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TEST', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=14991, + serialized_end=15019, +) + +Phase = enum_type_wrapper.EnumTypeWrapper(_PHASE) +TRAIN = 0 +TEST = 1 + + +_FILLERPARAMETER_VARIANCENORM = _descriptor.EnumDescriptor( + name='VarianceNorm', + full_name='caffe.FillerParameter.VarianceNorm', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='FAN_IN', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='FAN_OUT', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='AVERAGE', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=658, + serialized_end=710, +) + +_SOLVERPARAMETER_SNAPSHOTFORMAT = _descriptor.EnumDescriptor( + name='SnapshotFormat', + full_name='caffe.SolverParameter.SnapshotFormat', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='HDF5', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BINARYPROTO', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2132, + serialized_end=2175, +) + +_SOLVERPARAMETER_SOLVERMODE = _descriptor.EnumDescriptor( + name='SolverMode', + full_name='caffe.SolverParameter.SolverMode', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='CPU', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GPU', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2177, + serialized_end=2207, +) + +_SOLVERPARAMETER_SOLVERTYPE = _descriptor.EnumDescriptor( + name='SolverType', + full_name='caffe.SolverParameter.SolverType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='SGD', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NESTEROV', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ADAGRAD', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RMSPROP', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ADADELTA', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ADAM', index=5, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2209, + serialized_end=2294, +) + +_PARAMSPEC_DIMCHECKMODE = _descriptor.EnumDescriptor( + name='DimCheckMode', + full_name='caffe.ParamSpec.DimCheckMode', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='STRICT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PERMISSIVE', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2725, + serialized_end=2767, +) + +_LOSSPARAMETER_NORMALIZATIONMODE = _descriptor.EnumDescriptor( + name='NormalizationMode', + full_name='caffe.LossParameter.NormalizationMode', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='FULL', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='VALID', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BATCH_SIZE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NONE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=5542, + serialized_end=5608, +) + +_CONVOLUTIONPARAMETER_ENGINE = _descriptor.EnumDescriptor( + name='Engine', + full_name='caffe.ConvolutionParameter.Engine', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CAFFE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CUDNN', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6573, + serialized_end=6616, +) + +_DATAPARAMETER_DB = _descriptor.EnumDescriptor( + name='DB', + full_name='caffe.DataParameter.DB', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LEVELDB', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LMDB', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6934, + serialized_end=6961, +) + +_ELTWISEPARAMETER_ELTWISEOP = _descriptor.EnumDescriptor( + name='EltwiseOp', + full_name='caffe.EltwiseParameter.EltwiseOp', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='PROD', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SUM', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MAX', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=7301, + serialized_end=7340, +) + +_HINGELOSSPARAMETER_NORM = _descriptor.EnumDescriptor( + name='Norm', + full_name='caffe.HingeLossParameter.Norm', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='L1', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='L2', index=1, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=7875, + serialized_end=7897, +) + +_LRNPARAMETER_NORMREGION = _descriptor.EnumDescriptor( + name='NormRegion', + full_name='caffe.LRNParameter.NormRegion', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ACROSS_CHANNELS', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='WITHIN_CHANNEL', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=8764, + serialized_end=8817, +) + +_LRNPARAMETER_ENGINE = _descriptor.EnumDescriptor( + name='Engine', + full_name='caffe.LRNParameter.Engine', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CAFFE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CUDNN', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6573, + serialized_end=6616, +) + +_POOLINGPARAMETER_POOLMETHOD = _descriptor.EnumDescriptor( + name='PoolMethod', + full_name='caffe.PoolingParameter.PoolMethod', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='MAX', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='AVE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STOCHASTIC', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=9386, + serialized_end=9432, +) + +_POOLINGPARAMETER_ENGINE = _descriptor.EnumDescriptor( + name='Engine', + full_name='caffe.PoolingParameter.Engine', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CAFFE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CUDNN', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6573, + serialized_end=6616, +) + +_REDUCTIONPARAMETER_REDUCTIONOP = _descriptor.EnumDescriptor( + name='ReductionOp', + full_name='caffe.ReductionParameter.ReductionOp', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='SUM', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ASUM', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SUMSQ', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MEAN', index=3, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=9777, + serialized_end=9830, +) + +_RELUPARAMETER_ENGINE = _descriptor.EnumDescriptor( + name='Engine', + full_name='caffe.ReLUParameter.Engine', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CAFFE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CUDNN', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6573, + serialized_end=6616, +) + +_SIGMOIDPARAMETER_ENGINE = _descriptor.EnumDescriptor( + name='Engine', + full_name='caffe.SigmoidParameter.Engine', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CAFFE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CUDNN', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6573, + serialized_end=6616, +) + +_SOFTMAXPARAMETER_ENGINE = _descriptor.EnumDescriptor( + name='Engine', + full_name='caffe.SoftmaxParameter.Engine', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CAFFE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CUDNN', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6573, + serialized_end=6616, +) + +_TANHPARAMETER_ENGINE = _descriptor.EnumDescriptor( + name='Engine', + full_name='caffe.TanHParameter.Engine', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CAFFE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CUDNN', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6573, + serialized_end=6616, +) + +_SPPPARAMETER_POOLMETHOD = _descriptor.EnumDescriptor( + name='PoolMethod', + full_name='caffe.SPPParameter.PoolMethod', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='MAX', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='AVE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STOCHASTIC', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=9386, + serialized_end=9432, +) + +_SPPPARAMETER_ENGINE = _descriptor.EnumDescriptor( + name='Engine', + full_name='caffe.SPPParameter.Engine', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CAFFE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CUDNN', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6573, + serialized_end=6616, +) + +_V1LAYERPARAMETER_LAYERTYPE = _descriptor.EnumDescriptor( + name='LayerType', + full_name='caffe.V1LayerParameter.LayerType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='NONE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ABSVAL', index=1, number=35, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ACCURACY', index=2, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ARGMAX', index=3, number=30, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BNLL', index=4, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CONCAT', index=5, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CONTRASTIVE_LOSS', index=6, number=37, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CONVOLUTION', index=7, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DATA', index=8, number=5, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DECONVOLUTION', index=9, number=39, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DROPOUT', index=10, number=6, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DUMMY_DATA', index=11, number=32, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='EUCLIDEAN_LOSS', index=12, number=7, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ELTWISE', index=13, number=25, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='EXP', index=14, number=38, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='FLATTEN', index=15, number=8, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDF5_DATA', index=16, number=9, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDF5_OUTPUT', index=17, number=10, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HINGE_LOSS', index=18, number=28, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='IM2COL', index=19, number=11, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='IMAGE_DATA', index=20, number=12, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INFOGAIN_LOSS', index=21, number=13, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INNER_PRODUCT', index=22, number=14, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LRN', index=23, number=15, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MEMORY_DATA', index=24, number=29, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MULTINOMIAL_LOGISTIC_LOSS', index=25, number=16, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MVN', index=26, number=34, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='POOLING', index=27, number=17, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='POWER', index=28, number=26, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RELU', index=29, number=18, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SIGMOID', index=30, number=19, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SIGMOID_CROSS_ENTROPY_LOSS', index=31, number=27, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SILENCE', index=32, number=36, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SOFTMAX', index=33, number=20, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SOFTMAX_LOSS', index=34, number=21, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SPLIT', index=35, number=22, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SLICE', index=36, number=33, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TANH', index=37, number=23, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='WINDOW_DATA', index=38, number=24, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='THRESHOLD', index=39, number=31, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=13232, + serialized_end=13832, +) + +_V1LAYERPARAMETER_DIMCHECKMODE = _descriptor.EnumDescriptor( + name='DimCheckMode', + full_name='caffe.V1LayerParameter.DimCheckMode', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='STRICT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PERMISSIVE', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2725, + serialized_end=2767, +) + +_V0LAYERPARAMETER_POOLMETHOD = _descriptor.EnumDescriptor( + name='PoolMethod', + full_name='caffe.V0LayerParameter.PoolMethod', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='MAX', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='AVE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STOCHASTIC', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=9386, + serialized_end=9432, +) + + +_BLOBSHAPE = _descriptor.Descriptor( + name='BlobShape', + full_name='caffe.BlobShape', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='dim', full_name='caffe.BlobShape.dim', index=0, + number=1, type=3, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\020\001')), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=22, + serialized_end=50, +) + + +_BLOBPROTO = _descriptor.Descriptor( + name='BlobProto', + full_name='caffe.BlobProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='shape', full_name='caffe.BlobProto.shape', index=0, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='data', full_name='caffe.BlobProto.data', index=1, + number=5, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\020\001')), + _descriptor.FieldDescriptor( + name='diff', full_name='caffe.BlobProto.diff', index=2, + number=6, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\020\001')), + _descriptor.FieldDescriptor( + name='double_data', full_name='caffe.BlobProto.double_data', index=3, + number=8, type=1, cpp_type=5, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\020\001')), + _descriptor.FieldDescriptor( + name='double_diff', full_name='caffe.BlobProto.double_diff', index=4, + number=9, type=1, cpp_type=5, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\020\001')), + _descriptor.FieldDescriptor( + name='num', full_name='caffe.BlobProto.num', index=5, + number=1, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='channels', full_name='caffe.BlobProto.channels', index=6, + number=2, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='height', full_name='caffe.BlobProto.height', index=7, + number=3, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='width', full_name='caffe.BlobProto.width', index=8, + number=4, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=53, + serialized_end=257, +) + + +_BLOBPROTOVECTOR = _descriptor.Descriptor( + name='BlobProtoVector', + full_name='caffe.BlobProtoVector', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='blobs', full_name='caffe.BlobProtoVector.blobs', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=259, + serialized_end=309, +) + + +_DATUM = _descriptor.Descriptor( + name='Datum', + full_name='caffe.Datum', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='channels', full_name='caffe.Datum.channels', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='height', full_name='caffe.Datum.height', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='width', full_name='caffe.Datum.width', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='data', full_name='caffe.Datum.data', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='label', full_name='caffe.Datum.label', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='float_data', full_name='caffe.Datum.float_data', index=5, + number=6, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='encoded', full_name='caffe.Datum.encoded', index=6, + number=7, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=312, + serialized_end=441, +) + + +_FILLERPARAMETER = _descriptor.Descriptor( + name='FillerParameter', + full_name='caffe.FillerParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='type', full_name='caffe.FillerParameter.type', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("constant", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='caffe.FillerParameter.value', index=1, + number=2, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='min', full_name='caffe.FillerParameter.min', index=2, + number=3, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='max', full_name='caffe.FillerParameter.max', index=3, + number=4, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mean', full_name='caffe.FillerParameter.mean', index=4, + number=5, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='std', full_name='caffe.FillerParameter.std', index=5, + number=6, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='sparse', full_name='caffe.FillerParameter.sparse', index=6, + number=7, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=-1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='variance_norm', full_name='caffe.FillerParameter.variance_norm', index=7, + number=8, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _FILLERPARAMETER_VARIANCENORM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=444, + serialized_end=710, +) + + +_NETPARAMETER = _descriptor.Descriptor( + name='NetParameter', + full_name='caffe.NetParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='caffe.NetParameter.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='input', full_name='caffe.NetParameter.input', index=1, + number=3, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='input_shape', full_name='caffe.NetParameter.input_shape', index=2, + number=8, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='input_dim', full_name='caffe.NetParameter.input_dim', index=3, + number=4, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='force_backward', full_name='caffe.NetParameter.force_backward', index=4, + number=5, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='state', full_name='caffe.NetParameter.state', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='debug_info', full_name='caffe.NetParameter.debug_info', index=6, + number=7, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='layer', full_name='caffe.NetParameter.layer', index=7, + number=100, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='layers', full_name='caffe.NetParameter.layers', index=8, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=713, + serialized_end=983, +) + + +_SOLVERPARAMETER = _descriptor.Descriptor( + name='SolverParameter', + full_name='caffe.SolverParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='net', full_name='caffe.SolverParameter.net', index=0, + number=24, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='net_param', full_name='caffe.SolverParameter.net_param', index=1, + number=25, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='train_net', full_name='caffe.SolverParameter.train_net', index=2, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='test_net', full_name='caffe.SolverParameter.test_net', index=3, + number=2, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='train_net_param', full_name='caffe.SolverParameter.train_net_param', index=4, + number=21, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='test_net_param', full_name='caffe.SolverParameter.test_net_param', index=5, + number=22, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='train_state', full_name='caffe.SolverParameter.train_state', index=6, + number=26, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='test_state', full_name='caffe.SolverParameter.test_state', index=7, + number=27, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='test_iter', full_name='caffe.SolverParameter.test_iter', index=8, + number=3, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='test_interval', full_name='caffe.SolverParameter.test_interval', index=9, + number=4, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='test_compute_loss', full_name='caffe.SolverParameter.test_compute_loss', index=10, + number=19, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='test_initialization', full_name='caffe.SolverParameter.test_initialization', index=11, + number=32, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=True, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='base_lr', full_name='caffe.SolverParameter.base_lr', index=12, + number=5, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='display', full_name='caffe.SolverParameter.display', index=13, + number=6, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='average_loss', full_name='caffe.SolverParameter.average_loss', index=14, + number=33, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='max_iter', full_name='caffe.SolverParameter.max_iter', index=15, + number=7, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='iter_size', full_name='caffe.SolverParameter.iter_size', index=16, + number=36, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='lr_policy', full_name='caffe.SolverParameter.lr_policy', index=17, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='gamma', full_name='caffe.SolverParameter.gamma', index=18, + number=9, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='power', full_name='caffe.SolverParameter.power', index=19, + number=10, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='momentum', full_name='caffe.SolverParameter.momentum', index=20, + number=11, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='weight_decay', full_name='caffe.SolverParameter.weight_decay', index=21, + number=12, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='regularization_type', full_name='caffe.SolverParameter.regularization_type', index=22, + number=29, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("L2", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='stepsize', full_name='caffe.SolverParameter.stepsize', index=23, + number=13, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='stepvalue', full_name='caffe.SolverParameter.stepvalue', index=24, + number=34, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='clip_gradients', full_name='caffe.SolverParameter.clip_gradients', index=25, + number=35, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=-1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='snapshot', full_name='caffe.SolverParameter.snapshot', index=26, + number=14, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='snapshot_prefix', full_name='caffe.SolverParameter.snapshot_prefix', index=27, + number=15, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='snapshot_diff', full_name='caffe.SolverParameter.snapshot_diff', index=28, + number=16, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='snapshot_format', full_name='caffe.SolverParameter.snapshot_format', index=29, + number=37, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='solver_mode', full_name='caffe.SolverParameter.solver_mode', index=30, + number=17, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='device_id', full_name='caffe.SolverParameter.device_id', index=31, + number=18, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='random_seed', full_name='caffe.SolverParameter.random_seed', index=32, + number=20, type=3, cpp_type=2, label=1, + has_default_value=True, default_value=-1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type', full_name='caffe.SolverParameter.type', index=33, + number=40, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("SGD", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='delta', full_name='caffe.SolverParameter.delta', index=34, + number=31, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1e-08, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='momentum2', full_name='caffe.SolverParameter.momentum2', index=35, + number=39, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0.999, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='rms_decay', full_name='caffe.SolverParameter.rms_decay', index=36, + number=38, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='debug_info', full_name='caffe.SolverParameter.debug_info', index=37, + number=23, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='snapshot_after_train', full_name='caffe.SolverParameter.snapshot_after_train', index=38, + number=28, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=True, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='solver_type', full_name='caffe.SolverParameter.solver_type', index=39, + number=30, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SOLVERPARAMETER_SNAPSHOTFORMAT, + _SOLVERPARAMETER_SOLVERMODE, + _SOLVERPARAMETER_SOLVERTYPE, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=986, + serialized_end=2294, +) + + +_SOLVERSTATE = _descriptor.Descriptor( + name='SolverState', + full_name='caffe.SolverState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='iter', full_name='caffe.SolverState.iter', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='learned_net', full_name='caffe.SolverState.learned_net', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='history', full_name='caffe.SolverState.history', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='current_step', full_name='caffe.SolverState.current_step', index=3, + number=4, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=2296, + serialized_end=2404, +) + + +_NETSTATE = _descriptor.Descriptor( + name='NetState', + full_name='caffe.NetState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='phase', full_name='caffe.NetState.phase', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='level', full_name='caffe.NetState.level', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='stage', full_name='caffe.NetState.stage', index=2, + number=3, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=2406, + serialized_end=2484, +) + + +_NETSTATERULE = _descriptor.Descriptor( + name='NetStateRule', + full_name='caffe.NetStateRule', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='phase', full_name='caffe.NetStateRule.phase', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='min_level', full_name='caffe.NetStateRule.min_level', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='max_level', full_name='caffe.NetStateRule.max_level', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='stage', full_name='caffe.NetStateRule.stage', index=3, + number=4, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='not_stage', full_name='caffe.NetStateRule.not_stage', index=4, + number=5, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=2486, + serialized_end=2601, +) + + +_PARAMSPEC = _descriptor.Descriptor( + name='ParamSpec', + full_name='caffe.ParamSpec', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='caffe.ParamSpec.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='share_mode', full_name='caffe.ParamSpec.share_mode', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='lr_mult', full_name='caffe.ParamSpec.lr_mult', index=2, + number=3, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='decay_mult', full_name='caffe.ParamSpec.decay_mult', index=3, + number=4, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _PARAMSPEC_DIMCHECKMODE, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=2604, + serialized_end=2767, +) + + +_LAYERPARAMETER = _descriptor.Descriptor( + name='LayerParameter', + full_name='caffe.LayerParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='caffe.LayerParameter.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type', full_name='caffe.LayerParameter.type', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bottom', full_name='caffe.LayerParameter.bottom', index=2, + number=3, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='top', full_name='caffe.LayerParameter.top', index=3, + number=4, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='phase', full_name='caffe.LayerParameter.phase', index=4, + number=10, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='loss_weight', full_name='caffe.LayerParameter.loss_weight', index=5, + number=5, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='param', full_name='caffe.LayerParameter.param', index=6, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='blobs', full_name='caffe.LayerParameter.blobs', index=7, + number=7, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='propagate_down', full_name='caffe.LayerParameter.propagate_down', index=8, + number=11, type=8, cpp_type=7, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='include', full_name='caffe.LayerParameter.include', index=9, + number=8, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='exclude', full_name='caffe.LayerParameter.exclude', index=10, + number=9, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='transform_param', full_name='caffe.LayerParameter.transform_param', index=11, + number=100, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='loss_param', full_name='caffe.LayerParameter.loss_param', index=12, + number=101, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='accuracy_param', full_name='caffe.LayerParameter.accuracy_param', index=13, + number=102, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='argmax_param', full_name='caffe.LayerParameter.argmax_param', index=14, + number=103, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='batch_norm_param', full_name='caffe.LayerParameter.batch_norm_param', index=15, + number=139, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bias_param', full_name='caffe.LayerParameter.bias_param', index=16, + number=141, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='concat_param', full_name='caffe.LayerParameter.concat_param', index=17, + number=104, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='contrastive_loss_param', full_name='caffe.LayerParameter.contrastive_loss_param', index=18, + number=105, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='convolution_param', full_name='caffe.LayerParameter.convolution_param', index=19, + number=106, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crop_param', full_name='caffe.LayerParameter.crop_param', index=20, + number=144, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='data_param', full_name='caffe.LayerParameter.data_param', index=21, + number=107, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dropout_param', full_name='caffe.LayerParameter.dropout_param', index=22, + number=108, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy_data_param', full_name='caffe.LayerParameter.dummy_data_param', index=23, + number=109, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='eltwise_param', full_name='caffe.LayerParameter.eltwise_param', index=24, + number=110, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='elu_param', full_name='caffe.LayerParameter.elu_param', index=25, + number=140, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='embed_param', full_name='caffe.LayerParameter.embed_param', index=26, + number=137, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='exp_param', full_name='caffe.LayerParameter.exp_param', index=27, + number=111, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='flatten_param', full_name='caffe.LayerParameter.flatten_param', index=28, + number=135, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='hdf5_data_param', full_name='caffe.LayerParameter.hdf5_data_param', index=29, + number=112, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='hdf5_output_param', full_name='caffe.LayerParameter.hdf5_output_param', index=30, + number=113, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='hinge_loss_param', full_name='caffe.LayerParameter.hinge_loss_param', index=31, + number=114, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='image_data_param', full_name='caffe.LayerParameter.image_data_param', index=32, + number=115, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='infogain_loss_param', full_name='caffe.LayerParameter.infogain_loss_param', index=33, + number=116, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='inner_product_param', full_name='caffe.LayerParameter.inner_product_param', index=34, + number=117, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='input_param', full_name='caffe.LayerParameter.input_param', index=35, + number=143, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='log_param', full_name='caffe.LayerParameter.log_param', index=36, + number=134, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='lrn_param', full_name='caffe.LayerParameter.lrn_param', index=37, + number=118, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='memory_data_param', full_name='caffe.LayerParameter.memory_data_param', index=38, + number=119, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mvn_param', full_name='caffe.LayerParameter.mvn_param', index=39, + number=120, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pooling_param', full_name='caffe.LayerParameter.pooling_param', index=40, + number=121, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='power_param', full_name='caffe.LayerParameter.power_param', index=41, + number=122, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='prelu_param', full_name='caffe.LayerParameter.prelu_param', index=42, + number=131, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='python_param', full_name='caffe.LayerParameter.python_param', index=43, + number=130, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='reduction_param', full_name='caffe.LayerParameter.reduction_param', index=44, + number=136, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='relu_param', full_name='caffe.LayerParameter.relu_param', index=45, + number=123, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='reshape_param', full_name='caffe.LayerParameter.reshape_param', index=46, + number=133, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='scale_param', full_name='caffe.LayerParameter.scale_param', index=47, + number=142, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='sigmoid_param', full_name='caffe.LayerParameter.sigmoid_param', index=48, + number=124, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='softmax_param', full_name='caffe.LayerParameter.softmax_param', index=49, + number=125, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='spp_param', full_name='caffe.LayerParameter.spp_param', index=50, + number=132, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='slice_param', full_name='caffe.LayerParameter.slice_param', index=51, + number=126, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='tanh_param', full_name='caffe.LayerParameter.tanh_param', index=52, + number=127, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='threshold_param', full_name='caffe.LayerParameter.threshold_param', index=53, + number=128, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='tile_param', full_name='caffe.LayerParameter.tile_param', index=54, + number=138, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='window_data_param', full_name='caffe.LayerParameter.window_data_param', index=55, + number=129, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=2770, + serialized_end=5226, +) + + +_TRANSFORMATIONPARAMETER = _descriptor.Descriptor( + name='TransformationParameter', + full_name='caffe.TransformationParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='scale', full_name='caffe.TransformationParameter.scale', index=0, + number=1, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mirror', full_name='caffe.TransformationParameter.mirror', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crop_size', full_name='caffe.TransformationParameter.crop_size', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mean_file', full_name='caffe.TransformationParameter.mean_file', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mean_value', full_name='caffe.TransformationParameter.mean_value', index=4, + number=5, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='force_color', full_name='caffe.TransformationParameter.force_color', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='force_gray', full_name='caffe.TransformationParameter.force_gray', index=6, + number=7, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=5229, + serialized_end=5411, +) + + +_LOSSPARAMETER = _descriptor.Descriptor( + name='LossParameter', + full_name='caffe.LossParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ignore_label', full_name='caffe.LossParameter.ignore_label', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='normalization', full_name='caffe.LossParameter.normalization', index=1, + number=3, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='normalize', full_name='caffe.LossParameter.normalize', index=2, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LOSSPARAMETER_NORMALIZATIONMODE, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=5414, + serialized_end=5608, +) + + +_ACCURACYPARAMETER = _descriptor.Descriptor( + name='AccuracyParameter', + full_name='caffe.AccuracyParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='top_k', full_name='caffe.AccuracyParameter.top_k', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='axis', full_name='caffe.AccuracyParameter.axis', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ignore_label', full_name='caffe.AccuracyParameter.ignore_label', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=5610, + serialized_end=5686, +) + + +_ARGMAXPARAMETER = _descriptor.Descriptor( + name='ArgMaxParameter', + full_name='caffe.ArgMaxParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='out_max_val', full_name='caffe.ArgMaxParameter.out_max_val', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='top_k', full_name='caffe.ArgMaxParameter.top_k', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='axis', full_name='caffe.ArgMaxParameter.axis', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=5688, + serialized_end=5765, +) + + +_CONCATPARAMETER = _descriptor.Descriptor( + name='ConcatParameter', + full_name='caffe.ConcatParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='axis', full_name='caffe.ConcatParameter.axis', index=0, + number=2, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='concat_dim', full_name='caffe.ConcatParameter.concat_dim', index=1, + number=1, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=5767, + serialized_end=5824, +) + + +_BATCHNORMPARAMETER = _descriptor.Descriptor( + name='BatchNormParameter', + full_name='caffe.BatchNormParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='use_global_stats', full_name='caffe.BatchNormParameter.use_global_stats', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='moving_average_fraction', full_name='caffe.BatchNormParameter.moving_average_fraction', index=1, + number=2, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0.999, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='eps', full_name='caffe.BatchNormParameter.eps', index=2, + number=3, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1e-05, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=5826, + serialized_end=5932, +) + + +_BIASPARAMETER = _descriptor.Descriptor( + name='BiasParameter', + full_name='caffe.BiasParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='axis', full_name='caffe.BiasParameter.axis', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='num_axes', full_name='caffe.BiasParameter.num_axes', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='filler', full_name='caffe.BiasParameter.filler', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=5934, + serialized_end=6027, +) + + +_CONTRASTIVELOSSPARAMETER = _descriptor.Descriptor( + name='ContrastiveLossParameter', + full_name='caffe.ContrastiveLossParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='margin', full_name='caffe.ContrastiveLossParameter.margin', index=0, + number=1, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='legacy_version', full_name='caffe.ContrastiveLossParameter.legacy_version', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=6029, + serialized_end=6105, +) + + +_CONVOLUTIONPARAMETER = _descriptor.Descriptor( + name='ConvolutionParameter', + full_name='caffe.ConvolutionParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='num_output', full_name='caffe.ConvolutionParameter.num_output', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bias_term', full_name='caffe.ConvolutionParameter.bias_term', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=True, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pad', full_name='caffe.ConvolutionParameter.pad', index=2, + number=3, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='kernel_size', full_name='caffe.ConvolutionParameter.kernel_size', index=3, + number=4, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='stride', full_name='caffe.ConvolutionParameter.stride', index=4, + number=6, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dilation', full_name='caffe.ConvolutionParameter.dilation', index=5, + number=18, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pad_h', full_name='caffe.ConvolutionParameter.pad_h', index=6, + number=9, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pad_w', full_name='caffe.ConvolutionParameter.pad_w', index=7, + number=10, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='kernel_h', full_name='caffe.ConvolutionParameter.kernel_h', index=8, + number=11, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='kernel_w', full_name='caffe.ConvolutionParameter.kernel_w', index=9, + number=12, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='stride_h', full_name='caffe.ConvolutionParameter.stride_h', index=10, + number=13, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='stride_w', full_name='caffe.ConvolutionParameter.stride_w', index=11, + number=14, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='group', full_name='caffe.ConvolutionParameter.group', index=12, + number=5, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='weight_filler', full_name='caffe.ConvolutionParameter.weight_filler', index=13, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bias_filler', full_name='caffe.ConvolutionParameter.bias_filler', index=14, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='engine', full_name='caffe.ConvolutionParameter.engine', index=15, + number=15, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='axis', full_name='caffe.ConvolutionParameter.axis', index=16, + number=16, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='force_nd_im2col', full_name='caffe.ConvolutionParameter.force_nd_im2col', index=17, + number=17, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _CONVOLUTIONPARAMETER_ENGINE, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=6108, + serialized_end=6616, +) + + +_CROPPARAMETER = _descriptor.Descriptor( + name='CropParameter', + full_name='caffe.CropParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='axis', full_name='caffe.CropParameter.axis', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=2, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='offset', full_name='caffe.CropParameter.offset', index=1, + number=2, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=6618, + serialized_end=6666, +) + + +_DATAPARAMETER = _descriptor.Descriptor( + name='DataParameter', + full_name='caffe.DataParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='source', full_name='caffe.DataParameter.source', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='batch_size', full_name='caffe.DataParameter.batch_size', index=1, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='rand_skip', full_name='caffe.DataParameter.rand_skip', index=2, + number=7, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='backend', full_name='caffe.DataParameter.backend', index=3, + number=8, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='scale', full_name='caffe.DataParameter.scale', index=4, + number=2, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mean_file', full_name='caffe.DataParameter.mean_file', index=5, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crop_size', full_name='caffe.DataParameter.crop_size', index=6, + number=5, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mirror', full_name='caffe.DataParameter.mirror', index=7, + number=6, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='force_encoded_color', full_name='caffe.DataParameter.force_encoded_color', index=8, + number=9, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='prefetch', full_name='caffe.DataParameter.prefetch', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=4, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DATAPARAMETER_DB, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=6669, + serialized_end=6961, +) + + +_DROPOUTPARAMETER = _descriptor.Descriptor( + name='DropoutParameter', + full_name='caffe.DropoutParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='dropout_ratio', full_name='caffe.DropoutParameter.dropout_ratio', index=0, + number=1, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0.5, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=6963, + serialized_end=7009, +) + + +_DUMMYDATAPARAMETER = _descriptor.Descriptor( + name='DummyDataParameter', + full_name='caffe.DummyDataParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data_filler', full_name='caffe.DummyDataParameter.data_filler', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='shape', full_name='caffe.DummyDataParameter.shape', index=1, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='num', full_name='caffe.DummyDataParameter.num', index=2, + number=2, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='channels', full_name='caffe.DummyDataParameter.channels', index=3, + number=3, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='height', full_name='caffe.DummyDataParameter.height', index=4, + number=4, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='width', full_name='caffe.DummyDataParameter.width', index=5, + number=5, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=7012, + serialized_end=7172, +) + + +_ELTWISEPARAMETER = _descriptor.Descriptor( + name='EltwiseParameter', + full_name='caffe.EltwiseParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='operation', full_name='caffe.EltwiseParameter.operation', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='coeff', full_name='caffe.EltwiseParameter.coeff', index=1, + number=2, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='stable_prod_grad', full_name='caffe.EltwiseParameter.stable_prod_grad', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=True, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _ELTWISEPARAMETER_ELTWISEOP, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=7175, + serialized_end=7340, +) + + +_ELUPARAMETER = _descriptor.Descriptor( + name='ELUParameter', + full_name='caffe.ELUParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='alpha', full_name='caffe.ELUParameter.alpha', index=0, + number=1, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=7342, + serialized_end=7374, +) + + +_EMBEDPARAMETER = _descriptor.Descriptor( + name='EmbedParameter', + full_name='caffe.EmbedParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='num_output', full_name='caffe.EmbedParameter.num_output', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='input_dim', full_name='caffe.EmbedParameter.input_dim', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bias_term', full_name='caffe.EmbedParameter.bias_term', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=True, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='weight_filler', full_name='caffe.EmbedParameter.weight_filler', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bias_filler', full_name='caffe.EmbedParameter.bias_filler', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=7377, + serialized_end=7549, +) + + +_EXPPARAMETER = _descriptor.Descriptor( + name='ExpParameter', + full_name='caffe.ExpParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='base', full_name='caffe.ExpParameter.base', index=0, + number=1, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=-1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='scale', full_name='caffe.ExpParameter.scale', index=1, + number=2, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='shift', full_name='caffe.ExpParameter.shift', index=2, + number=3, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=7551, + serialized_end=7619, +) + + +_FLATTENPARAMETER = _descriptor.Descriptor( + name='FlattenParameter', + full_name='caffe.FlattenParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='axis', full_name='caffe.FlattenParameter.axis', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='end_axis', full_name='caffe.FlattenParameter.end_axis', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=-1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=7621, + serialized_end=7678, +) + + +_HDF5DATAPARAMETER = _descriptor.Descriptor( + name='HDF5DataParameter', + full_name='caffe.HDF5DataParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='source', full_name='caffe.HDF5DataParameter.source', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='batch_size', full_name='caffe.HDF5DataParameter.batch_size', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='shuffle', full_name='caffe.HDF5DataParameter.shuffle', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=7680, + serialized_end=7759, +) + + +_HDF5OUTPUTPARAMETER = _descriptor.Descriptor( + name='HDF5OutputParameter', + full_name='caffe.HDF5OutputParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='file_name', full_name='caffe.HDF5OutputParameter.file_name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=7761, + serialized_end=7801, +) + + +_HINGELOSSPARAMETER = _descriptor.Descriptor( + name='HingeLossParameter', + full_name='caffe.HingeLossParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='norm', full_name='caffe.HingeLossParameter.norm', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _HINGELOSSPARAMETER_NORM, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=7803, + serialized_end=7897, +) + + +_IMAGEDATAPARAMETER = _descriptor.Descriptor( + name='ImageDataParameter', + full_name='caffe.ImageDataParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='source', full_name='caffe.ImageDataParameter.source', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='batch_size', full_name='caffe.ImageDataParameter.batch_size', index=1, + number=4, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='rand_skip', full_name='caffe.ImageDataParameter.rand_skip', index=2, + number=7, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='shuffle', full_name='caffe.ImageDataParameter.shuffle', index=3, + number=8, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='new_height', full_name='caffe.ImageDataParameter.new_height', index=4, + number=9, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='new_width', full_name='caffe.ImageDataParameter.new_width', index=5, + number=10, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='is_color', full_name='caffe.ImageDataParameter.is_color', index=6, + number=11, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=True, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='scale', full_name='caffe.ImageDataParameter.scale', index=7, + number=2, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mean_file', full_name='caffe.ImageDataParameter.mean_file', index=8, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crop_size', full_name='caffe.ImageDataParameter.crop_size', index=9, + number=5, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mirror', full_name='caffe.ImageDataParameter.mirror', index=10, + number=6, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='root_folder', full_name='caffe.ImageDataParameter.root_folder', index=11, + number=12, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=7900, + serialized_end=8179, +) + + +_INFOGAINLOSSPARAMETER = _descriptor.Descriptor( + name='InfogainLossParameter', + full_name='caffe.InfogainLossParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='source', full_name='caffe.InfogainLossParameter.source', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=8181, + serialized_end=8220, +) + + +_INNERPRODUCTPARAMETER = _descriptor.Descriptor( + name='InnerProductParameter', + full_name='caffe.InnerProductParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='num_output', full_name='caffe.InnerProductParameter.num_output', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bias_term', full_name='caffe.InnerProductParameter.bias_term', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=True, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='weight_filler', full_name='caffe.InnerProductParameter.weight_filler', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bias_filler', full_name='caffe.InnerProductParameter.bias_filler', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='axis', full_name='caffe.InnerProductParameter.axis', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='transpose', full_name='caffe.InnerProductParameter.transpose', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=8223, + serialized_end=8426, +) + + +_INPUTPARAMETER = _descriptor.Descriptor( + name='InputParameter', + full_name='caffe.InputParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='shape', full_name='caffe.InputParameter.shape', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=8428, + serialized_end=8477, +) + + +_LOGPARAMETER = _descriptor.Descriptor( + name='LogParameter', + full_name='caffe.LogParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='base', full_name='caffe.LogParameter.base', index=0, + number=1, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=-1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='scale', full_name='caffe.LogParameter.scale', index=1, + number=2, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='shift', full_name='caffe.LogParameter.shift', index=2, + number=3, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=8479, + serialized_end=8547, +) + + +_LRNPARAMETER = _descriptor.Descriptor( + name='LRNParameter', + full_name='caffe.LRNParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='local_size', full_name='caffe.LRNParameter.local_size', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=5, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='alpha', full_name='caffe.LRNParameter.alpha', index=1, + number=2, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='beta', full_name='caffe.LRNParameter.beta', index=2, + number=3, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0.75, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='norm_region', full_name='caffe.LRNParameter.norm_region', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='k', full_name='caffe.LRNParameter.k', index=4, + number=5, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='engine', full_name='caffe.LRNParameter.engine', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LRNPARAMETER_NORMREGION, + _LRNPARAMETER_ENGINE, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=8550, + serialized_end=8862, +) + + +_MEMORYDATAPARAMETER = _descriptor.Descriptor( + name='MemoryDataParameter', + full_name='caffe.MemoryDataParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='batch_size', full_name='caffe.MemoryDataParameter.batch_size', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='channels', full_name='caffe.MemoryDataParameter.channels', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='height', full_name='caffe.MemoryDataParameter.height', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='width', full_name='caffe.MemoryDataParameter.width', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=8864, + serialized_end=8954, +) + + +_MVNPARAMETER = _descriptor.Descriptor( + name='MVNParameter', + full_name='caffe.MVNParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='normalize_variance', full_name='caffe.MVNParameter.normalize_variance', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=True, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='across_channels', full_name='caffe.MVNParameter.across_channels', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='eps', full_name='caffe.MVNParameter.eps', index=2, + number=3, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1e-09, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=8956, + serialized_end=9056, +) + + +_POOLINGPARAMETER = _descriptor.Descriptor( + name='PoolingParameter', + full_name='caffe.PoolingParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='pool', full_name='caffe.PoolingParameter.pool', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pad', full_name='caffe.PoolingParameter.pad', index=1, + number=4, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pad_h', full_name='caffe.PoolingParameter.pad_h', index=2, + number=9, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pad_w', full_name='caffe.PoolingParameter.pad_w', index=3, + number=10, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='kernel_size', full_name='caffe.PoolingParameter.kernel_size', index=4, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='kernel_h', full_name='caffe.PoolingParameter.kernel_h', index=5, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='kernel_w', full_name='caffe.PoolingParameter.kernel_w', index=6, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='stride', full_name='caffe.PoolingParameter.stride', index=7, + number=3, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='stride_h', full_name='caffe.PoolingParameter.stride_h', index=8, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='stride_w', full_name='caffe.PoolingParameter.stride_w', index=9, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='engine', full_name='caffe.PoolingParameter.engine', index=10, + number=11, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='global_pooling', full_name='caffe.PoolingParameter.global_pooling', index=11, + number=12, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _POOLINGPARAMETER_POOLMETHOD, + _POOLINGPARAMETER_ENGINE, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=9059, + serialized_end=9477, +) + + +_POWERPARAMETER = _descriptor.Descriptor( + name='PowerParameter', + full_name='caffe.PowerParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='power', full_name='caffe.PowerParameter.power', index=0, + number=1, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='scale', full_name='caffe.PowerParameter.scale', index=1, + number=2, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='shift', full_name='caffe.PowerParameter.shift', index=2, + number=3, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=9479, + serialized_end=9549, +) + + +_PYTHONPARAMETER = _descriptor.Descriptor( + name='PythonParameter', + full_name='caffe.PythonParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='module', full_name='caffe.PythonParameter.module', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='layer', full_name='caffe.PythonParameter.layer', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='param_str', full_name='caffe.PythonParameter.param_str', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='share_in_parallel', full_name='caffe.PythonParameter.share_in_parallel', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=9551, + serialized_end=9654, +) + + +_REDUCTIONPARAMETER = _descriptor.Descriptor( + name='ReductionParameter', + full_name='caffe.ReductionParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='operation', full_name='caffe.ReductionParameter.operation', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='axis', full_name='caffe.ReductionParameter.axis', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='coeff', full_name='caffe.ReductionParameter.coeff', index=2, + number=3, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _REDUCTIONPARAMETER_REDUCTIONOP, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=9657, + serialized_end=9830, +) + + +_RELUPARAMETER = _descriptor.Descriptor( + name='ReLUParameter', + full_name='caffe.ReLUParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='negative_slope', full_name='caffe.ReLUParameter.negative_slope', index=0, + number=1, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='engine', full_name='caffe.ReLUParameter.engine', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _RELUPARAMETER_ENGINE, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=9833, + serialized_end=9974, +) + + +_RESHAPEPARAMETER = _descriptor.Descriptor( + name='ReshapeParameter', + full_name='caffe.ReshapeParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='shape', full_name='caffe.ReshapeParameter.shape', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='axis', full_name='caffe.ReshapeParameter.axis', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='num_axes', full_name='caffe.ReshapeParameter.num_axes', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=-1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=9976, + serialized_end=10066, +) + + +_SCALEPARAMETER = _descriptor.Descriptor( + name='ScaleParameter', + full_name='caffe.ScaleParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='axis', full_name='caffe.ScaleParameter.axis', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='num_axes', full_name='caffe.ScaleParameter.num_axes', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='filler', full_name='caffe.ScaleParameter.filler', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bias_term', full_name='caffe.ScaleParameter.bias_term', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bias_filler', full_name='caffe.ScaleParameter.bias_filler', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=10069, + serialized_end=10234, +) + + +_SIGMOIDPARAMETER = _descriptor.Descriptor( + name='SigmoidParameter', + full_name='caffe.SigmoidParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='engine', full_name='caffe.SigmoidParameter.engine', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGMOIDPARAMETER_ENGINE, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=10236, + serialized_end=10356, +) + + +_SLICEPARAMETER = _descriptor.Descriptor( + name='SliceParameter', + full_name='caffe.SliceParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='axis', full_name='caffe.SliceParameter.axis', index=0, + number=3, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='slice_point', full_name='caffe.SliceParameter.slice_point', index=1, + number=2, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='slice_dim', full_name='caffe.SliceParameter.slice_dim', index=2, + number=1, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=10358, + serialized_end=10434, +) + + +_SOFTMAXPARAMETER = _descriptor.Descriptor( + name='SoftmaxParameter', + full_name='caffe.SoftmaxParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='engine', full_name='caffe.SoftmaxParameter.engine', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='axis', full_name='caffe.SoftmaxParameter.axis', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SOFTMAXPARAMETER_ENGINE, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=10437, + serialized_end=10574, +) + + +_TANHPARAMETER = _descriptor.Descriptor( + name='TanHParameter', + full_name='caffe.TanHParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='engine', full_name='caffe.TanHParameter.engine', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _TANHPARAMETER_ENGINE, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=10576, + serialized_end=10690, +) + + +_TILEPARAMETER = _descriptor.Descriptor( + name='TileParameter', + full_name='caffe.TileParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='axis', full_name='caffe.TileParameter.axis', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='tiles', full_name='caffe.TileParameter.tiles', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=10692, + serialized_end=10739, +) + + +_THRESHOLDPARAMETER = _descriptor.Descriptor( + name='ThresholdParameter', + full_name='caffe.ThresholdParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='threshold', full_name='caffe.ThresholdParameter.threshold', index=0, + number=1, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=10741, + serialized_end=10783, +) + + +_WINDOWDATAPARAMETER = _descriptor.Descriptor( + name='WindowDataParameter', + full_name='caffe.WindowDataParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='source', full_name='caffe.WindowDataParameter.source', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='scale', full_name='caffe.WindowDataParameter.scale', index=1, + number=2, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mean_file', full_name='caffe.WindowDataParameter.mean_file', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='batch_size', full_name='caffe.WindowDataParameter.batch_size', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crop_size', full_name='caffe.WindowDataParameter.crop_size', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mirror', full_name='caffe.WindowDataParameter.mirror', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='fg_threshold', full_name='caffe.WindowDataParameter.fg_threshold', index=6, + number=7, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0.5, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bg_threshold', full_name='caffe.WindowDataParameter.bg_threshold', index=7, + number=8, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0.5, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='fg_fraction', full_name='caffe.WindowDataParameter.fg_fraction', index=8, + number=9, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0.25, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='context_pad', full_name='caffe.WindowDataParameter.context_pad', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crop_mode', full_name='caffe.WindowDataParameter.crop_mode', index=10, + number=11, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("warp", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='cache_images', full_name='caffe.WindowDataParameter.cache_images', index=11, + number=12, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='root_folder', full_name='caffe.WindowDataParameter.root_folder', index=12, + number=13, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=10786, + serialized_end=11107, +) + + +_SPPPARAMETER = _descriptor.Descriptor( + name='SPPParameter', + full_name='caffe.SPPParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='pyramid_height', full_name='caffe.SPPParameter.pyramid_height', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pool', full_name='caffe.SPPParameter.pool', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='engine', full_name='caffe.SPPParameter.engine', index=2, + number=6, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SPPPARAMETER_POOLMETHOD, + _SPPPARAMETER_ENGINE, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=11110, + serialized_end=11345, +) + + +_V1LAYERPARAMETER = _descriptor.Descriptor( + name='V1LayerParameter', + full_name='caffe.V1LayerParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='bottom', full_name='caffe.V1LayerParameter.bottom', index=0, + number=2, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='top', full_name='caffe.V1LayerParameter.top', index=1, + number=3, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='name', full_name='caffe.V1LayerParameter.name', index=2, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='include', full_name='caffe.V1LayerParameter.include', index=3, + number=32, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='exclude', full_name='caffe.V1LayerParameter.exclude', index=4, + number=33, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type', full_name='caffe.V1LayerParameter.type', index=5, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='blobs', full_name='caffe.V1LayerParameter.blobs', index=6, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='param', full_name='caffe.V1LayerParameter.param', index=7, + number=1001, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='blob_share_mode', full_name='caffe.V1LayerParameter.blob_share_mode', index=8, + number=1002, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='blobs_lr', full_name='caffe.V1LayerParameter.blobs_lr', index=9, + number=7, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='weight_decay', full_name='caffe.V1LayerParameter.weight_decay', index=10, + number=8, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='loss_weight', full_name='caffe.V1LayerParameter.loss_weight', index=11, + number=35, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='accuracy_param', full_name='caffe.V1LayerParameter.accuracy_param', index=12, + number=27, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='argmax_param', full_name='caffe.V1LayerParameter.argmax_param', index=13, + number=23, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='concat_param', full_name='caffe.V1LayerParameter.concat_param', index=14, + number=9, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='contrastive_loss_param', full_name='caffe.V1LayerParameter.contrastive_loss_param', index=15, + number=40, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='convolution_param', full_name='caffe.V1LayerParameter.convolution_param', index=16, + number=10, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='data_param', full_name='caffe.V1LayerParameter.data_param', index=17, + number=11, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dropout_param', full_name='caffe.V1LayerParameter.dropout_param', index=18, + number=12, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dummy_data_param', full_name='caffe.V1LayerParameter.dummy_data_param', index=19, + number=26, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='eltwise_param', full_name='caffe.V1LayerParameter.eltwise_param', index=20, + number=24, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='exp_param', full_name='caffe.V1LayerParameter.exp_param', index=21, + number=41, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='hdf5_data_param', full_name='caffe.V1LayerParameter.hdf5_data_param', index=22, + number=13, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='hdf5_output_param', full_name='caffe.V1LayerParameter.hdf5_output_param', index=23, + number=14, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='hinge_loss_param', full_name='caffe.V1LayerParameter.hinge_loss_param', index=24, + number=29, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='image_data_param', full_name='caffe.V1LayerParameter.image_data_param', index=25, + number=15, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='infogain_loss_param', full_name='caffe.V1LayerParameter.infogain_loss_param', index=26, + number=16, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='inner_product_param', full_name='caffe.V1LayerParameter.inner_product_param', index=27, + number=17, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='lrn_param', full_name='caffe.V1LayerParameter.lrn_param', index=28, + number=18, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='memory_data_param', full_name='caffe.V1LayerParameter.memory_data_param', index=29, + number=22, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mvn_param', full_name='caffe.V1LayerParameter.mvn_param', index=30, + number=34, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pooling_param', full_name='caffe.V1LayerParameter.pooling_param', index=31, + number=19, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='power_param', full_name='caffe.V1LayerParameter.power_param', index=32, + number=21, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='relu_param', full_name='caffe.V1LayerParameter.relu_param', index=33, + number=30, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='sigmoid_param', full_name='caffe.V1LayerParameter.sigmoid_param', index=34, + number=38, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='softmax_param', full_name='caffe.V1LayerParameter.softmax_param', index=35, + number=39, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='slice_param', full_name='caffe.V1LayerParameter.slice_param', index=36, + number=31, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='tanh_param', full_name='caffe.V1LayerParameter.tanh_param', index=37, + number=37, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='threshold_param', full_name='caffe.V1LayerParameter.threshold_param', index=38, + number=25, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='window_data_param', full_name='caffe.V1LayerParameter.window_data_param', index=39, + number=20, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='transform_param', full_name='caffe.V1LayerParameter.transform_param', index=40, + number=36, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='loss_param', full_name='caffe.V1LayerParameter.loss_param', index=41, + number=42, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='layer', full_name='caffe.V1LayerParameter.layer', index=42, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _V1LAYERPARAMETER_LAYERTYPE, + _V1LAYERPARAMETER_DIMCHECKMODE, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=11348, + serialized_end=13876, +) + + +_V0LAYERPARAMETER = _descriptor.Descriptor( + name='V0LayerParameter', + full_name='caffe.V0LayerParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='caffe.V0LayerParameter.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type', full_name='caffe.V0LayerParameter.type', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='num_output', full_name='caffe.V0LayerParameter.num_output', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='biasterm', full_name='caffe.V0LayerParameter.biasterm', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=True, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='weight_filler', full_name='caffe.V0LayerParameter.weight_filler', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bias_filler', full_name='caffe.V0LayerParameter.bias_filler', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pad', full_name='caffe.V0LayerParameter.pad', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='kernelsize', full_name='caffe.V0LayerParameter.kernelsize', index=7, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='group', full_name='caffe.V0LayerParameter.group', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='stride', full_name='caffe.V0LayerParameter.stride', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pool', full_name='caffe.V0LayerParameter.pool', index=10, + number=11, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='dropout_ratio', full_name='caffe.V0LayerParameter.dropout_ratio', index=11, + number=12, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0.5, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='local_size', full_name='caffe.V0LayerParameter.local_size', index=12, + number=13, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=5, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='alpha', full_name='caffe.V0LayerParameter.alpha', index=13, + number=14, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='beta', full_name='caffe.V0LayerParameter.beta', index=14, + number=15, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0.75, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='k', full_name='caffe.V0LayerParameter.k', index=15, + number=22, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='source', full_name='caffe.V0LayerParameter.source', index=16, + number=16, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='scale', full_name='caffe.V0LayerParameter.scale', index=17, + number=17, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='meanfile', full_name='caffe.V0LayerParameter.meanfile', index=18, + number=18, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='batchsize', full_name='caffe.V0LayerParameter.batchsize', index=19, + number=19, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='cropsize', full_name='caffe.V0LayerParameter.cropsize', index=20, + number=20, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mirror', full_name='caffe.V0LayerParameter.mirror', index=21, + number=21, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='blobs', full_name='caffe.V0LayerParameter.blobs', index=22, + number=50, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='blobs_lr', full_name='caffe.V0LayerParameter.blobs_lr', index=23, + number=51, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='weight_decay', full_name='caffe.V0LayerParameter.weight_decay', index=24, + number=52, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='rand_skip', full_name='caffe.V0LayerParameter.rand_skip', index=25, + number=53, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='det_fg_threshold', full_name='caffe.V0LayerParameter.det_fg_threshold', index=26, + number=54, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0.5, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='det_bg_threshold', full_name='caffe.V0LayerParameter.det_bg_threshold', index=27, + number=55, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0.5, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='det_fg_fraction', full_name='caffe.V0LayerParameter.det_fg_fraction', index=28, + number=56, type=2, cpp_type=6, label=1, + has_default_value=True, default_value=0.25, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='det_context_pad', full_name='caffe.V0LayerParameter.det_context_pad', index=29, + number=58, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='det_crop_mode', full_name='caffe.V0LayerParameter.det_crop_mode', index=30, + number=59, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("warp", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='new_num', full_name='caffe.V0LayerParameter.new_num', index=31, + number=60, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='new_channels', full_name='caffe.V0LayerParameter.new_channels', index=32, + number=61, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='new_height', full_name='caffe.V0LayerParameter.new_height', index=33, + number=62, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='new_width', full_name='caffe.V0LayerParameter.new_width', index=34, + number=63, type=5, cpp_type=1, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='shuffle_images', full_name='caffe.V0LayerParameter.shuffle_images', index=35, + number=64, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='concat_dim', full_name='caffe.V0LayerParameter.concat_dim', index=36, + number=65, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='hdf5_output_param', full_name='caffe.V0LayerParameter.hdf5_output_param', index=37, + number=1001, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _V0LAYERPARAMETER_POOLMETHOD, + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=13879, + serialized_end=14900, +) + + +_PRELUPARAMETER = _descriptor.Descriptor( + name='PReLUParameter', + full_name='caffe.PReLUParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='filler', full_name='caffe.PReLUParameter.filler', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='channel_shared', full_name='caffe.PReLUParameter.channel_shared', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=14902, + serialized_end=14989, +) + +_BLOBPROTO.fields_by_name['shape'].message_type = _BLOBSHAPE +_BLOBPROTOVECTOR.fields_by_name['blobs'].message_type = _BLOBPROTO +_FILLERPARAMETER.fields_by_name['variance_norm'].enum_type = _FILLERPARAMETER_VARIANCENORM +_FILLERPARAMETER_VARIANCENORM.containing_type = _FILLERPARAMETER; +_NETPARAMETER.fields_by_name['input_shape'].message_type = _BLOBSHAPE +_NETPARAMETER.fields_by_name['state'].message_type = _NETSTATE +_NETPARAMETER.fields_by_name['layer'].message_type = _LAYERPARAMETER +_NETPARAMETER.fields_by_name['layers'].message_type = _V1LAYERPARAMETER +_SOLVERPARAMETER.fields_by_name['net_param'].message_type = _NETPARAMETER +_SOLVERPARAMETER.fields_by_name['train_net_param'].message_type = _NETPARAMETER +_SOLVERPARAMETER.fields_by_name['test_net_param'].message_type = _NETPARAMETER +_SOLVERPARAMETER.fields_by_name['train_state'].message_type = _NETSTATE +_SOLVERPARAMETER.fields_by_name['test_state'].message_type = _NETSTATE +_SOLVERPARAMETER.fields_by_name['snapshot_format'].enum_type = _SOLVERPARAMETER_SNAPSHOTFORMAT +_SOLVERPARAMETER.fields_by_name['solver_mode'].enum_type = _SOLVERPARAMETER_SOLVERMODE +_SOLVERPARAMETER.fields_by_name['solver_type'].enum_type = _SOLVERPARAMETER_SOLVERTYPE +_SOLVERPARAMETER_SNAPSHOTFORMAT.containing_type = _SOLVERPARAMETER; +_SOLVERPARAMETER_SOLVERMODE.containing_type = _SOLVERPARAMETER; +_SOLVERPARAMETER_SOLVERTYPE.containing_type = _SOLVERPARAMETER; +_SOLVERSTATE.fields_by_name['history'].message_type = _BLOBPROTO +_NETSTATE.fields_by_name['phase'].enum_type = _PHASE +_NETSTATERULE.fields_by_name['phase'].enum_type = _PHASE +_PARAMSPEC.fields_by_name['share_mode'].enum_type = _PARAMSPEC_DIMCHECKMODE +_PARAMSPEC_DIMCHECKMODE.containing_type = _PARAMSPEC; +_LAYERPARAMETER.fields_by_name['phase'].enum_type = _PHASE +_LAYERPARAMETER.fields_by_name['param'].message_type = _PARAMSPEC +_LAYERPARAMETER.fields_by_name['blobs'].message_type = _BLOBPROTO +_LAYERPARAMETER.fields_by_name['include'].message_type = _NETSTATERULE +_LAYERPARAMETER.fields_by_name['exclude'].message_type = _NETSTATERULE +_LAYERPARAMETER.fields_by_name['transform_param'].message_type = _TRANSFORMATIONPARAMETER +_LAYERPARAMETER.fields_by_name['loss_param'].message_type = _LOSSPARAMETER +_LAYERPARAMETER.fields_by_name['accuracy_param'].message_type = _ACCURACYPARAMETER +_LAYERPARAMETER.fields_by_name['argmax_param'].message_type = _ARGMAXPARAMETER +_LAYERPARAMETER.fields_by_name['batch_norm_param'].message_type = _BATCHNORMPARAMETER +_LAYERPARAMETER.fields_by_name['bias_param'].message_type = _BIASPARAMETER +_LAYERPARAMETER.fields_by_name['concat_param'].message_type = _CONCATPARAMETER +_LAYERPARAMETER.fields_by_name['contrastive_loss_param'].message_type = _CONTRASTIVELOSSPARAMETER +_LAYERPARAMETER.fields_by_name['convolution_param'].message_type = _CONVOLUTIONPARAMETER +_LAYERPARAMETER.fields_by_name['crop_param'].message_type = _CROPPARAMETER +_LAYERPARAMETER.fields_by_name['data_param'].message_type = _DATAPARAMETER +_LAYERPARAMETER.fields_by_name['dropout_param'].message_type = _DROPOUTPARAMETER +_LAYERPARAMETER.fields_by_name['dummy_data_param'].message_type = _DUMMYDATAPARAMETER +_LAYERPARAMETER.fields_by_name['eltwise_param'].message_type = _ELTWISEPARAMETER +_LAYERPARAMETER.fields_by_name['elu_param'].message_type = _ELUPARAMETER +_LAYERPARAMETER.fields_by_name['embed_param'].message_type = _EMBEDPARAMETER +_LAYERPARAMETER.fields_by_name['exp_param'].message_type = _EXPPARAMETER +_LAYERPARAMETER.fields_by_name['flatten_param'].message_type = _FLATTENPARAMETER +_LAYERPARAMETER.fields_by_name['hdf5_data_param'].message_type = _HDF5DATAPARAMETER +_LAYERPARAMETER.fields_by_name['hdf5_output_param'].message_type = _HDF5OUTPUTPARAMETER +_LAYERPARAMETER.fields_by_name['hinge_loss_param'].message_type = _HINGELOSSPARAMETER +_LAYERPARAMETER.fields_by_name['image_data_param'].message_type = _IMAGEDATAPARAMETER +_LAYERPARAMETER.fields_by_name['infogain_loss_param'].message_type = _INFOGAINLOSSPARAMETER +_LAYERPARAMETER.fields_by_name['inner_product_param'].message_type = _INNERPRODUCTPARAMETER +_LAYERPARAMETER.fields_by_name['input_param'].message_type = _INPUTPARAMETER +_LAYERPARAMETER.fields_by_name['log_param'].message_type = _LOGPARAMETER +_LAYERPARAMETER.fields_by_name['lrn_param'].message_type = _LRNPARAMETER +_LAYERPARAMETER.fields_by_name['memory_data_param'].message_type = _MEMORYDATAPARAMETER +_LAYERPARAMETER.fields_by_name['mvn_param'].message_type = _MVNPARAMETER +_LAYERPARAMETER.fields_by_name['pooling_param'].message_type = _POOLINGPARAMETER +_LAYERPARAMETER.fields_by_name['power_param'].message_type = _POWERPARAMETER +_LAYERPARAMETER.fields_by_name['prelu_param'].message_type = _PRELUPARAMETER +_LAYERPARAMETER.fields_by_name['python_param'].message_type = _PYTHONPARAMETER +_LAYERPARAMETER.fields_by_name['reduction_param'].message_type = _REDUCTIONPARAMETER +_LAYERPARAMETER.fields_by_name['relu_param'].message_type = _RELUPARAMETER +_LAYERPARAMETER.fields_by_name['reshape_param'].message_type = _RESHAPEPARAMETER +_LAYERPARAMETER.fields_by_name['scale_param'].message_type = _SCALEPARAMETER +_LAYERPARAMETER.fields_by_name['sigmoid_param'].message_type = _SIGMOIDPARAMETER +_LAYERPARAMETER.fields_by_name['softmax_param'].message_type = _SOFTMAXPARAMETER +_LAYERPARAMETER.fields_by_name['spp_param'].message_type = _SPPPARAMETER +_LAYERPARAMETER.fields_by_name['slice_param'].message_type = _SLICEPARAMETER +_LAYERPARAMETER.fields_by_name['tanh_param'].message_type = _TANHPARAMETER +_LAYERPARAMETER.fields_by_name['threshold_param'].message_type = _THRESHOLDPARAMETER +_LAYERPARAMETER.fields_by_name['tile_param'].message_type = _TILEPARAMETER +_LAYERPARAMETER.fields_by_name['window_data_param'].message_type = _WINDOWDATAPARAMETER +_LOSSPARAMETER.fields_by_name['normalization'].enum_type = _LOSSPARAMETER_NORMALIZATIONMODE +_LOSSPARAMETER_NORMALIZATIONMODE.containing_type = _LOSSPARAMETER; +_BIASPARAMETER.fields_by_name['filler'].message_type = _FILLERPARAMETER +_CONVOLUTIONPARAMETER.fields_by_name['weight_filler'].message_type = _FILLERPARAMETER +_CONVOLUTIONPARAMETER.fields_by_name['bias_filler'].message_type = _FILLERPARAMETER +_CONVOLUTIONPARAMETER.fields_by_name['engine'].enum_type = _CONVOLUTIONPARAMETER_ENGINE +_CONVOLUTIONPARAMETER_ENGINE.containing_type = _CONVOLUTIONPARAMETER; +_DATAPARAMETER.fields_by_name['backend'].enum_type = _DATAPARAMETER_DB +_DATAPARAMETER_DB.containing_type = _DATAPARAMETER; +_DUMMYDATAPARAMETER.fields_by_name['data_filler'].message_type = _FILLERPARAMETER +_DUMMYDATAPARAMETER.fields_by_name['shape'].message_type = _BLOBSHAPE +_ELTWISEPARAMETER.fields_by_name['operation'].enum_type = _ELTWISEPARAMETER_ELTWISEOP +_ELTWISEPARAMETER_ELTWISEOP.containing_type = _ELTWISEPARAMETER; +_EMBEDPARAMETER.fields_by_name['weight_filler'].message_type = _FILLERPARAMETER +_EMBEDPARAMETER.fields_by_name['bias_filler'].message_type = _FILLERPARAMETER +_HINGELOSSPARAMETER.fields_by_name['norm'].enum_type = _HINGELOSSPARAMETER_NORM +_HINGELOSSPARAMETER_NORM.containing_type = _HINGELOSSPARAMETER; +_INNERPRODUCTPARAMETER.fields_by_name['weight_filler'].message_type = _FILLERPARAMETER +_INNERPRODUCTPARAMETER.fields_by_name['bias_filler'].message_type = _FILLERPARAMETER +_INPUTPARAMETER.fields_by_name['shape'].message_type = _BLOBSHAPE +_LRNPARAMETER.fields_by_name['norm_region'].enum_type = _LRNPARAMETER_NORMREGION +_LRNPARAMETER.fields_by_name['engine'].enum_type = _LRNPARAMETER_ENGINE +_LRNPARAMETER_NORMREGION.containing_type = _LRNPARAMETER; +_LRNPARAMETER_ENGINE.containing_type = _LRNPARAMETER; +_POOLINGPARAMETER.fields_by_name['pool'].enum_type = _POOLINGPARAMETER_POOLMETHOD +_POOLINGPARAMETER.fields_by_name['engine'].enum_type = _POOLINGPARAMETER_ENGINE +_POOLINGPARAMETER_POOLMETHOD.containing_type = _POOLINGPARAMETER; +_POOLINGPARAMETER_ENGINE.containing_type = _POOLINGPARAMETER; +_REDUCTIONPARAMETER.fields_by_name['operation'].enum_type = _REDUCTIONPARAMETER_REDUCTIONOP +_REDUCTIONPARAMETER_REDUCTIONOP.containing_type = _REDUCTIONPARAMETER; +_RELUPARAMETER.fields_by_name['engine'].enum_type = _RELUPARAMETER_ENGINE +_RELUPARAMETER_ENGINE.containing_type = _RELUPARAMETER; +_RESHAPEPARAMETER.fields_by_name['shape'].message_type = _BLOBSHAPE +_SCALEPARAMETER.fields_by_name['filler'].message_type = _FILLERPARAMETER +_SCALEPARAMETER.fields_by_name['bias_filler'].message_type = _FILLERPARAMETER +_SIGMOIDPARAMETER.fields_by_name['engine'].enum_type = _SIGMOIDPARAMETER_ENGINE +_SIGMOIDPARAMETER_ENGINE.containing_type = _SIGMOIDPARAMETER; +_SOFTMAXPARAMETER.fields_by_name['engine'].enum_type = _SOFTMAXPARAMETER_ENGINE +_SOFTMAXPARAMETER_ENGINE.containing_type = _SOFTMAXPARAMETER; +_TANHPARAMETER.fields_by_name['engine'].enum_type = _TANHPARAMETER_ENGINE +_TANHPARAMETER_ENGINE.containing_type = _TANHPARAMETER; +_SPPPARAMETER.fields_by_name['pool'].enum_type = _SPPPARAMETER_POOLMETHOD +_SPPPARAMETER.fields_by_name['engine'].enum_type = _SPPPARAMETER_ENGINE +_SPPPARAMETER_POOLMETHOD.containing_type = _SPPPARAMETER; +_SPPPARAMETER_ENGINE.containing_type = _SPPPARAMETER; +_V1LAYERPARAMETER.fields_by_name['include'].message_type = _NETSTATERULE +_V1LAYERPARAMETER.fields_by_name['exclude'].message_type = _NETSTATERULE +_V1LAYERPARAMETER.fields_by_name['type'].enum_type = _V1LAYERPARAMETER_LAYERTYPE +_V1LAYERPARAMETER.fields_by_name['blobs'].message_type = _BLOBPROTO +_V1LAYERPARAMETER.fields_by_name['blob_share_mode'].enum_type = _V1LAYERPARAMETER_DIMCHECKMODE +_V1LAYERPARAMETER.fields_by_name['accuracy_param'].message_type = _ACCURACYPARAMETER +_V1LAYERPARAMETER.fields_by_name['argmax_param'].message_type = _ARGMAXPARAMETER +_V1LAYERPARAMETER.fields_by_name['concat_param'].message_type = _CONCATPARAMETER +_V1LAYERPARAMETER.fields_by_name['contrastive_loss_param'].message_type = _CONTRASTIVELOSSPARAMETER +_V1LAYERPARAMETER.fields_by_name['convolution_param'].message_type = _CONVOLUTIONPARAMETER +_V1LAYERPARAMETER.fields_by_name['data_param'].message_type = _DATAPARAMETER +_V1LAYERPARAMETER.fields_by_name['dropout_param'].message_type = _DROPOUTPARAMETER +_V1LAYERPARAMETER.fields_by_name['dummy_data_param'].message_type = _DUMMYDATAPARAMETER +_V1LAYERPARAMETER.fields_by_name['eltwise_param'].message_type = _ELTWISEPARAMETER +_V1LAYERPARAMETER.fields_by_name['exp_param'].message_type = _EXPPARAMETER +_V1LAYERPARAMETER.fields_by_name['hdf5_data_param'].message_type = _HDF5DATAPARAMETER +_V1LAYERPARAMETER.fields_by_name['hdf5_output_param'].message_type = _HDF5OUTPUTPARAMETER +_V1LAYERPARAMETER.fields_by_name['hinge_loss_param'].message_type = _HINGELOSSPARAMETER +_V1LAYERPARAMETER.fields_by_name['image_data_param'].message_type = _IMAGEDATAPARAMETER +_V1LAYERPARAMETER.fields_by_name['infogain_loss_param'].message_type = _INFOGAINLOSSPARAMETER +_V1LAYERPARAMETER.fields_by_name['inner_product_param'].message_type = _INNERPRODUCTPARAMETER +_V1LAYERPARAMETER.fields_by_name['lrn_param'].message_type = _LRNPARAMETER +_V1LAYERPARAMETER.fields_by_name['memory_data_param'].message_type = _MEMORYDATAPARAMETER +_V1LAYERPARAMETER.fields_by_name['mvn_param'].message_type = _MVNPARAMETER +_V1LAYERPARAMETER.fields_by_name['pooling_param'].message_type = _POOLINGPARAMETER +_V1LAYERPARAMETER.fields_by_name['power_param'].message_type = _POWERPARAMETER +_V1LAYERPARAMETER.fields_by_name['relu_param'].message_type = _RELUPARAMETER +_V1LAYERPARAMETER.fields_by_name['sigmoid_param'].message_type = _SIGMOIDPARAMETER +_V1LAYERPARAMETER.fields_by_name['softmax_param'].message_type = _SOFTMAXPARAMETER +_V1LAYERPARAMETER.fields_by_name['slice_param'].message_type = _SLICEPARAMETER +_V1LAYERPARAMETER.fields_by_name['tanh_param'].message_type = _TANHPARAMETER +_V1LAYERPARAMETER.fields_by_name['threshold_param'].message_type = _THRESHOLDPARAMETER +_V1LAYERPARAMETER.fields_by_name['window_data_param'].message_type = _WINDOWDATAPARAMETER +_V1LAYERPARAMETER.fields_by_name['transform_param'].message_type = _TRANSFORMATIONPARAMETER +_V1LAYERPARAMETER.fields_by_name['loss_param'].message_type = _LOSSPARAMETER +_V1LAYERPARAMETER.fields_by_name['layer'].message_type = _V0LAYERPARAMETER +_V1LAYERPARAMETER_LAYERTYPE.containing_type = _V1LAYERPARAMETER; +_V1LAYERPARAMETER_DIMCHECKMODE.containing_type = _V1LAYERPARAMETER; +_V0LAYERPARAMETER.fields_by_name['weight_filler'].message_type = _FILLERPARAMETER +_V0LAYERPARAMETER.fields_by_name['bias_filler'].message_type = _FILLERPARAMETER +_V0LAYERPARAMETER.fields_by_name['pool'].enum_type = _V0LAYERPARAMETER_POOLMETHOD +_V0LAYERPARAMETER.fields_by_name['blobs'].message_type = _BLOBPROTO +_V0LAYERPARAMETER.fields_by_name['hdf5_output_param'].message_type = _HDF5OUTPUTPARAMETER +_V0LAYERPARAMETER_POOLMETHOD.containing_type = _V0LAYERPARAMETER; +_PRELUPARAMETER.fields_by_name['filler'].message_type = _FILLERPARAMETER +DESCRIPTOR.message_types_by_name['BlobShape'] = _BLOBSHAPE +DESCRIPTOR.message_types_by_name['BlobProto'] = _BLOBPROTO +DESCRIPTOR.message_types_by_name['BlobProtoVector'] = _BLOBPROTOVECTOR +DESCRIPTOR.message_types_by_name['Datum'] = _DATUM +DESCRIPTOR.message_types_by_name['FillerParameter'] = _FILLERPARAMETER +DESCRIPTOR.message_types_by_name['NetParameter'] = _NETPARAMETER +DESCRIPTOR.message_types_by_name['SolverParameter'] = _SOLVERPARAMETER +DESCRIPTOR.message_types_by_name['SolverState'] = _SOLVERSTATE +DESCRIPTOR.message_types_by_name['NetState'] = _NETSTATE +DESCRIPTOR.message_types_by_name['NetStateRule'] = _NETSTATERULE +DESCRIPTOR.message_types_by_name['ParamSpec'] = _PARAMSPEC +DESCRIPTOR.message_types_by_name['LayerParameter'] = _LAYERPARAMETER +DESCRIPTOR.message_types_by_name['TransformationParameter'] = _TRANSFORMATIONPARAMETER +DESCRIPTOR.message_types_by_name['LossParameter'] = _LOSSPARAMETER +DESCRIPTOR.message_types_by_name['AccuracyParameter'] = _ACCURACYPARAMETER +DESCRIPTOR.message_types_by_name['ArgMaxParameter'] = _ARGMAXPARAMETER +DESCRIPTOR.message_types_by_name['ConcatParameter'] = _CONCATPARAMETER +DESCRIPTOR.message_types_by_name['BatchNormParameter'] = _BATCHNORMPARAMETER +DESCRIPTOR.message_types_by_name['BiasParameter'] = _BIASPARAMETER +DESCRIPTOR.message_types_by_name['ContrastiveLossParameter'] = _CONTRASTIVELOSSPARAMETER +DESCRIPTOR.message_types_by_name['ConvolutionParameter'] = _CONVOLUTIONPARAMETER +DESCRIPTOR.message_types_by_name['CropParameter'] = _CROPPARAMETER +DESCRIPTOR.message_types_by_name['DataParameter'] = _DATAPARAMETER +DESCRIPTOR.message_types_by_name['DropoutParameter'] = _DROPOUTPARAMETER +DESCRIPTOR.message_types_by_name['DummyDataParameter'] = _DUMMYDATAPARAMETER +DESCRIPTOR.message_types_by_name['EltwiseParameter'] = _ELTWISEPARAMETER +DESCRIPTOR.message_types_by_name['ELUParameter'] = _ELUPARAMETER +DESCRIPTOR.message_types_by_name['EmbedParameter'] = _EMBEDPARAMETER +DESCRIPTOR.message_types_by_name['ExpParameter'] = _EXPPARAMETER +DESCRIPTOR.message_types_by_name['FlattenParameter'] = _FLATTENPARAMETER +DESCRIPTOR.message_types_by_name['HDF5DataParameter'] = _HDF5DATAPARAMETER +DESCRIPTOR.message_types_by_name['HDF5OutputParameter'] = _HDF5OUTPUTPARAMETER +DESCRIPTOR.message_types_by_name['HingeLossParameter'] = _HINGELOSSPARAMETER +DESCRIPTOR.message_types_by_name['ImageDataParameter'] = _IMAGEDATAPARAMETER +DESCRIPTOR.message_types_by_name['InfogainLossParameter'] = _INFOGAINLOSSPARAMETER +DESCRIPTOR.message_types_by_name['InnerProductParameter'] = _INNERPRODUCTPARAMETER +DESCRIPTOR.message_types_by_name['InputParameter'] = _INPUTPARAMETER +DESCRIPTOR.message_types_by_name['LogParameter'] = _LOGPARAMETER +DESCRIPTOR.message_types_by_name['LRNParameter'] = _LRNPARAMETER +DESCRIPTOR.message_types_by_name['MemoryDataParameter'] = _MEMORYDATAPARAMETER +DESCRIPTOR.message_types_by_name['MVNParameter'] = _MVNPARAMETER +DESCRIPTOR.message_types_by_name['PoolingParameter'] = _POOLINGPARAMETER +DESCRIPTOR.message_types_by_name['PowerParameter'] = _POWERPARAMETER +DESCRIPTOR.message_types_by_name['PythonParameter'] = _PYTHONPARAMETER +DESCRIPTOR.message_types_by_name['ReductionParameter'] = _REDUCTIONPARAMETER +DESCRIPTOR.message_types_by_name['ReLUParameter'] = _RELUPARAMETER +DESCRIPTOR.message_types_by_name['ReshapeParameter'] = _RESHAPEPARAMETER +DESCRIPTOR.message_types_by_name['ScaleParameter'] = _SCALEPARAMETER +DESCRIPTOR.message_types_by_name['SigmoidParameter'] = _SIGMOIDPARAMETER +DESCRIPTOR.message_types_by_name['SliceParameter'] = _SLICEPARAMETER +DESCRIPTOR.message_types_by_name['SoftmaxParameter'] = _SOFTMAXPARAMETER +DESCRIPTOR.message_types_by_name['TanHParameter'] = _TANHPARAMETER +DESCRIPTOR.message_types_by_name['TileParameter'] = _TILEPARAMETER +DESCRIPTOR.message_types_by_name['ThresholdParameter'] = _THRESHOLDPARAMETER +DESCRIPTOR.message_types_by_name['WindowDataParameter'] = _WINDOWDATAPARAMETER +DESCRIPTOR.message_types_by_name['SPPParameter'] = _SPPPARAMETER +DESCRIPTOR.message_types_by_name['V1LayerParameter'] = _V1LAYERPARAMETER +DESCRIPTOR.message_types_by_name['V0LayerParameter'] = _V0LAYERPARAMETER +DESCRIPTOR.message_types_by_name['PReLUParameter'] = _PRELUPARAMETER + +class BlobShape(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _BLOBSHAPE + + # @@protoc_insertion_point(class_scope:caffe.BlobShape) + +class BlobProto(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _BLOBPROTO + + # @@protoc_insertion_point(class_scope:caffe.BlobProto) + +class BlobProtoVector(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _BLOBPROTOVECTOR + + # @@protoc_insertion_point(class_scope:caffe.BlobProtoVector) + +class Datum(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DATUM + + # @@protoc_insertion_point(class_scope:caffe.Datum) + +class FillerParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _FILLERPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.FillerParameter) + +class NetParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _NETPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.NetParameter) + +class SolverParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SOLVERPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.SolverParameter) + +class SolverState(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SOLVERSTATE + + # @@protoc_insertion_point(class_scope:caffe.SolverState) + +class NetState(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _NETSTATE + + # @@protoc_insertion_point(class_scope:caffe.NetState) + +class NetStateRule(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _NETSTATERULE + + # @@protoc_insertion_point(class_scope:caffe.NetStateRule) + +class ParamSpec(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _PARAMSPEC + + # @@protoc_insertion_point(class_scope:caffe.ParamSpec) + +class LayerParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _LAYERPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.LayerParameter) + +class TransformationParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _TRANSFORMATIONPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.TransformationParameter) + +class LossParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _LOSSPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.LossParameter) + +class AccuracyParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _ACCURACYPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.AccuracyParameter) + +class ArgMaxParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _ARGMAXPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.ArgMaxParameter) + +class ConcatParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _CONCATPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.ConcatParameter) + +class BatchNormParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _BATCHNORMPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.BatchNormParameter) + +class BiasParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _BIASPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.BiasParameter) + +class ContrastiveLossParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _CONTRASTIVELOSSPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.ContrastiveLossParameter) + +class ConvolutionParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _CONVOLUTIONPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.ConvolutionParameter) + +class CropParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _CROPPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.CropParameter) + +class DataParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DATAPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.DataParameter) + +class DropoutParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DROPOUTPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.DropoutParameter) + +class DummyDataParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DUMMYDATAPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.DummyDataParameter) + +class EltwiseParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _ELTWISEPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.EltwiseParameter) + +class ELUParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _ELUPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.ELUParameter) + +class EmbedParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _EMBEDPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.EmbedParameter) + +class ExpParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _EXPPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.ExpParameter) + +class FlattenParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _FLATTENPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.FlattenParameter) + +class HDF5DataParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _HDF5DATAPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.HDF5DataParameter) + +class HDF5OutputParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _HDF5OUTPUTPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.HDF5OutputParameter) + +class HingeLossParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _HINGELOSSPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.HingeLossParameter) + +class ImageDataParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _IMAGEDATAPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.ImageDataParameter) + +class InfogainLossParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _INFOGAINLOSSPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.InfogainLossParameter) + +class InnerProductParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _INNERPRODUCTPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.InnerProductParameter) + +class InputParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _INPUTPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.InputParameter) + +class LogParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _LOGPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.LogParameter) + +class LRNParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _LRNPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.LRNParameter) + +class MemoryDataParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _MEMORYDATAPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.MemoryDataParameter) + +class MVNParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _MVNPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.MVNParameter) + +class PoolingParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _POOLINGPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.PoolingParameter) + +class PowerParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _POWERPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.PowerParameter) + +class PythonParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _PYTHONPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.PythonParameter) + +class ReductionParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _REDUCTIONPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.ReductionParameter) + +class ReLUParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _RELUPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.ReLUParameter) + +class ReshapeParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _RESHAPEPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.ReshapeParameter) + +class ScaleParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SCALEPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.ScaleParameter) + +class SigmoidParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SIGMOIDPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.SigmoidParameter) + +class SliceParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SLICEPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.SliceParameter) + +class SoftmaxParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SOFTMAXPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.SoftmaxParameter) + +class TanHParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _TANHPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.TanHParameter) + +class TileParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _TILEPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.TileParameter) + +class ThresholdParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _THRESHOLDPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.ThresholdParameter) + +class WindowDataParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _WINDOWDATAPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.WindowDataParameter) + +class SPPParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SPPPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.SPPParameter) + +class V1LayerParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _V1LAYERPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.V1LayerParameter) + +class V0LayerParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _V0LAYERPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.V0LayerParameter) + +class PReLUParameter(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _PRELUPARAMETER + + # @@protoc_insertion_point(class_scope:caffe.PReLUParameter) + + +_BLOBSHAPE.fields_by_name['dim'].has_options = True +_BLOBSHAPE.fields_by_name['dim']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\020\001') +_BLOBPROTO.fields_by_name['data'].has_options = True +_BLOBPROTO.fields_by_name['data']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\020\001') +_BLOBPROTO.fields_by_name['diff'].has_options = True +_BLOBPROTO.fields_by_name['diff']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\020\001') +_BLOBPROTO.fields_by_name['double_data'].has_options = True +_BLOBPROTO.fields_by_name['double_data']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\020\001') +_BLOBPROTO.fields_by_name['double_diff'].has_options = True +_BLOBPROTO.fields_by_name['double_diff']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\020\001') +# @@protoc_insertion_point(module_scope) diff --git a/kaffe/caffe/resolver.py b/kaffe/caffe/resolver.py index b9580a7..6ba9304 100644 --- a/kaffe/caffe/resolver.py +++ b/kaffe/caffe/resolver.py @@ -1,48 +1,48 @@ -import sys - -SHARED_CAFFE_RESOLVER = None - -class CaffeResolver(object): - def __init__(self): - self.import_caffe() - - def import_caffe(self): - self.caffe = None - try: - # Try to import PyCaffe first - import caffe - self.caffe = caffe - except ImportError: - # Fall back to the protobuf implementation - from . import caffepb - self.caffepb = caffepb - show_fallback_warning() - if self.caffe: - # Use the protobuf code from the imported distribution. - # This way, Caffe variants with custom layers will work. - self.caffepb = self.caffe.proto.caffe_pb2 - self.NetParameter = self.caffepb.NetParameter - - def has_pycaffe(self): - return self.caffe is not None - -def get_caffe_resolver(): - global SHARED_CAFFE_RESOLVER - if SHARED_CAFFE_RESOLVER is None: - SHARED_CAFFE_RESOLVER = CaffeResolver() - return SHARED_CAFFE_RESOLVER - -def has_pycaffe(): - return get_caffe_resolver().has_pycaffe() - -def show_fallback_warning(): - msg = ''' ------------------------------------------------------------- - WARNING: PyCaffe not found! - Falling back to a pure protocol buffer implementation. - * Conversions will be drastically slower. - * This backend is UNTESTED! ------------------------------------------------------------- - -''' - sys.stderr.write(msg) +import sys + +SHARED_CAFFE_RESOLVER = None + +class CaffeResolver(object): + def __init__(self): + self.import_caffe() + + def import_caffe(self): + self.caffe = None + try: + # Try to import PyCaffe first + import caffe + self.caffe = caffe + except ImportError: + # Fall back to the protobuf implementation + from . import caffe_pb2 + self.caffepb = caffe_pb2 + show_fallback_warning() + if self.caffe: + # Use the protobuf code from the imported distribution. + # This way, Caffe variants with custom layers will work. + self.caffepb = self.caffe.proto.caffe_pb2 + self.NetParameter = self.caffepb.NetParameter + + def has_pycaffe(self): + return self.caffe is not None + +def get_caffe_resolver(): + global SHARED_CAFFE_RESOLVER + if SHARED_CAFFE_RESOLVER is None: + SHARED_CAFFE_RESOLVER = CaffeResolver() + return SHARED_CAFFE_RESOLVER + +def has_pycaffe(): + return get_caffe_resolver().has_pycaffe() + +def show_fallback_warning(): + msg = ''' +------------------------------------------------------------ + WARNING: PyCaffe not found! + Falling back to a pure protocol buffer implementation. + * Conversions will be drastically slower. + * This backend is UNTESTED! +------------------------------------------------------------ + +''' + sys.stderr.write(msg) diff --git a/kaffe/errors.py b/kaffe/errors.py index f703a44..432949b 100644 --- a/kaffe/errors.py +++ b/kaffe/errors.py @@ -1,7 +1,7 @@ -import sys - -class KaffeError(Exception): - pass - -def print_stderr(msg): - sys.stderr.write('%s\n' % msg) +import sys + +class KaffeError(Exception): + pass + +def print_stderr(msg): + sys.stderr.write('%s\n' % msg) diff --git a/kaffe/graph.py b/kaffe/graph.py index bec2b3a..bf6eb40 100644 --- a/kaffe/graph.py +++ b/kaffe/graph.py @@ -1,302 +1,303 @@ -from google.protobuf import text_format - -from .caffe import get_caffe_resolver -from .errors import KaffeError, print_stderr -from .layers import LayerAdapter, LayerType, NodeKind, NodeDispatch -from .shapes import TensorShape - -class Node(object): - - def __init__(self, name, kind, layer=None): - self.name = name - self.kind = kind - self.layer = LayerAdapter(layer, kind) if layer else None - self.parents = [] - self.children = [] - self.data = None - self.output_shape = None - self.metadata = {} - - def add_parent(self, parent_node): - assert parent_node not in self.parents - self.parents.append(parent_node) - if self not in parent_node.children: - parent_node.children.append(self) - - def add_child(self, child_node): - assert child_node not in self.children - self.children.append(child_node) - if self not in child_node.parents: - child_node.parents.append(self) - - def get_only_parent(self): - if len(self.parents) != 1: - raise KaffeError('Node (%s) expected to have 1 parent. Found %s.' % - (self, len(self.parents))) - return self.parents[0] - - @property - def parameters(self): - if self.layer is not None: - return self.layer.parameters - return None - - def __str__(self): - return '[%s] %s' % (self.kind, self.name) - - def __repr__(self): - return '%s (0x%x)' % (self.name, id(self)) - - -class Graph(object): - - def __init__(self, nodes=None, name=None): - self.nodes = nodes or [] - self.node_lut = {node.name: node for node in self.nodes} - self.name = name - - def add_node(self, node): - self.nodes.append(node) - self.node_lut[node.name] = node - - def get_node(self, name): - try: - return self.node_lut[name] - except KeyError: - raise KaffeError('Layer not found: %s' % name) - - def get_input_nodes(self): - return [node for node in self.nodes if len(node.parents) == 0] - - def get_output_nodes(self): - return [node for node in self.nodes if len(node.children) == 0] - - def topologically_sorted(self): - sorted_nodes = [] - unsorted_nodes = list(self.nodes) - temp_marked = set() - perm_marked = set() - - def visit(node): - if node in temp_marked: - raise KaffeError('Graph is not a DAG.') - if node in perm_marked: - return - temp_marked.add(node) - for child in node.children: - visit(child) - perm_marked.add(node) - temp_marked.remove(node) - sorted_nodes.insert(0, node) - - while len(unsorted_nodes): - visit(unsorted_nodes.pop()) - return sorted_nodes - - def compute_output_shapes(self): - sorted_nodes = self.topologically_sorted() - for node in sorted_nodes: - node.output_shape = TensorShape(*NodeKind.compute_output_shape(node)) - - def replaced(self, new_nodes): - return Graph(nodes=new_nodes, name=self.name) - - def transformed(self, transformers): - graph = self - for transformer in transformers: - graph = transformer(graph) - if graph is None: - raise KaffeError('Transformer failed: {}'.format(transformer)) - assert isinstance(graph, Graph) - return graph - - def __contains__(self, key): - return key in self.node_lut - - def __str__(self): - hdr = '{:<20} {:<30} {:>20} {:>20}'.format('Type', 'Name', 'Param', 'Output') - s = [hdr, '-' * 94] - for node in self.topologically_sorted(): - # If the node has learned parameters, display the first one's shape. - # In case of convolutions, this corresponds to the weights. - data_shape = node.data[0].shape if node.data else '--' - out_shape = node.output_shape or '--' - s.append('{:<20} {:<30} {:>20} {:>20}'.format(node.kind, node.name, data_shape, - tuple(out_shape))) - return '\n'.join(s) - - -class GraphBuilder(object): - '''Constructs a model graph from a Caffe protocol buffer definition.''' - - def __init__(self, def_path, phase='test'): - ''' - def_path: Path to the model definition (.prototxt) - data_path: Path to the model data (.caffemodel) - phase: Either 'test' or 'train'. Used for filtering phase-specific nodes. - ''' - self.def_path = def_path - self.phase = phase - self.load() - - def load(self): - '''Load the layer definitions from the prototxt.''' - self.params = get_caffe_resolver().NetParameter() - with open(self.def_path, 'rb') as def_file: - text_format.Merge(def_file.read(), self.params) - - def filter_layers(self, layers): - '''Filter out layers based on the current phase.''' - phase_map = {0: 'train', 1: 'test'} - filtered_layer_names = set() - filtered_layers = [] - for layer in layers: - phase = self.phase - if len(layer.include): - phase = phase_map[layer.include[0].phase] - if len(layer.exclude): - phase = phase_map[1 - layer.include[0].phase] - exclude = (phase != self.phase) - # Dropout layers appear in a fair number of Caffe - # test-time networks. These are just ignored. We'll - # filter them out here. - if (not exclude) and (phase == 'test'): - exclude = (layer.type == LayerType.Dropout) - if not exclude: - filtered_layers.append(layer) - # Guard against dupes. - assert layer.name not in filtered_layer_names - filtered_layer_names.add(layer.name) - return filtered_layers - - def make_node(self, layer): - '''Create a graph node for the given layer.''' - kind = NodeKind.map_raw_kind(layer.type) - if kind is None: - raise KaffeError('Unknown layer type encountered: %s' % layer.type) - # We want to use the layer's top names (the "output" names), rather than the - # name attribute, which is more of readability thing than a functional one. - # Other layers will refer to a node by its "top name". - return Node(layer.name, kind, layer=layer) - - def make_input_nodes(self): - ''' - Create data input nodes. - - This method is for old-style inputs, where the input specification - was not treated as a first-class layer in the prototext. - Newer models use the "Input layer" type. - ''' - nodes = [Node(name, NodeKind.Data) for name in self.params.input] - if len(nodes): - input_dim = map(int, self.params.input_dim) - if not input_dim: - if len(self.params.input_shape) > 0: - input_dim = map(int, self.params.input_shape[0].dim) - else: - raise KaffeError('Dimensions for input not specified.') - for node in nodes: - node.output_shape = tuple(input_dim) - return nodes - - def build(self): - ''' - Builds the graph from the Caffe layer definitions. - ''' - # Get the layers - layers = self.params.layers or self.params.layer - # Filter out phase-excluded layers - layers = self.filter_layers(layers) - # Get any separately-specified input layers - nodes = self.make_input_nodes() - nodes += [self.make_node(layer) for layer in layers] - # Initialize the graph - graph = Graph(nodes=nodes, name=self.params.name) - # Connect the nodes - # - # A note on layers and outputs: - # In Caffe, each layer can produce multiple outputs ("tops") from a set of inputs - # ("bottoms"). The bottoms refer to other layers' tops. The top can rewrite a bottom - # (in case of in-place operations). Note that the layer's name is not used for establishing - # any connectivity. It's only used for data association. By convention, a layer with a - # single top will often use the same name (although this is not required). - # - # The current implementation only supports single-output nodes (note that a node can still - # have multiple children, since multiple child nodes can refer to the single top's name). - node_outputs = {} - for layer in layers: - node = graph.get_node(layer.name) - for input_name in layer.bottom: - assert input_name != layer.name - parent_node = node_outputs.get(input_name) - if (parent_node is None) or (parent_node == node): - parent_node = graph.get_node(input_name) - node.add_parent(parent_node) - if len(layer.top)>1: - raise KaffeError('Multiple top nodes are not supported.') - for output_name in layer.top: - if output_name == layer.name: - # Output is named the same as the node. No further action required. - continue - # There are two possibilities here: - # - # Case 1: output_name refers to another node in the graph. - # This is an "in-place operation" that overwrites an existing node. - # This would create a cycle in the graph. We'll undo the in-placing - # by substituting this node wherever the overwritten node is referenced. - # - # Case 2: output_name violates the convention layer.name == output_name. - # Since we are working in the single-output regime, we will can rename it to - # match the layer name. - # - # For both cases, future references to this top re-routes to this node. - node_outputs[output_name] = node - - graph.compute_output_shapes() - return graph - - -class NodeMapper(NodeDispatch): - - def __init__(self, graph): - self.graph = graph - - def map(self): - nodes = self.graph.topologically_sorted() - # Remove input nodes - we'll handle them separately. - input_nodes = self.graph.get_input_nodes() - nodes = [t for t in nodes if t not in input_nodes] - # Decompose DAG into chains. - chains = [] - for node in nodes: - attach_to_chain = None - if len(node.parents) == 1: - parent = node.get_only_parent() - for chain in chains: - if chain[-1] == parent: - # Node is part of an existing chain. - attach_to_chain = chain - break - if attach_to_chain is None: - # Start a new chain for this node. - attach_to_chain = [] - chains.append(attach_to_chain) - attach_to_chain.append(node) - # Map each chain. - mapped_chains = [] - for chain in chains: - mapped_chains.append(self.map_chain(chain)) - return self.commit(mapped_chains) - - def map_chain(self, chain): - return [self.map_node(node) for node in chain] - - def map_node(self, node): - map_func = self.get_handler(node.kind, 'map') - mapped_node = map_func(node) - assert mapped_node is not None - mapped_node.node = node - return mapped_node - - def commit(self, mapped_chains): - raise NotImplementedError('Must be implemented by subclass.') +from google.protobuf import text_format + +from .caffe import get_caffe_resolver +from .errors import KaffeError, print_stderr +from .layers import LayerAdapter, LayerType, NodeKind, NodeDispatch +from .shapes import TensorShape + +class Node(object): + + def __init__(self, name, kind, layer=None): + self.name = name + self.kind = kind + self.layer = LayerAdapter(layer, kind) if layer else None + self.parents = [] + self.children = [] + self.data = None + self.output_shape = None + self.metadata = {} + + def add_parent(self, parent_node): + assert parent_node not in self.parents + self.parents.append(parent_node) + if self not in parent_node.children: + parent_node.children.append(self) + + def add_child(self, child_node): + assert child_node not in self.children + self.children.append(child_node) + if self not in child_node.parents: + child_node.parents.append(self) + + def get_only_parent(self): + if len(self.parents) != 1: + raise KaffeError('Node (%s) expected to have 1 parent. Found %s.' % + (self, len(self.parents))) + return self.parents[0] + + @property + def parameters(self): + if self.layer is not None: + return self.layer.parameters + return None + + def __str__(self): + return '[%s] %s' % (self.kind, self.name) + + def __repr__(self): + return '%s (0x%x)' % (self.name, id(self)) + + +class Graph(object): + + def __init__(self, nodes=None, name=None): + self.nodes = nodes or [] + self.node_lut = {node.name: node for node in self.nodes} + self.name = name + + def add_node(self, node): + self.nodes.append(node) + self.node_lut[node.name] = node + + def get_node(self, name): + try: + return self.node_lut[name] + except KeyError: + raise KaffeError('Layer not found: %s' % name) + + def get_input_nodes(self): + return [node for node in self.nodes if len(node.parents) == 0] + + def get_output_nodes(self): + return [node for node in self.nodes if len(node.children) == 0] + + def topologically_sorted(self): + sorted_nodes = [] + unsorted_nodes = list(self.nodes) + temp_marked = set() + perm_marked = set() + + def visit(node): + if node in temp_marked: + raise KaffeError('Graph is not a DAG.') + if node in perm_marked: + return + temp_marked.add(node) + for child in node.children: + visit(child) + perm_marked.add(node) + temp_marked.remove(node) + sorted_nodes.insert(0, node) + + while len(unsorted_nodes): + visit(unsorted_nodes.pop()) + return sorted_nodes + + def compute_output_shapes(self): + sorted_nodes = self.topologically_sorted() + for node in sorted_nodes: + node.output_shape = TensorShape(*NodeKind.compute_output_shape(node)) + + def replaced(self, new_nodes): + return Graph(nodes=new_nodes, name=self.name) + + def transformed(self, transformers): + graph = self + for transformer in transformers: + graph = transformer(graph) + if graph is None: + raise KaffeError('Transformer failed: {}'.format(transformer)) + assert isinstance(graph, Graph) + return graph + + def __contains__(self, key): + return key in self.node_lut + + def __str__(self): + hdr = '{:<20} {:<30} {:>20} {:>20}'.format('Type', 'Name', 'Param', 'Output') + s = [hdr, '-' * 94] + for node in self.topologically_sorted(): + # If the node has learned parameters, display the first one's shape. + # In case of convolutions, this corresponds to the weights. + if node.data:#ginger + node.data=list(node.data)#ginger + data_shape = str(node.data[0].shape) if node.data else '--' + out_shape = node.output_shape or '--' + s.append('{:<20} {:<30} {:>20} {:>20}'.format(node.kind, node.name,data_shape, str(tuple(out_shape))) )#ginger + return '\n'.join(s) + + +class GraphBuilder(object): + '''Constructs a model graph from a Caffe protocol buffer definition.''' + + def __init__(self, def_path, phase='test'): + ''' + def_path: Path to the model definition (.prototxt) + data_path: Path to the model data (.caffemodel) + phase: Either 'test' or 'train'. Used for filtering phase-specific nodes. + ''' + self.def_path = def_path + self.phase = phase + self.load() + + def load(self): + '''Load the layer definitions from the prototxt.''' + self.params = get_caffe_resolver().NetParameter() + with open(self.def_path, 'rb') as def_file: + text_format.Merge(def_file.read(), self.params) + + def filter_layers(self, layers): + '''Filter out layers based on the current phase.''' + phase_map = {0: 'train', 1: 'test'} + filtered_layer_names = set() + filtered_layers = [] + for layer in layers: + phase = self.phase + if len(layer.include): + phase = phase_map[layer.include[0].phase] + if len(layer.exclude): + phase = phase_map[1 - layer.include[0].phase] + exclude = (phase != self.phase) + # Dropout layers appear in a fair number of Caffe + # test-time networks. These are just ignored. We'll + # filter them out here. + if (not exclude) and (phase == 'test'): + exclude = (layer.type == LayerType.Dropout) + if not exclude: + filtered_layers.append(layer) + # Guard against dupes. + assert layer.name not in filtered_layer_names + filtered_layer_names.add(layer.name) + return filtered_layers + + def make_node(self, layer): + '''Create a graph node for the given layer.''' + kind = NodeKind.map_raw_kind(layer.type) + if kind is None: + raise KaffeError('Unknown layer type encountered: %s' % layer.type) + # We want to use the layer's top names (the "output" names), rather than the + # name attribute, which is more of readability thing than a functional one. + # Other layers will refer to a node by its "top name". + return Node(layer.name, kind, layer=layer) + + def make_input_nodes(self): + ''' + Create data input nodes. + + This method is for old-style inputs, where the input specification + was not treated as a first-class layer in the prototext. + Newer models use the "Input layer" type. + ''' + nodes = [Node(name, NodeKind.Data) for name in self.params.input] + if len(nodes): + input_dim = map(int, self.params.input_dim) + if not input_dim: + if len(self.params.input_shape) > 0: + input_dim = map(int, self.params.input_shape[0].dim) + else: + raise KaffeError('Dimensions for input not specified.') + for node in nodes: + node.output_shape = tuple(input_dim) + return nodes + + def build(self): + ''' + Builds the graph from the Caffe layer definitions. + ''' + # Get the layers + layers = self.params.layers or self.params.layer + # Filter out phase-excluded layers + layers = self.filter_layers(layers) + # Get any separately-specified input layers + nodes = self.make_input_nodes() + nodes += [self.make_node(layer) for layer in layers] + # Initialize the graph + graph = Graph(nodes=nodes, name=self.params.name) + # Connect the nodes + # + # A note on layers and outputs: + # In Caffe, each layer can produce multiple outputs ("tops") from a set of inputs + # ("bottoms"). The bottoms refer to other layers' tops. The top can rewrite a bottom + # (in case of in-place operations). Note that the layer's name is not used for establishing + # any connectivity. It's only used for data association. By convention, a layer with a + # single top will often use the same name (although this is not required). + # + # The current implementation only supports single-output nodes (note that a node can still + # have multiple children, since multiple child nodes can refer to the single top's name). + node_outputs = {} + for layer in layers: + node = graph.get_node(layer.name) + for input_name in layer.bottom: + assert input_name != layer.name + parent_node = node_outputs.get(input_name) + if (parent_node is None) or (parent_node == node): + parent_node = graph.get_node(input_name) + node.add_parent(parent_node) + if len(layer.top)>1: + raise KaffeError('Multiple top nodes are not supported.') + for output_name in layer.top: + if output_name == layer.name: + # Output is named the same as the node. No further action required. + continue + # There are two possibilities here: + # + # Case 1: output_name refers to another node in the graph. + # This is an "in-place operation" that overwrites an existing node. + # This would create a cycle in the graph. We'll undo the in-placing + # by substituting this node wherever the overwritten node is referenced. + # + # Case 2: output_name violates the convention layer.name == output_name. + # Since we are working in the single-output regime, we will can rename it to + # match the layer name. + # + # For both cases, future references to this top re-routes to this node. + node_outputs[output_name] = node + + graph.compute_output_shapes() + return graph + + +class NodeMapper(NodeDispatch): + + def __init__(self, graph): + self.graph = graph + + def map(self): + nodes = self.graph.topologically_sorted() + # Remove input nodes - we'll handle them separately. + input_nodes = self.graph.get_input_nodes() + nodes = [t for t in nodes if t not in input_nodes] + # Decompose DAG into chains. + chains = [] + for node in nodes: + attach_to_chain = None + if len(node.parents) == 1: + parent = node.get_only_parent() + for chain in chains: + if chain[-1] == parent: + # Node is part of an existing chain. + attach_to_chain = chain + break + if attach_to_chain is None: + # Start a new chain for this node. + attach_to_chain = [] + chains.append(attach_to_chain) + attach_to_chain.append(node) + # Map each chain. + mapped_chains = [] + for chain in chains: + mapped_chains.append(self.map_chain(chain)) + return self.commit(mapped_chains) + + def map_chain(self, chain): + return [self.map_node(node) for node in chain] + + def map_node(self, node): + map_func = self.get_handler(node.kind, 'map') + mapped_node = map_func(node) + assert mapped_node is not None + mapped_node.node = node + return mapped_node + + def commit(self, mapped_chains): + raise NotImplementedError('Must be implemented by subclass.') diff --git a/kaffe/layers.py b/kaffe/layers.py index c3c5955..af079fa 100644 --- a/kaffe/layers.py +++ b/kaffe/layers.py @@ -1,147 +1,147 @@ -import re -import numbers -from collections import namedtuple - -from .shapes import * - -LAYER_DESCRIPTORS = { - - # Caffe Types - 'AbsVal': shape_identity, - 'Accuracy': shape_scalar, - 'ArgMax': shape_not_implemented, - 'BatchNorm': shape_identity, - 'BNLL': shape_not_implemented, - 'Concat': shape_concat, - 'ContrastiveLoss': shape_scalar, - 'Convolution': shape_convolution, - 'Deconvolution': shape_not_implemented, - 'Data': shape_data, - 'Dropout': shape_identity, - 'DummyData': shape_data, - 'EuclideanLoss': shape_scalar, - 'Eltwise': shape_identity, - 'Exp': shape_identity, - 'Flatten': shape_not_implemented, - 'HDF5Data': shape_data, - 'HDF5Output': shape_identity, - 'HingeLoss': shape_scalar, - 'Im2col': shape_not_implemented, - 'ImageData': shape_data, - 'InfogainLoss': shape_scalar, - 'InnerProduct': shape_inner_product, - 'Input': shape_data, - 'LRN': shape_identity, - 'MemoryData': shape_mem_data, - 'MultinomialLogisticLoss': shape_scalar, - 'MVN': shape_not_implemented, - 'Pooling': shape_pool, - 'Power': shape_identity, - 'ReLU': shape_identity, - 'Scale': shape_identity, - 'Sigmoid': shape_identity, - 'SigmoidCrossEntropyLoss': shape_scalar, - 'Silence': shape_not_implemented, - 'Softmax': shape_identity, - 'SoftmaxWithLoss': shape_scalar, - 'Split': shape_not_implemented, - 'Slice': shape_not_implemented, - 'TanH': shape_identity, - 'WindowData': shape_not_implemented, - 'Threshold': shape_identity, -} - -LAYER_TYPES = LAYER_DESCRIPTORS.keys() - -LayerType = type('LayerType', (), {t: t for t in LAYER_TYPES}) - -class NodeKind(LayerType): - - @staticmethod - def map_raw_kind(kind): - if kind in LAYER_TYPES: - return kind - return None - - @staticmethod - def compute_output_shape(node): - try: - val = LAYER_DESCRIPTORS[node.kind](node) - return val - except NotImplementedError: - raise KaffeError('Output shape computation not implemented for type: %s' % node.kind) - - -class NodeDispatchError(KaffeError): - - pass - - -class NodeDispatch(object): - - @staticmethod - def get_handler_name(node_kind): - if len(node_kind) <= 4: - # A catch-all for things like ReLU and tanh - return node_kind.lower() - # Convert from CamelCase to under_scored - name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', node_kind) - return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).lower() - - def get_handler(self, node_kind, prefix): - name = self.get_handler_name(node_kind) - name = '_'.join((prefix, name)) - try: - return getattr(self, name) - except AttributeError: - raise NodeDispatchError('No handler found for node kind: %s (expected: %s)' % - (node_kind, name)) - - -class LayerAdapter(object): - - def __init__(self, layer, kind): - self.layer = layer - self.kind = kind - - @property - def parameters(self): - name = NodeDispatch.get_handler_name(self.kind) - name = '_'.join((name, 'param')) - try: - return getattr(self.layer, name) - except AttributeError: - raise NodeDispatchError('Caffe parameters not found for layer kind: %s' % (self.kind)) - - @staticmethod - def get_kernel_value(scalar, repeated, idx, default=None): - if scalar: - return scalar - if repeated: - if isinstance(repeated, numbers.Number): - return repeated - if len(repeated) == 1: - # Same value applies to all spatial dimensions - return int(repeated[0]) - assert idx < len(repeated) - # Extract the value for the given spatial dimension - return repeated[idx] - if default is None: - raise ValueError('Unable to determine kernel parameter!') - return default - - @property - def kernel_parameters(self): - assert self.kind in (NodeKind.Convolution, NodeKind.Pooling) - params = self.parameters - k_h = self.get_kernel_value(params.kernel_h, params.kernel_size, 0) - k_w = self.get_kernel_value(params.kernel_w, params.kernel_size, 1) - s_h = self.get_kernel_value(params.stride_h, params.stride, 0, default=1) - s_w = self.get_kernel_value(params.stride_w, params.stride, 1, default=1) - p_h = self.get_kernel_value(params.pad_h, params.pad, 0, default=0) - p_w = self.get_kernel_value(params.pad_h, params.pad, 1, default=0) - return KernelParameters(k_h, k_w, s_h, s_w, p_h, p_w) - - -KernelParameters = namedtuple('KernelParameters', ['kernel_h', 'kernel_w', 'stride_h', 'stride_w', - 'pad_h', 'pad_w']) +import re +import numbers +from collections import namedtuple + +from .shapes import * + +LAYER_DESCRIPTORS = { + + # Caffe Types + 'AbsVal': shape_identity, + 'Accuracy': shape_scalar, + 'ArgMax': shape_not_implemented, + 'BatchNorm': shape_identity, + 'BNLL': shape_not_implemented, + 'Concat': shape_concat, + 'ContrastiveLoss': shape_scalar, + 'Convolution': shape_convolution, + 'Deconvolution': shape_not_implemented, + 'Data': shape_data, + 'Dropout': shape_identity, + 'DummyData': shape_data, + 'EuclideanLoss': shape_scalar, + 'Eltwise': shape_identity, + 'Exp': shape_identity, + 'Flatten': shape_not_implemented, + 'HDF5Data': shape_data, + 'HDF5Output': shape_identity, + 'HingeLoss': shape_scalar, + 'Im2col': shape_not_implemented, + 'ImageData': shape_data, + 'InfogainLoss': shape_scalar, + 'InnerProduct': shape_inner_product, + 'Input': shape_data, + 'LRN': shape_identity, + 'MemoryData': shape_mem_data, + 'MultinomialLogisticLoss': shape_scalar, + 'MVN': shape_not_implemented, + 'Pooling': shape_pool, + 'Power': shape_identity, + 'ReLU': shape_identity, + 'Scale': shape_identity, + 'Sigmoid': shape_identity, + 'SigmoidCrossEntropyLoss': shape_scalar, + 'Silence': shape_not_implemented, + 'Softmax': shape_identity, + 'SoftmaxWithLoss': shape_scalar, + 'Split': shape_not_implemented, + 'Slice': shape_not_implemented, + 'TanH': shape_identity, + 'WindowData': shape_not_implemented, + 'Threshold': shape_identity, +} + +LAYER_TYPES = LAYER_DESCRIPTORS.keys() + +LayerType = type('LayerType', (), {t: t for t in LAYER_TYPES}) + +class NodeKind(LayerType): + + @staticmethod + def map_raw_kind(kind): + if kind in LAYER_TYPES: + return kind + return None + + @staticmethod + def compute_output_shape(node): + try: + val = LAYER_DESCRIPTORS[node.kind](node) + return val + except NotImplementedError: + raise KaffeError('Output shape computation not implemented for type: %s' % node.kind) + + +class NodeDispatchError(KaffeError): + + pass + + +class NodeDispatch(object): + + @staticmethod + def get_handler_name(node_kind): + if len(node_kind) <= 4: + # A catch-all for things like ReLU and tanh + return node_kind.lower() + # Convert from CamelCase to under_scored + name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', node_kind) + return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).lower() + + def get_handler(self, node_kind, prefix): + name = self.get_handler_name(node_kind) + name = '_'.join((prefix, name)) + try: + return getattr(self, name) + except AttributeError: + raise NodeDispatchError('No handler found for node kind: %s (expected: %s)' % + (node_kind, name)) + + +class LayerAdapter(object): + + def __init__(self, layer, kind): + self.layer = layer + self.kind = kind + + @property + def parameters(self): + name = NodeDispatch.get_handler_name(self.kind) + name = '_'.join((name, 'param')) + try: + return getattr(self.layer, name) + except AttributeError: + raise NodeDispatchError('Caffe parameters not found for layer kind: %s' % (self.kind)) + + @staticmethod + def get_kernel_value(scalar, repeated, idx, default=None): + if scalar: + return scalar + if repeated: + if isinstance(repeated, numbers.Number): + return repeated + if len(repeated) == 1: + # Same value applies to all spatial dimensions + return int(repeated[0]) + assert idx < len(repeated) + # Extract the value for the given spatial dimension + return repeated[idx] + if default is None: + raise ValueError('Unable to determine kernel parameter!') + return default + + @property + def kernel_parameters(self): + assert self.kind in (NodeKind.Convolution, NodeKind.Pooling) + params = self.parameters + k_h = self.get_kernel_value(params.kernel_h, params.kernel_size, 0) + k_w = self.get_kernel_value(params.kernel_w, params.kernel_size, 1) + s_h = self.get_kernel_value(params.stride_h, params.stride, 0, default=1) + s_w = self.get_kernel_value(params.stride_w, params.stride, 1, default=1) + p_h = self.get_kernel_value(params.pad_h, params.pad, 0, default=0) + p_w = self.get_kernel_value(params.pad_h, params.pad, 1, default=0) + return KernelParameters(k_h, k_w, s_h, s_w, p_h, p_w) + + +KernelParameters = namedtuple('KernelParameters', ['kernel_h', 'kernel_w', 'stride_h', 'stride_w', + 'pad_h', 'pad_w']) diff --git a/kaffe/shapes.py b/kaffe/shapes.py index a70ff14..0fc5dcf 100644 --- a/kaffe/shapes.py +++ b/kaffe/shapes.py @@ -1,83 +1,83 @@ -import math -from collections import namedtuple - -from .errors import KaffeError - -TensorShape = namedtuple('TensorShape', ['batch_size', 'channels', 'height', 'width']) - - -def get_filter_output_shape(i_h, i_w, params, round_func): - o_h = (i_h + 2 * params.pad_h - params.kernel_h) / float(params.stride_h) + 1 - o_w = (i_w + 2 * params.pad_w - params.kernel_w) / float(params.stride_w) + 1 - return (int(round_func(o_h)), int(round_func(o_w))) - - -def get_strided_kernel_output_shape(node, round_func): - assert node.layer is not None - input_shape = node.get_only_parent().output_shape - o_h, o_w = get_filter_output_shape(input_shape.height, input_shape.width, - node.layer.kernel_parameters, round_func) - params = node.layer.parameters - has_c_o = hasattr(params, 'num_output') - c = params.num_output if has_c_o else input_shape.channels - return TensorShape(input_shape.batch_size, c, o_h, o_w) - - -def shape_not_implemented(node): - raise NotImplementedError - - -def shape_identity(node): - assert len(node.parents) > 0 - return node.parents[0].output_shape - - -def shape_scalar(node): - return TensorShape(1, 1, 1, 1) - - -def shape_data(node): - if node.output_shape: - # Old-style input specification - return node.output_shape - try: - # New-style input specification - return map(int, node.parameters.shape[0].dim) - except: - # We most likely have a data layer on our hands. The problem is, - # Caffe infers the dimensions of the data from the source (eg: LMDB). - # We want to avoid reading datasets here. Fail for now. - # This can be temporarily fixed by transforming the data layer to - # Caffe's "input" layer (as is usually used in the "deploy" version). - # TODO: Find a better solution for this. - raise KaffeError('Cannot determine dimensions of data layer.\n' - 'See comments in function shape_data for more info.') - - -def shape_mem_data(node): - params = node.parameters - return TensorShape(params.batch_size, params.channels, params.height, params.width) - - -def shape_concat(node): - axis = node.layer.parameters.axis - output_shape = None - for parent in node.parents: - if output_shape is None: - output_shape = list(parent.output_shape) - else: - output_shape[axis] += parent.output_shape[axis] - return tuple(output_shape) - - -def shape_convolution(node): - return get_strided_kernel_output_shape(node, math.floor) - - -def shape_pool(node): - return get_strided_kernel_output_shape(node, math.ceil) - - -def shape_inner_product(node): - input_shape = node.get_only_parent().output_shape - return TensorShape(input_shape.batch_size, node.layer.parameters.num_output, 1, 1) +import math +from collections import namedtuple + +from .errors import KaffeError + +TensorShape = namedtuple('TensorShape', ['batch_size', 'channels', 'height', 'width']) + + +def get_filter_output_shape(i_h, i_w, params, round_func): + o_h = (i_h + 2 * params.pad_h - params.kernel_h) / float(params.stride_h) + 1 + o_w = (i_w + 2 * params.pad_w - params.kernel_w) / float(params.stride_w) + 1 + return (int(round_func(o_h)), int(round_func(o_w))) + + +def get_strided_kernel_output_shape(node, round_func): + assert node.layer is not None + input_shape = node.get_only_parent().output_shape + o_h, o_w = get_filter_output_shape(input_shape.height, input_shape.width, + node.layer.kernel_parameters, round_func) + params = node.layer.parameters + has_c_o = hasattr(params, 'num_output') + c = params.num_output if has_c_o else input_shape.channels + return TensorShape(input_shape.batch_size, c, o_h, o_w) + + +def shape_not_implemented(node): + raise NotImplementedError + + +def shape_identity(node): + assert len(node.parents) > 0 + return node.parents[0].output_shape + + +def shape_scalar(node): + return TensorShape(1, 1, 1, 1) + + +def shape_data(node): + if node.output_shape: + # Old-style input specification + return node.output_shape + try: + # New-style input specification + return map(int, node.parameters.shape[0].dim) + except: + # We most likely have a data layer on our hands. The problem is, + # Caffe infers the dimensions of the data from the source (eg: LMDB). + # We want to avoid reading datasets here. Fail for now. + # This can be temporarily fixed by transforming the data layer to + # Caffe's "input" layer (as is usually used in the "deploy" version). + # TODO: Find a better solution for this. + raise KaffeError('Cannot determine dimensions of data layer.\n' + 'See comments in function shape_data for more info.') + + +def shape_mem_data(node): + params = node.parameters + return TensorShape(params.batch_size, params.channels, params.height, params.width) + + +def shape_concat(node): + axis = node.layer.parameters.axis + output_shape = None + for parent in node.parents: + if output_shape is None: + output_shape = list(parent.output_shape) + else: + output_shape[axis] += parent.output_shape[axis] + return tuple(output_shape) + + +def shape_convolution(node): + return get_strided_kernel_output_shape(node, math.floor) + + +def shape_pool(node): + return get_strided_kernel_output_shape(node, math.ceil) + + +def shape_inner_product(node): + input_shape = node.get_only_parent().output_shape + return TensorShape(input_shape.batch_size, node.layer.parameters.num_output, 1, 1) diff --git a/kaffe/tensorflow/__init__.py b/kaffe/tensorflow/__init__.py index 0ce9cf9..692c156 100644 --- a/kaffe/tensorflow/__init__.py +++ b/kaffe/tensorflow/__init__.py @@ -1,2 +1,2 @@ -from .transformer import TensorFlowTransformer -from .network import Network +from .transformer import TensorFlowTransformer +from .network import Network diff --git a/kaffe/tensorflow/__pycache__/__init__.cpython-35.pyc b/kaffe/tensorflow/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..099e8845125da590f1e1b5eb84b91e538a326172 GIT binary patch literal 239 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 literal 0 HcmV?d00001 diff --git a/kaffe/tensorflow/__pycache__/transformer.cpython-35.pyc b/kaffe/tensorflow/__pycache__/transformer.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25c3354f4acd0c47407bbc2e7aafbab1fae1ac73 GIT binary patch literal 11417 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 YY%L?GdEQ>I-6P8OV literal 0 HcmV?d00001 diff --git a/kaffe/tensorflow/__pycache__/transformer.cpython-36.pyc b/kaffe/tensorflow/__pycache__/transformer.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2564fba3e4bee2b40c37aca3fb7ab63ae5fcff42 GIT binary patch literal 10520 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 literal 0 HcmV?d00001 diff --git a/kaffe/tensorflow/network.py b/kaffe/tensorflow/network.py index 6f3b153..a7c6995 100644 --- a/kaffe/tensorflow/network.py +++ b/kaffe/tensorflow/network.py @@ -1,244 +1,244 @@ -import numpy as np -import tensorflow as tf - -DEFAULT_PADDING = 'SAME' - - -def layer(op): - '''Decorator for composable network layers.''' - - def layer_decorated(self, *args, **kwargs): - # Automatically set a name if not provided. - name = kwargs.setdefault('name', self.get_unique_name(op.__name__)) - # Figure out the layer inputs. - if len(self.terminals) == 0: - raise RuntimeError('No input variables found for layer %s.' % name) - elif len(self.terminals) == 1: - layer_input = self.terminals[0] - else: - layer_input = list(self.terminals) - # Perform the operation and get the output. - layer_output = op(self, layer_input, *args, **kwargs) - # Add to layer LUT. - self.layers[name] = layer_output - # This output is now the input for the next layer. - self.feed(layer_output) - # Return self for chained calls. - return self - - return layer_decorated - - -class Network(object): - - def __init__(self, inputs, trainable=True): - # The input nodes for this network - self.inputs = inputs - # The current list of terminal nodes - self.terminals = [] - # Mapping from layer names to layers - self.layers = dict(inputs) - # If true, the resulting variables are set as trainable - self.trainable = trainable - # Switch variable for dropout - self.use_dropout = tf.placeholder_with_default(tf.constant(1.0), - shape=[], - name='use_dropout') - self.setup() - - def setup(self): - '''Construct the network. ''' - raise NotImplementedError('Must be implemented by the subclass.') - - def load(self, data_path, session, ignore_missing=False): - '''Load network weights. - data_path: The path to the numpy-serialized network weights - session: The current TensorFlow session - ignore_missing: If true, serialized weights for missing layers are ignored. - ''' - data_dict = np.load(data_path).item() - for op_name in data_dict: - with tf.variable_scope(op_name, reuse=True): - for param_name, data in data_dict[op_name].iteritems(): - try: - var = tf.get_variable(param_name) - session.run(var.assign(data)) - except ValueError: - if not ignore_missing: - raise - - def feed(self, *args): - '''Set the input(s) for the next operation by replacing the terminal nodes. - The arguments can be either layer names or the actual layers. - ''' - assert len(args) != 0 - self.terminals = [] - for fed_layer in args: - if isinstance(fed_layer, basestring): - try: - fed_layer = self.layers[fed_layer] - except KeyError: - raise KeyError('Unknown layer name fed: %s' % fed_layer) - self.terminals.append(fed_layer) - return self - - def get_output(self): - '''Returns the current network output.''' - return self.terminals[-1] - - def get_unique_name(self, prefix): - '''Returns an index-suffixed unique name for the given prefix. - This is used for auto-generating layer names based on the type-prefix. - ''' - ident = sum(t.startswith(prefix) for t, _ in self.layers.items()) + 1 - return '%s_%d' % (prefix, ident) - - def make_var(self, name, shape): - '''Creates a new TensorFlow variable.''' - return tf.get_variable(name, shape, trainable=self.trainable) - - def validate_padding(self, padding): - '''Verifies that the padding is one of the supported ones.''' - assert padding in ('SAME', 'VALID') - - @layer - def conv(self, - input, - k_h, - k_w, - c_o, - s_h, - s_w, - name, - relu=True, - padding=DEFAULT_PADDING, - group=1, - biased=True): - # Verify that the padding is acceptable - self.validate_padding(padding) - # Get the number of channels in the input - c_i = input.get_shape()[-1] - # Verify that the grouping parameter is valid - assert c_i % group == 0 - assert c_o % group == 0 - # Convolution for a given input and kernel - convolve = lambda i, k: tf.nn.conv2d(i, k, [1, s_h, s_w, 1], padding=padding) - with tf.variable_scope(name) as scope: - kernel = self.make_var('weights', shape=[k_h, k_w, c_i / group, c_o]) - if group == 1: - # This is the common-case. Convolve the input without any further complications. - output = convolve(input, kernel) - else: - # Split the input into groups and then convolve each of them independently - input_groups = tf.split(3, group, input) - kernel_groups = tf.split(3, group, kernel) - output_groups = [convolve(i, k) for i, k in zip(input_groups, kernel_groups)] - # Concatenate the groups - output = tf.concat(3, output_groups) - # Add the biases - if biased: - biases = self.make_var('biases', [c_o]) - output = tf.nn.bias_add(output, biases) - if relu: - # ReLU non-linearity - output = tf.nn.relu(output, name=scope.name) - return output - - @layer - def relu(self, input, name): - return tf.nn.relu(input, name=name) - - @layer - def max_pool(self, input, k_h, k_w, s_h, s_w, name, padding=DEFAULT_PADDING): - self.validate_padding(padding) - return tf.nn.max_pool(input, - ksize=[1, k_h, k_w, 1], - strides=[1, s_h, s_w, 1], - padding=padding, - name=name) - - @layer - def avg_pool(self, input, k_h, k_w, s_h, s_w, name, padding=DEFAULT_PADDING): - self.validate_padding(padding) - return tf.nn.avg_pool(input, - ksize=[1, k_h, k_w, 1], - strides=[1, s_h, s_w, 1], - padding=padding, - name=name) - - @layer - def lrn(self, input, radius, alpha, beta, name, bias=1.0): - return tf.nn.local_response_normalization(input, - depth_radius=radius, - alpha=alpha, - beta=beta, - bias=bias, - name=name) - - @layer - def concat(self, inputs, axis, name): - return tf.concat(concat_dim=axis, values=inputs, name=name) - - @layer - def add(self, inputs, name): - return tf.add_n(inputs, name=name) - - @layer - def fc(self, input, num_out, name, relu=True): - with tf.variable_scope(name) as scope: - input_shape = input.get_shape() - if input_shape.ndims == 4: - # The input is spatial. Vectorize it first. - dim = 1 - for d in input_shape[1:].as_list(): - dim *= d - feed_in = tf.reshape(input, [-1, dim]) - else: - feed_in, dim = (input, input_shape[-1].value) - weights = self.make_var('weights', shape=[dim, num_out]) - biases = self.make_var('biases', [num_out]) - op = tf.nn.relu_layer if relu else tf.nn.xw_plus_b - fc = op(feed_in, weights, biases, name=scope.name) - return fc - - @layer - def softmax(self, input, name): - input_shape = map(lambda v: v.value, input.get_shape()) - if len(input_shape) > 2: - # For certain models (like NiN), the singleton spatial dimensions - # need to be explicitly squeezed, since they're not broadcast-able - # in TensorFlow's NHWC ordering (unlike Caffe's NCHW). - if input_shape[1] == 1 and input_shape[2] == 1: - input = tf.squeeze(input, squeeze_dims=[1, 2]) - else: - raise ValueError('Rank 2 tensor input expected for softmax!') - return tf.nn.softmax(input, name=name) - - @layer - def batch_normalization(self, input, name, scale_offset=True, relu=False): - # NOTE: Currently, only inference is supported - with tf.variable_scope(name) as scope: - shape = [input.get_shape()[-1]] - if scale_offset: - scale = self.make_var('scale', shape=shape) - offset = self.make_var('offset', shape=shape) - else: - scale, offset = (None, None) - output = tf.nn.batch_normalization( - input, - mean=self.make_var('mean', shape=shape), - variance=self.make_var('variance', shape=shape), - offset=offset, - scale=scale, - # TODO: This is the default Caffe batch norm eps - # Get the actual eps from parameters - variance_epsilon=1e-5, - name=name) - if relu: - output = tf.nn.relu(output) - return output - - @layer - def dropout(self, input, keep_prob, name): - keep = 1 - self.use_dropout + (self.use_dropout * keep_prob) - return tf.nn.dropout(input, keep, name=name) +import numpy as np +import tensorflow as tf + +DEFAULT_PADDING = 'SAME' + + +def layer(op): + '''Decorator for composable network layers.''' + + def layer_decorated(self, *args, **kwargs): + # Automatically set a name if not provided. + name = kwargs.setdefault('name', self.get_unique_name(op.__name__)) + # Figure out the layer inputs. + if len(self.terminals) == 0: + raise RuntimeError('No input variables found for layer %s.' % name) + elif len(self.terminals) == 1: + layer_input = self.terminals[0] + else: + layer_input = list(self.terminals) + # Perform the operation and get the output. + layer_output = op(self, layer_input, *args, **kwargs) + # Add to layer LUT. + self.layers[name] = layer_output + # This output is now the input for the next layer. + self.feed(layer_output) + # Return self for chained calls. + return self + + return layer_decorated + + +class Network(object): + + def __init__(self, inputs, trainable=True): + # The input nodes for this network + self.inputs = inputs + # The current list of terminal nodes + self.terminals = [] + # Mapping from layer names to layers + self.layers = dict(inputs) + # If true, the resulting variables are set as trainable + self.trainable = trainable + # Switch variable for dropout + self.use_dropout = tf.placeholder_with_default(tf.constant(1.0), + shape=[], + name='use_dropout') + self.setup() + + def setup(self): + '''Construct the network. ''' + raise NotImplementedError('Must be implemented by the subclass.') + + def load(self, data_path, session, ignore_missing=False): + '''Load network weights. + data_path: The path to the numpy-serialized network weights + session: The current TensorFlow session + ignore_missing: If true, serialized weights for missing layers are ignored. + ''' + data_dict = np.load(data_path).item() + for op_name in data_dict: + with tf.variable_scope(op_name, reuse=True): + for param_name, data in data_dict[op_name].iteritems(): + try: + var = tf.get_variable(param_name) + session.run(var.assign(data)) + except ValueError: + if not ignore_missing: + raise + + def feed(self, *args): + '''Set the input(s) for the next operation by replacing the terminal nodes. + The arguments can be either layer names or the actual layers. + ''' + assert len(args) != 0 + self.terminals = [] + for fed_layer in args: + if isinstance(fed_layer, basestring): + try: + fed_layer = self.layers[fed_layer] + except KeyError: + raise KeyError('Unknown layer name fed: %s' % fed_layer) + self.terminals.append(fed_layer) + return self + + def get_output(self): + '''Returns the current network output.''' + return self.terminals[-1] + + def get_unique_name(self, prefix): + '''Returns an index-suffixed unique name for the given prefix. + This is used for auto-generating layer names based on the type-prefix. + ''' + ident = sum(t.startswith(prefix) for t, _ in self.layers.items()) + 1 + return '%s_%d' % (prefix, ident) + + def make_var(self, name, shape): + '''Creates a new TensorFlow variable.''' + return tf.get_variable(name, shape, trainable=self.trainable) + + def validate_padding(self, padding): + '''Verifies that the padding is one of the supported ones.''' + assert padding in ('SAME', 'VALID') + + @layer + def conv(self, + input, + k_h, + k_w, + c_o, + s_h, + s_w, + name, + relu=True, + padding=DEFAULT_PADDING, + group=1, + biased=True): + # Verify that the padding is acceptable + self.validate_padding(padding) + # Get the number of channels in the input + c_i = input.get_shape()[-1] + # Verify that the grouping parameter is valid + assert c_i % group == 0 + assert c_o % group == 0 + # Convolution for a given input and kernel + convolve = lambda i, k: tf.nn.conv2d(i, k, [1, s_h, s_w, 1], padding=padding) + with tf.variable_scope(name) as scope: + kernel = self.make_var('weights', shape=[k_h, k_w, c_i / group, c_o]) + if group == 1: + # This is the common-case. Convolve the input without any further complications. + output = convolve(input, kernel) + else: + # Split the input into groups and then convolve each of them independently + input_groups = tf.split(3, group, input) + kernel_groups = tf.split(3, group, kernel) + output_groups = [convolve(i, k) for i, k in zip(input_groups, kernel_groups)] + # Concatenate the groups + output = tf.concat(3, output_groups) + # Add the biases + if biased: + biases = self.make_var('biases', [c_o]) + output = tf.nn.bias_add(output, biases) + if relu: + # ReLU non-linearity + output = tf.nn.relu(output, name=scope.name) + return output + + @layer + def relu(self, input, name): + return tf.nn.relu(input, name=name) + + @layer + def max_pool(self, input, k_h, k_w, s_h, s_w, name, padding=DEFAULT_PADDING): + self.validate_padding(padding) + return tf.nn.max_pool(input, + ksize=[1, k_h, k_w, 1], + strides=[1, s_h, s_w, 1], + padding=padding, + name=name) + + @layer + def avg_pool(self, input, k_h, k_w, s_h, s_w, name, padding=DEFAULT_PADDING): + self.validate_padding(padding) + return tf.nn.avg_pool(input, + ksize=[1, k_h, k_w, 1], + strides=[1, s_h, s_w, 1], + padding=padding, + name=name) + + @layer + def lrn(self, input, radius, alpha, beta, name, bias=1.0): + return tf.nn.local_response_normalization(input, + depth_radius=radius, + alpha=alpha, + beta=beta, + bias=bias, + name=name) + + @layer + def concat(self, inputs, axis, name): + return tf.concat(concat_dim=axis, values=inputs, name=name) + + @layer + def add(self, inputs, name): + return tf.add_n(inputs, name=name) + + @layer + def fc(self, input, num_out, name, relu=True): + with tf.variable_scope(name) as scope: + input_shape = input.get_shape() + if input_shape.ndims == 4: + # The input is spatial. Vectorize it first. + dim = 1 + for d in input_shape[1:].as_list(): + dim *= d + feed_in = tf.reshape(input, [-1, dim]) + else: + feed_in, dim = (input, input_shape[-1].value) + weights = self.make_var('weights', shape=[dim, num_out]) + biases = self.make_var('biases', [num_out]) + op = tf.nn.relu_layer if relu else tf.nn.xw_plus_b + fc = op(feed_in, weights, biases, name=scope.name) + return fc + + @layer + def softmax(self, input, name): + input_shape = map(lambda v: v.value, input.get_shape()) + if len(input_shape) > 2: + # For certain models (like NiN), the singleton spatial dimensions + # need to be explicitly squeezed, since they're not broadcast-able + # in TensorFlow's NHWC ordering (unlike Caffe's NCHW). + if input_shape[1] == 1 and input_shape[2] == 1: + input = tf.squeeze(input, squeeze_dims=[1, 2]) + else: + raise ValueError('Rank 2 tensor input expected for softmax!') + return tf.nn.softmax(input, name=name) + + @layer + def batch_normalization(self, input, name, scale_offset=True, relu=False): + # NOTE: Currently, only inference is supported + with tf.variable_scope(name) as scope: + shape = [input.get_shape()[-1]] + if scale_offset: + scale = self.make_var('scale', shape=shape) + offset = self.make_var('offset', shape=shape) + else: + scale, offset = (None, None) + output = tf.nn.batch_normalization( + input, + mean=self.make_var('mean', shape=shape), + variance=self.make_var('variance', shape=shape), + offset=offset, + scale=scale, + # TODO: This is the default Caffe batch norm eps + # Get the actual eps from parameters + variance_epsilon=1e-5, + name=name) + if relu: + output = tf.nn.relu(output) + return output + + @layer + def dropout(self, input, keep_prob, name): + keep = 1 - self.use_dropout + (self.use_dropout * keep_prob) + return tf.nn.dropout(input, keep, name=name) diff --git a/kaffe/tensorflow/transformer.py b/kaffe/tensorflow/transformer.py index 34bfc9a..7f55a67 100644 --- a/kaffe/tensorflow/transformer.py +++ b/kaffe/tensorflow/transformer.py @@ -1,285 +1,285 @@ -import numpy as np - -from ..errors import KaffeError, print_stderr -from ..graph import GraphBuilder, NodeMapper -from ..layers import NodeKind -from ..transformers import (DataInjector, DataReshaper, NodeRenamer, ReLUFuser, - BatchNormScaleBiasFuser, BatchNormPreprocessor, ParameterNamer) - -from . import network - - -def get_padding_type(kernel_params, input_shape, output_shape): - '''Translates Caffe's numeric padding to one of ('SAME', 'VALID'). - Caffe supports arbitrary padding values, while TensorFlow only - supports 'SAME' and 'VALID' modes. So, not all Caffe paddings - can be translated to TensorFlow. There are some subtleties to - how the padding edge-cases are handled. These are described here: - https://github.com/Yangqing/caffe2/blob/master/caffe2/proto/caffe2_legacy.proto - ''' - k_h, k_w, s_h, s_w, p_h, p_w = kernel_params - s_o_h = np.ceil(input_shape.height / float(s_h)) - s_o_w = np.ceil(input_shape.width / float(s_w)) - if (output_shape.height == s_o_h) and (output_shape.width == s_o_w): - return 'SAME' - v_o_h = np.ceil((input_shape.height - k_h + 1.0) / float(s_h)) - v_o_w = np.ceil((input_shape.width - k_w + 1.0) / float(s_w)) - if (output_shape.height == v_o_h) and (output_shape.width == v_o_w): - return 'VALID' - return None - - -class TensorFlowNode(object): - '''An intermediate representation for TensorFlow operations.''' - - def __init__(self, op, *args, **kwargs): - # A string corresponding to the TensorFlow operation - self.op = op - # Positional arguments for the operation - self.args = args - # Keyword arguments for the operation - self.kwargs = list(kwargs.items()) - # The source Caffe node - self.node = None - - def format(self, arg): - '''Returns a string representation for the given value.''' - return "'%s'" % arg if isinstance(arg, basestring) else str(arg) - - def pair(self, key, value): - '''Returns key=formatted(value).''' - return '%s=%s' % (key, self.format(value)) - - def emit(self): - '''Emits the Python source for this node.''' - # Format positional arguments - args = map(self.format, self.args) - # Format any keyword arguments - if self.kwargs: - args += [self.pair(k, v) for k, v in self.kwargs] - # Set the node name - args.append(self.pair('name', self.node.name)) - args = ', '.join(args) - return '%s(%s)' % (self.op, args) - - -class MaybeActivated(object): - - def __init__(self, node, default=True): - self.inject_kwargs = {} - if node.metadata.get('relu', False) != default: - self.inject_kwargs['relu'] = not default - - def __call__(self, *args, **kwargs): - kwargs.update(self.inject_kwargs) - return TensorFlowNode(*args, **kwargs) - - -class TensorFlowMapper(NodeMapper): - - def get_kernel_params(self, node): - kernel_params = node.layer.kernel_parameters - input_shape = node.get_only_parent().output_shape - padding = get_padding_type(kernel_params, input_shape, node.output_shape) - # Only emit the padding if it's not the default value. - padding = {'padding': padding} if padding != network.DEFAULT_PADDING else {} - return (kernel_params, padding) - - def map_convolution(self, node): - (kernel_params, kwargs) = self.get_kernel_params(node) - h = kernel_params.kernel_h - w = kernel_params.kernel_w - c_o = node.output_shape[1] - c_i = node.parents[0].output_shape[1] - group = node.parameters.group - if group != 1: - kwargs['group'] = group - if not node.parameters.bias_term: - kwargs['biased'] = False - assert kernel_params.kernel_h == h - assert kernel_params.kernel_w == w - return MaybeActivated(node)('conv', kernel_params.kernel_h, kernel_params.kernel_w, c_o, - kernel_params.stride_h, kernel_params.stride_w, **kwargs) - - def map_relu(self, node): - return TensorFlowNode('relu') - - def map_pooling(self, node): - pool_type = node.parameters.pool - if pool_type == 0: - pool_op = 'max_pool' - elif pool_type == 1: - pool_op = 'avg_pool' - else: - # Stochastic pooling, for instance. - raise KaffeError('Unsupported pooling type.') - (kernel_params, padding) = self.get_kernel_params(node) - return TensorFlowNode(pool_op, kernel_params.kernel_h, kernel_params.kernel_w, - kernel_params.stride_h, kernel_params.stride_w, **padding) - - def map_inner_product(self, node): - #TODO: Axis - assert node.parameters.axis == 1 - #TODO: Unbiased - assert node.parameters.bias_term == True - return MaybeActivated(node)('fc', node.parameters.num_output) - - def map_softmax(self, node): - return TensorFlowNode('softmax') - - def map_lrn(self, node): - params = node.parameters - # The window size must be an odd value. For a window - # size of (2*n+1), TensorFlow defines depth_radius = n. - assert params.local_size % 2 == 1 - # Caffe scales by (alpha/(2*n+1)), whereas TensorFlow - # just scales by alpha (as does Krizhevsky's paper). - # We'll account for that here. - alpha = params.alpha / float(params.local_size) - return TensorFlowNode('lrn', int(params.local_size / 2), alpha, params.beta) - - def map_concat(self, node): - axis = (2, 3, 1, 0)[node.parameters.axis] - return TensorFlowNode('concat', axis) - - def map_dropout(self, node): - return TensorFlowNode('dropout', node.parameters.dropout_ratio) - - def map_batch_norm(self, node): - scale_offset = len(node.data) == 4 - kwargs = {} if scale_offset else {'scale_offset': False} - return MaybeActivated(node, default=False)('batch_normalization', **kwargs) - - def map_eltwise(self, node): - operations = {0: 'multiply', 1: 'add', 2: 'max'} - op_code = node.parameters.operation - try: - return TensorFlowNode(operations[op_code]) - except KeyError: - raise KaffeError('Unknown elementwise operation: {}'.format(op_code)) - - def commit(self, chains): - return chains - - -class TensorFlowEmitter(object): - - def __init__(self, tab=None): - self.tab = tab or ' ' * 4 - self.prefix = '' - - def indent(self): - self.prefix += self.tab - - def outdent(self): - self.prefix = self.prefix[:-len(self.tab)] - - def statement(self, s): - return self.prefix + s + '\n' - - def emit_imports(self): - return self.statement('from kaffe.tensorflow import Network\n') - - def emit_class_def(self, name): - return self.statement('class %s(Network):' % (name)) - - def emit_setup_def(self): - return self.statement('def setup(self):') - - def emit_parents(self, chain): - assert len(chain) - s = '(self.feed(' - sep = ', \n' + self.prefix + (' ' * len(s)) - s += sep.join(["'%s'" % parent.name for parent in chain[0].node.parents]) - return self.statement(s + ')') - - def emit_node(self, node): - return self.statement(' ' * 5 + '.' + node.emit()) - - def emit(self, name, chains): - s = self.emit_imports() - s += self.emit_class_def(name) - self.indent() - s += self.emit_setup_def() - self.indent() - blocks = [] - for chain in chains: - b = '' - b += self.emit_parents(chain) - for node in chain: - b += self.emit_node(node) - blocks.append(b[:-1] + ')') - s = s + '\n\n'.join(blocks) - return s - - -class TensorFlowTransformer(object): - - def __init__(self, def_path, data_path, verbose=True, phase='test'): - self.verbose = verbose - self.phase = phase - self.load(def_path, data_path, phase) - self.params = None - self.source = None - - def load(self, def_path, data_path, phase): - # Build the graph - graph = GraphBuilder(def_path, phase).build() - - if data_path is not None: - # Load and associate learned parameters - graph = DataInjector(def_path, data_path)(graph) - - # Transform the graph - transformers = [ - # Fuse split batch normalization layers - BatchNormScaleBiasFuser(), - - # Fuse ReLUs - # TODO: Move non-linearity application to layer wrapper, allowing - # any arbitrary operation to be optionally activated. - ReLUFuser(allowed_parent_types=[NodeKind.Convolution, NodeKind.InnerProduct, - NodeKind.BatchNorm]), - - # Rename nodes - # Slashes are used for scoping in TensorFlow. Replace slashes - # in node names with underscores. - # (Caffe's GoogLeNet implementation uses slashes) - NodeRenamer(lambda node: node.name.replace('/', '_')) - ] - self.graph = graph.transformed(transformers) - - # Display the graph - if self.verbose: - print_stderr(self.graph) - - def transform_data(self): - if self.params is None: - transformers = [ - - # Reshape the parameters to TensorFlow's ordering - DataReshaper({ - # (c_o, c_i, h, w) -> (h, w, c_i, c_o) - NodeKind.Convolution: (2, 3, 1, 0), - - # (c_o, c_i) -> (c_i, c_o) - NodeKind.InnerProduct: (1, 0) - }), - - # Pre-process batch normalization data - BatchNormPreprocessor(), - - # Convert parameters to dictionaries - ParameterNamer(), - ] - self.graph = self.graph.transformed(transformers) - self.params = {node.name: node.data for node in self.graph.nodes if node.data} - return self.params - - def transform_source(self): - if self.source is None: - mapper = TensorFlowMapper(self.graph) - chains = mapper.map() - emitter = TensorFlowEmitter() - self.source = emitter.emit(self.graph.name, chains) - return self.source +import numpy as np + +from ..errors import KaffeError, print_stderr +from ..graph import GraphBuilder, NodeMapper +from ..layers import NodeKind +from ..transformers import (DataInjector, DataReshaper, NodeRenamer, ReLUFuser, + BatchNormScaleBiasFuser, BatchNormPreprocessor, ParameterNamer) + +from . import network + + +def get_padding_type(kernel_params, input_shape, output_shape): + '''Translates Caffe's numeric padding to one of ('SAME', 'VALID'). + Caffe supports arbitrary padding values, while TensorFlow only + supports 'SAME' and 'VALID' modes. So, not all Caffe paddings + can be translated to TensorFlow. There are some subtleties to + how the padding edge-cases are handled. These are described here: + https://github.com/Yangqing/caffe2/blob/master/caffe2/proto/caffe2_legacy.proto + ''' + k_h, k_w, s_h, s_w, p_h, p_w = kernel_params + s_o_h = np.ceil(input_shape.height / float(s_h)) + s_o_w = np.ceil(input_shape.width / float(s_w)) + if (output_shape.height == s_o_h) and (output_shape.width == s_o_w): + return 'SAME' + v_o_h = np.ceil((input_shape.height - k_h + 1.0) / float(s_h)) + v_o_w = np.ceil((input_shape.width - k_w + 1.0) / float(s_w)) + if (output_shape.height == v_o_h) and (output_shape.width == v_o_w): + return 'VALID' + return None + + +class TensorFlowNode(object): + '''An intermediate representation for TensorFlow operations.''' + + def __init__(self, op, *args, **kwargs): + # A string corresponding to the TensorFlow operation + self.op = op + # Positional arguments for the operation + self.args = args + # Keyword arguments for the operation + self.kwargs = list(kwargs.items()) + # The source Caffe node + self.node = None + + def format(self, arg): + '''Returns a string representation for the given value.''' + return "'%s'" % arg if isinstance(arg, str) else str(arg) + + def pair(self, key, value): + '''Returns key=formatted(value).''' + return '%s=%s' % (key, self.format(value)) + + def emit(self): + '''Emits the Python source for this node.''' + # Format positional arguments + args = list(map(self.format, self.args)) + # Format any keyword arguments + if self.kwargs: + args += [self.pair(k, v) for k, v in self.kwargs] + # Set the node name + args.append(self.pair('name', self.node.name)) + args = ', '.join(args) + return '%s(%s)' % (self.op, args) + + +class MaybeActivated(object): + + def __init__(self, node, default=True): + self.inject_kwargs = {} + if node.metadata.get('relu', False) != default: + self.inject_kwargs['relu'] = not default + + def __call__(self, *args, **kwargs): + kwargs.update(self.inject_kwargs) + return TensorFlowNode(*args, **kwargs) + + +class TensorFlowMapper(NodeMapper): + + def get_kernel_params(self, node): + kernel_params = node.layer.kernel_parameters + input_shape = node.get_only_parent().output_shape + padding = get_padding_type(kernel_params, input_shape, node.output_shape) + # Only emit the padding if it's not the default value. + padding = {'padding': padding} if padding != network.DEFAULT_PADDING else {} + return (kernel_params, padding) + + def map_convolution(self, node): + (kernel_params, kwargs) = self.get_kernel_params(node) + h = kernel_params.kernel_h + w = kernel_params.kernel_w + c_o = node.output_shape[1] + c_i = node.parents[0].output_shape[1] + group = node.parameters.group + if group != 1: + kwargs['group'] = group + if not node.parameters.bias_term: + kwargs['biased'] = False + assert kernel_params.kernel_h == h + assert kernel_params.kernel_w == w + return MaybeActivated(node)('conv', kernel_params.kernel_h, kernel_params.kernel_w, c_o, + kernel_params.stride_h, kernel_params.stride_w, **kwargs) + + def map_relu(self, node): + return TensorFlowNode('relu') + + def map_pooling(self, node): + pool_type = node.parameters.pool + if pool_type == 0: + pool_op = 'max_pool' + elif pool_type == 1: + pool_op = 'avg_pool' + else: + # Stochastic pooling, for instance. + raise KaffeError('Unsupported pooling type.') + (kernel_params, padding) = self.get_kernel_params(node) + return TensorFlowNode(pool_op, kernel_params.kernel_h, kernel_params.kernel_w, + kernel_params.stride_h, kernel_params.stride_w, **padding) + + def map_inner_product(self, node): + #TODO: Axis + assert node.parameters.axis == 1 + #TODO: Unbiased + assert node.parameters.bias_term == True + return MaybeActivated(node)('fc', node.parameters.num_output) + + def map_softmax(self, node): + return TensorFlowNode('softmax') + + def map_lrn(self, node): + params = node.parameters + # The window size must be an odd value. For a window + # size of (2*n+1), TensorFlow defines depth_radius = n. + assert params.local_size % 2 == 1 + # Caffe scales by (alpha/(2*n+1)), whereas TensorFlow + # just scales by alpha (as does Krizhevsky's paper). + # We'll account for that here. + alpha = params.alpha / float(params.local_size) + return TensorFlowNode('lrn', int(params.local_size / 2), alpha, params.beta) + + def map_concat(self, node): + axis = (2, 3, 1, 0)[node.parameters.axis] + return TensorFlowNode('concat', axis) + + def map_dropout(self, node): + return TensorFlowNode('dropout', node.parameters.dropout_ratio) + + def map_batch_norm(self, node): + scale_offset = len(node.data) == 4 + kwargs = {} if scale_offset else {'scale_offset': False} + return MaybeActivated(node, default=False)('batch_normalization', **kwargs) + + def map_eltwise(self, node): + operations = {0: 'multiply', 1: 'add', 2: 'max'} + op_code = node.parameters.operation + try: + return TensorFlowNode(operations[op_code]) + except KeyError: + raise KaffeError('Unknown elementwise operation: {}'.format(op_code)) + + def commit(self, chains): + return chains + + +class TensorFlowEmitter(object): + + def __init__(self, tab=None): + self.tab = tab or ' ' * 4 + self.prefix = '' + + def indent(self): + self.prefix += self.tab + + def outdent(self): + self.prefix = self.prefix[:-len(self.tab)] + + def statement(self, s): + return self.prefix + s + '\n' + + def emit_imports(self): + return self.statement('from kaffe.tensorflow import Network\n') + + def emit_class_def(self, name): + return self.statement('class %s(Network):' % (name)) + + def emit_setup_def(self): + return self.statement('def setup(self):') + + def emit_parents(self, chain): + assert len(chain) + s = '(self.feed(' + sep = ', \n' + self.prefix + (' ' * len(s)) + s += sep.join(["'%s'" % parent.name for parent in chain[0].node.parents]) + return self.statement(s + ')') + + def emit_node(self, node): + return self.statement(' ' * 5 + '.' + node.emit()) + + def emit(self, name, chains): + s = self.emit_imports() + s += self.emit_class_def(name) + self.indent() + s += self.emit_setup_def() + self.indent() + blocks = [] + for chain in chains: + b = '' + b += self.emit_parents(chain) + for node in chain: + b += self.emit_node(node) + blocks.append(b[:-1] + ')') + s = s + '\n\n'.join(blocks) + return s + + +class TensorFlowTransformer(object): + + def __init__(self, def_path, data_path, verbose=True, phase='test'): + self.verbose = verbose + self.phase = phase + self.load(def_path, data_path, phase) + self.params = None + self.source = None + + def load(self, def_path, data_path, phase): + # Build the graph + graph = GraphBuilder(def_path, phase).build() + + if data_path is not None: + # Load and associate learned parameters + graph = DataInjector(def_path, data_path)(graph) + + # Transform the graph + transformers = [ + # Fuse split batch normalization layers + BatchNormScaleBiasFuser(), + + # Fuse ReLUs + # TODO: Move non-linearity application to layer wrapper, allowing + # any arbitrary operation to be optionally activated. + ReLUFuser(allowed_parent_types=[NodeKind.Convolution, NodeKind.InnerProduct, + NodeKind.BatchNorm]), + + # Rename nodes + # Slashes are used for scoping in TensorFlow. Replace slashes + # in node names with underscores. + # (Caffe's GoogLeNet implementation uses slashes) + NodeRenamer(lambda node: node.name.replace('/', '_')) + ] + self.graph = graph.transformed(transformers) + + # Display the graph + if self.verbose: + print_stderr(self.graph) + + def transform_data(self): + if self.params is None: + transformers = [ + + # Reshape the parameters to TensorFlow's ordering + DataReshaper({ + # (c_o, c_i, h, w) -> (h, w, c_i, c_o) + NodeKind.Convolution: (2, 3, 1, 0), + + # (c_o, c_i) -> (c_i, c_o) + NodeKind.InnerProduct: (1, 0) + }), + + # Pre-process batch normalization data + BatchNormPreprocessor(), + + # Convert parameters to dictionaries + ParameterNamer(), + ] + self.graph = self.graph.transformed(transformers) + self.params = {node.name: node.data for node in self.graph.nodes if node.data} + return self.params + + def transform_source(self): + if self.source is None: + mapper = TensorFlowMapper(self.graph) + chains = mapper.map() + emitter = TensorFlowEmitter() + self.source = emitter.emit(self.graph.name, chains) + return self.source.encode(encoding="utf-8") diff --git a/kaffe/transformers.py b/kaffe/transformers.py index cd8a07d..df8c75e 100644 --- a/kaffe/transformers.py +++ b/kaffe/transformers.py @@ -1,290 +1,290 @@ -''' -A collection of graph transforms. - -A transformer is a callable that accepts a graph and returns a transformed version. -''' - -import numpy as np - -from .caffe import get_caffe_resolver, has_pycaffe -from .errors import KaffeError, print_stderr -from .layers import NodeKind - - -class DataInjector(object): - ''' - Associates parameters loaded from a .caffemodel file with their corresponding nodes. - ''' - - def __init__(self, def_path, data_path): - # The .prototxt file defining the graph - self.def_path = def_path - # The .caffemodel file containing the learned parameters - self.data_path = data_path - # Set to true if the fallback protocol-buffer based backend was used - self.did_use_pb = False - # A list containing (layer name, parameters) tuples - self.params = None - # Load the parameters - self.load() - - def load(self): - if has_pycaffe(): - self.load_using_caffe() - else: - self.load_using_pb() - - def load_using_caffe(self): - caffe = get_caffe_resolver().caffe - net = caffe.Net(self.def_path, self.data_path, caffe.TEST) - data = lambda blob: blob.data - self.params = [(k, map(data, v)) for k, v in net.params.items()] - - def load_using_pb(self): - data = get_caffe_resolver().NetParameter() - data.MergeFromString(open(self.data_path, 'rb').read()) - pair = lambda layer: (layer.name, self.normalize_pb_data(layer)) - layers = data.layers or data.layer - self.params = [pair(layer) for layer in layers if layer.blobs] - self.did_use_pb = True - - def normalize_pb_data(self, layer): - transformed = [] - for blob in layer.blobs: - if len(blob.shape.dim): - dims = blob.shape.dim - c_o, c_i, h, w = map(int, [1] * (4 - len(dims)) + list(dims)) - else: - c_o = blob.num - c_i = blob.channels - h = blob.height - w = blob.width - data = np.array(blob.data, dtype=np.float32).reshape(c_o, c_i, h, w) - transformed.append(data) - return transformed - - def adjust_parameters(self, node, data): - if not self.did_use_pb: - return data - # When using the protobuf-backend, each parameter initially has four dimensions. - # In certain cases (like FC layers), we want to eliminate the singleton dimensions. - # This implementation takes care of the common cases. However, it does leave the - # potential for future issues. - # The Caffe-backend does not suffer from this problem. - data = list(data) - squeeze_indices = [1] # Squeeze biases. - if node.kind == NodeKind.InnerProduct: - squeeze_indices.append(0) # Squeeze FC. - for idx in squeeze_indices: - data[idx] = np.squeeze(data[idx]) - return data - - def __call__(self, graph): - for layer_name, data in self.params: - if layer_name in graph: - node = graph.get_node(layer_name) - node.data = self.adjust_parameters(node, data) - else: - print_stderr('Ignoring parameters for non-existent layer: %s' % layer_name) - return graph - - -class DataReshaper(object): - - def __init__(self, mapping, replace=True): - # A dictionary mapping NodeKind to the transposed order. - self.mapping = mapping - # The node kinds eligible for reshaping - self.reshaped_node_types = self.mapping.keys() - # If true, the reshaped data will replace the old one. - # Otherwise, it's set to the reshaped_data attribute. - self.replace = replace - - def has_spatial_parent(self, node): - try: - parent = node.get_only_parent() - s = parent.output_shape - return s.height > 1 or s.width > 1 - except KaffeError: - return False - - def map(self, node_kind): - try: - return self.mapping[node_kind] - except KeyError: - raise KaffeError('Ordering not found for node kind: {}'.format(node_kind)) - - def __call__(self, graph): - for node in graph.nodes: - if node.data is None: - continue - if node.kind not in self.reshaped_node_types: - # Check for 2+ dimensional data - if any(len(tensor.shape) > 1 for tensor in node.data): - print_stderr('Warning: parmaters not reshaped for node: {}'.format(node)) - continue - transpose_order = self.map(node.kind) - weights = node.data[0] - if (node.kind == NodeKind.InnerProduct) and self.has_spatial_parent(node): - # The FC layer connected to the spatial layer needs to be - # re-wired to match the new spatial ordering. - in_shape = node.get_only_parent().output_shape - fc_shape = weights.shape - output_channels = fc_shape[0] - weights = weights.reshape((output_channels, in_shape.channels, in_shape.height, - in_shape.width)) - weights = weights.transpose(self.map(NodeKind.Convolution)) - node.reshaped_data = weights.reshape(fc_shape[transpose_order[0]], - fc_shape[transpose_order[1]]) - else: - node.reshaped_data = weights.transpose(transpose_order) - - if self.replace: - for node in graph.nodes: - if hasattr(node, 'reshaped_data'): - # Set the weights - node.data[0] = node.reshaped_data - del node.reshaped_data - return graph - - -class SubNodeFuser(object): - ''' - An abstract helper for merging a single-child with its single-parent. - ''' - - def __call__(self, graph): - nodes = graph.nodes - fused_nodes = [] - for node in nodes: - if len(node.parents) != 1: - # We're only fusing nodes with single parents - continue - parent = node.get_only_parent() - if len(parent.children) != 1: - # We can only fuse a node if its parent's - # value isn't used by any other node. - continue - if not self.is_eligible_pair(parent, node): - continue - # Rewrite the fused node's children to its parent. - for child in node.children: - child.parents.remove(node) - parent.add_child(child) - # Disconnect the fused node from the graph. - parent.children.remove(node) - fused_nodes.append(node) - # Let the sub-class merge the fused node in any arbitrary way. - self.merge(parent, node) - transformed_nodes = [node for node in nodes if node not in fused_nodes] - return graph.replaced(transformed_nodes) - - def is_eligible_pair(self, parent, child): - '''Returns true if this parent/child pair is eligible for fusion.''' - raise NotImplementedError('Must be implemented by subclass.') - - def merge(self, parent, child): - '''Merge the child node into the parent.''' - raise NotImplementedError('Must be implemented by subclass') - - -class ReLUFuser(SubNodeFuser): - ''' - Fuses rectified linear units with their parent nodes. - ''' - - def __init__(self, allowed_parent_types=None): - # Fuse ReLUs when the parent node is one of the given types. - # If None, all node types are eligible. - self.allowed_parent_types = allowed_parent_types - - def is_eligible_pair(self, parent, child): - return ((self.allowed_parent_types is None or parent.kind in self.allowed_parent_types) and - child.kind == NodeKind.ReLU) - - def merge(self, parent, _): - parent.metadata['relu'] = True - - -class BatchNormScaleBiasFuser(SubNodeFuser): - ''' - The original batch normalization paper includes two learned - parameters: a scaling factor \gamma and a bias \beta. - Caffe's implementation does not include these two. However, it is commonly - replicated by adding a scaling+bias layer immidiately after the batch norm. - - This fuser merges the scaling+bias layer with the batch norm. - ''' - - def is_eligible_pair(self, parent, child): - return (parent.kind == NodeKind.BatchNorm and child.kind == NodeKind.Scale and - child.parameters.axis == 1 and child.parameters.bias_term == True) - - def merge(self, parent, child): - parent.scale_bias_node = child - - -class BatchNormPreprocessor(object): - ''' - Prescale batch normalization parameters. - Concatenate gamma (scale) and beta (bias) terms if set. - ''' - - def __call__(self, graph): - for node in graph.nodes: - if node.kind != NodeKind.BatchNorm: - continue - assert node.data is not None - assert len(node.data) == 3 - mean, variance, scale = node.data - # Prescale the stats - scaling_factor = 1.0 / scale if scale != 0 else 0 - mean *= scaling_factor - variance *= scaling_factor - # Replace with the updated values - node.data = [mean, variance] - if hasattr(node, 'scale_bias_node'): - # Include the scale and bias terms - gamma, beta = node.scale_bias_node.data - node.data += [gamma, beta] - return graph - - -class NodeRenamer(object): - ''' - Renames nodes in the graph using a given unary function that - accepts a node and returns its new name. - ''' - - def __init__(self, renamer): - self.renamer = renamer - - def __call__(self, graph): - for node in graph.nodes: - node.name = self.renamer(node) - return graph - - -class ParameterNamer(object): - ''' - Convert layer data arrays to a dictionary mapping parameter names to their values. - ''' - - def __call__(self, graph): - for node in graph.nodes: - if node.data is None: - continue - if node.kind in (NodeKind.Convolution, NodeKind.InnerProduct): - names = ('weights',) - if node.parameters.bias_term: - names += ('biases',) - elif node.kind == NodeKind.BatchNorm: - names = ('mean', 'variance') - if len(node.data) == 4: - names += ('scale', 'offset') - else: - print_stderr('WARNING: Unhandled parameters: {}'.format(node.kind)) - continue - assert len(names) == len(node.data) - node.data = dict(zip(names, node.data)) - return graph +''' +A collection of graph transforms. + +A transformer is a callable that accepts a graph and returns a transformed version. +''' + +import numpy as np + +from .caffe import get_caffe_resolver, has_pycaffe +from .errors import KaffeError, print_stderr +from .layers import NodeKind + + +class DataInjector(object): + ''' + Associates parameters loaded from a .caffemodel file with their corresponding nodes. + ''' + + def __init__(self, def_path, data_path): + # The .prototxt file defining the graph + self.def_path = def_path + # The .caffemodel file containing the learned parameters + self.data_path = data_path + # Set to true if the fallback protocol-buffer based backend was used + self.did_use_pb = False + # A list containing (layer name, parameters) tuples + self.params = None + # Load the parameters + self.load() + + def load(self): + if has_pycaffe(): + self.load_using_caffe() + else: + self.load_using_pb() + + def load_using_caffe(self): + caffe = get_caffe_resolver().caffe + net = caffe.Net(self.def_path, self.data_path, caffe.TEST) + data = lambda blob: blob.data + self.params = [(k, map(data, v)) for k, v in net.params.items()] + + def load_using_pb(self): + data = get_caffe_resolver().NetParameter() + data.MergeFromString(open(self.data_path, 'rb').read()) + pair = lambda layer: (layer.name, self.normalize_pb_data(layer)) + layers = data.layers or data.layer + self.params = [pair(layer) for layer in layers if layer.blobs] + self.did_use_pb = True + + def normalize_pb_data(self, layer): + transformed = [] + for blob in layer.blobs: + if len(blob.shape.dim): + dims = blob.shape.dim + c_o, c_i, h, w = map(int, [1] * (4 - len(dims)) + list(dims)) + else: + c_o = blob.num + c_i = blob.channels + h = blob.height + w = blob.width + data = np.array(blob.data, dtype=np.float32).reshape(c_o, c_i, h, w) + transformed.append(data) + return transformed + + def adjust_parameters(self, node, data): + if not self.did_use_pb: + return data + # When using the protobuf-backend, each parameter initially has four dimensions. + # In certain cases (like FC layers), we want to eliminate the singleton dimensions. + # This implementation takes care of the common cases. However, it does leave the + # potential for future issues. + # The Caffe-backend does not suffer from this problem. + data = list(data) + squeeze_indices = [1] # Squeeze biases. + if node.kind == NodeKind.InnerProduct: + squeeze_indices.append(0) # Squeeze FC. + for idx in squeeze_indices: + data[idx] = np.squeeze(data[idx]) + return data + + def __call__(self, graph): + for layer_name, data in self.params: + if layer_name in graph: + node = graph.get_node(layer_name) + node.data = self.adjust_parameters(node, data) + else: + print_stderr('Ignoring parameters for non-existent layer: %s' % layer_name) + return graph + + +class DataReshaper(object): + + def __init__(self, mapping, replace=True): + # A dictionary mapping NodeKind to the transposed order. + self.mapping = mapping + # The node kinds eligible for reshaping + self.reshaped_node_types = self.mapping.keys() + # If true, the reshaped data will replace the old one. + # Otherwise, it's set to the reshaped_data attribute. + self.replace = replace + + def has_spatial_parent(self, node): + try: + parent = node.get_only_parent() + s = parent.output_shape + return s.height > 1 or s.width > 1 + except KaffeError: + return False + + def map(self, node_kind): + try: + return self.mapping[node_kind] + except KeyError: + raise KaffeError('Ordering not found for node kind: {}'.format(node_kind)) + + def __call__(self, graph): + for node in graph.nodes: + if node.data is None: + continue + if node.kind not in self.reshaped_node_types: + # Check for 2+ dimensional data + if any(len(tensor.shape) > 1 for tensor in node.data): + print_stderr('Warning: parmaters not reshaped for node: {}'.format(node)) + continue + transpose_order = self.map(node.kind) + weights = node.data[0] + if (node.kind == NodeKind.InnerProduct) and self.has_spatial_parent(node): + # The FC layer connected to the spatial layer needs to be + # re-wired to match the new spatial ordering. + in_shape = node.get_only_parent().output_shape + fc_shape = weights.shape + output_channels = fc_shape[0] + weights = weights.reshape((output_channels, in_shape.channels, in_shape.height, + in_shape.width)) + weights = weights.transpose(self.map(NodeKind.Convolution)) + node.reshaped_data = weights.reshape(fc_shape[transpose_order[0]], + fc_shape[transpose_order[1]]) + else: + node.reshaped_data = weights.transpose(transpose_order) + + if self.replace: + for node in graph.nodes: + if hasattr(node, 'reshaped_data'): + # Set the weights + node.data[0] = node.reshaped_data + del node.reshaped_data + return graph + + +class SubNodeFuser(object): + ''' + An abstract helper for merging a single-child with its single-parent. + ''' + + def __call__(self, graph): + nodes = graph.nodes + fused_nodes = [] + for node in nodes: + if len(node.parents) != 1: + # We're only fusing nodes with single parents + continue + parent = node.get_only_parent() + if len(parent.children) != 1: + # We can only fuse a node if its parent's + # value isn't used by any other node. + continue + if not self.is_eligible_pair(parent, node): + continue + # Rewrite the fused node's children to its parent. + for child in node.children: + child.parents.remove(node) + parent.add_child(child) + # Disconnect the fused node from the graph. + parent.children.remove(node) + fused_nodes.append(node) + # Let the sub-class merge the fused node in any arbitrary way. + self.merge(parent, node) + transformed_nodes = [node for node in nodes if node not in fused_nodes] + return graph.replaced(transformed_nodes) + + def is_eligible_pair(self, parent, child): + '''Returns true if this parent/child pair is eligible for fusion.''' + raise NotImplementedError('Must be implemented by subclass.') + + def merge(self, parent, child): + '''Merge the child node into the parent.''' + raise NotImplementedError('Must be implemented by subclass') + + +class ReLUFuser(SubNodeFuser): + ''' + Fuses rectified linear units with their parent nodes. + ''' + + def __init__(self, allowed_parent_types=None): + # Fuse ReLUs when the parent node is one of the given types. + # If None, all node types are eligible. + self.allowed_parent_types = allowed_parent_types + + def is_eligible_pair(self, parent, child): + return ((self.allowed_parent_types is None or parent.kind in self.allowed_parent_types) and + child.kind == NodeKind.ReLU) + + def merge(self, parent, _): + parent.metadata['relu'] = True + + +class BatchNormScaleBiasFuser(SubNodeFuser): + ''' + The original batch normalization paper includes two learned + parameters: a scaling factor \gamma and a bias \beta. + Caffe's implementation does not include these two. However, it is commonly + replicated by adding a scaling+bias layer immidiately after the batch norm. + + This fuser merges the scaling+bias layer with the batch norm. + ''' + + def is_eligible_pair(self, parent, child): + return (parent.kind == NodeKind.BatchNorm and child.kind == NodeKind.Scale and + child.parameters.axis == 1 and child.parameters.bias_term == True) + + def merge(self, parent, child): + parent.scale_bias_node = child + + +class BatchNormPreprocessor(object): + ''' + Prescale batch normalization parameters. + Concatenate gamma (scale) and beta (bias) terms if set. + ''' + + def __call__(self, graph): + for node in graph.nodes: + if node.kind != NodeKind.BatchNorm: + continue + assert node.data is not None + assert len(node.data) == 3 + mean, variance, scale = node.data + # Prescale the stats + scaling_factor = 1.0 / scale if scale != 0 else 0 + mean *= scaling_factor + variance *= scaling_factor + # Replace with the updated values + node.data = [mean, variance] + if hasattr(node, 'scale_bias_node'): + # Include the scale and bias terms + gamma, beta = node.scale_bias_node.data + node.data += [gamma, beta] + return graph + + +class NodeRenamer(object): + ''' + Renames nodes in the graph using a given unary function that + accepts a node and returns its new name. + ''' + + def __init__(self, renamer): + self.renamer = renamer + + def __call__(self, graph): + for node in graph.nodes: + node.name = self.renamer(node) + return graph + + +class ParameterNamer(object): + ''' + Convert layer data arrays to a dictionary mapping parameter names to their values. + ''' + + def __call__(self, graph): + for node in graph.nodes: + if node.data is None: + continue + if node.kind in (NodeKind.Convolution, NodeKind.InnerProduct): + names = ('weights',) + if node.parameters.bias_term: + names += ('biases',) + elif node.kind == NodeKind.BatchNorm: + names = ('mean', 'variance') + if len(node.data) == 4: + names += ('scale', 'offset') + else: + print_stderr('WARNING: Unhandled parameters: {}'.format(node.kind)) + continue + assert len(names) == len(node.data) + node.data = dict(zip(names, node.data)) + return graph