From 23416e81b0f9e9c370180b9266c2b4aabfe277d8 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 22 May 2019 12:41:04 +0000 Subject: [PATCH] modify ce file code style of 01.fit_a_line and 02.recognize_digits --- 01.fit_a_line/_ce.py | 31 +++++++++------- 01.fit_a_line/image/prediction_gt.png | Bin 32130 -> 32106 bytes 01.fit_a_line/train.py | 51 +++++++++++++++++--------- 02.recognize_digits/_ce.py | 28 +++++++------- 02.recognize_digits/train.py | 43 ++++++++++++++-------- 5 files changed, 93 insertions(+), 60 deletions(-) diff --git a/01.fit_a_line/_ce.py b/01.fit_a_line/_ce.py index 14490d8..444a202 100644 --- a/01.fit_a_line/_ce.py +++ b/01.fit_a_line/_ce.py @@ -9,28 +9,31 @@ from kpi import CostKpi train_cost_kpi = CostKpi('train_cost', 0.02, 0, actived=True, desc='train cost') test_cost_kpi = CostKpi('test_cost', 0.02, 0, actived=True, desc='test cost') -tracking_kpis=[train_cost_kpi,test_cost_kpi] +tracking_kpis = [train_cost_kpi, test_cost_kpi] + def parse_log(log): for line in log.split('\n'): fs = line.strip().split('\t') print(fs) - if len(fs) == 3 and fs[0] =='kpis': - print("-----%s" % fs) - kpi_name = fs[1] - kpi_value = float(fs[2]) - yield kpi_name,kpi_value + if len(fs) == 3 and fs[0] == 'kpis': + print("-----%s" % fs) + kpi_name = fs[1] + kpi_value = float(fs[2]) + yield kpi_name, kpi_value + + def log_to_ce(log): kpi_tracker = {} for kpi in tracking_kpis: - kpi_tracker[kpi.name]=kpi - + kpi_tracker[kpi.name] = kpi + for (kpi_name, kpi_value) in parse_log(log): - print(kpi_name,kpi_value) - kpi_tracker[kpi_name].add_record(kpi_value) - kpi_tracker[kpi_name].persist() + print(kpi_name, kpi_value) + kpi_tracker[kpi_name].add_record(kpi_value) + kpi_tracker[kpi_name].persist() -if __name__ == '__main__': - log = sys.stdin.read() - log_to_ce(log) +if __name__ == '__main__': + log = sys.stdin.read() + log_to_ce(log) diff --git a/01.fit_a_line/image/prediction_gt.png b/01.fit_a_line/image/prediction_gt.png index 0d4138d369aac72614874469b81578a60df877b9..e029d2a75fee63dd14e53a1b6be29611362293a5 100644 GIT binary patch literal 32106 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
M2 zQUjZ!&t2nPr~30<^8x&Watboy@fq;*=#7kxF`vLN5h7qc@=#y@hTxcM;&Lnur#{Wr z5r;u>?I{WvBD%rGmJXguS?nlghq@5G^P$M*@}-33%mN#IJ-zCwlB0#dDTZkT%&z!u z?9@)5-vO>13Ad0{XHl>*&@-#w;bxJf)Kn4*iia;>zRY#7=*y6EcXxmP&wPT>g#L6e zBuL}6J@2b|lf@|0Qtvqb9Ic+=Uz;9@S+m{KSDcCe*;Slk6@^pv^-k7KajH+JKvBJ( zx@OV2> zK(w?4PYbx9N~l2yAlaGTnKg6Guuy0R_%w4pJI77z6(lM|sqeTT9Xav%^e*-U1RA=X z2ZJ%+730PQ`!k=Vlff`IjB)%LIE2?yzQbq)Q}DCoN2Jiy4=k5%sdXu(J^n3&EvsMP ze(Dp>37sxQClQRC>4D%&G4pXw>n9Z_!+%^NeB!Jv7m9X`j4)@KQWT0y=jz)LC)%B+!U8duEe!seFE!Pep8eJRQgA$^ab-a_UX$PF;Mm^` zT#;cPU8mR|FF(^>oA&qtjTIH(uJrQ|b1>~8Yi!I6gKyVi8fiCL{CM9(XUub30bVg` zgie$q4Eg_rwRM;;sT52*C@g2$Q#N(cIxP7o8SEsXZG;jiC-qfVuXwRG%_W%=3+BDD z_)ih&{Z@eIrrMF-KF*X5HH&L&DDFw?-?^XA{YAg2g8sICcvJcJ^I>C*D|(l|J>7l4 zoXR7sB~62t^pr89YFRP-=N9#q$ijHOB!)M}tUy*O^_aI%2)pasks2+6+A4$GNLo4R zktU05aQZ(aDAVkJ?<35%vcI}5HnwPotoX&9Te4PW%3ZR=W*=K#aGgxAcQQM3+)Y3W zJiWfV&a~r3&NRe!d;nC;4$igzYQ9_>i5k<#BjR0*1KV!@S%EbV>M`gN?C#j$y~cXI z_#&GP3EX2x^XH-%u)jzs{i+-I8%e6(XdYN&T&z4lLeUJq9<}C*;E^0V;h88pn#Vu= z%B2QF6<8Z{(Siz~W!F+bT1g)(u0q@N4WPzQkGY{Ujf%L}YBvHr3N+!YQHVOa4y#wJ z|2pRM5VLVq$h1Hn3V*$)csCfGVd#19$c1TzU^dmujMU2Yl^>eT+Me;{GZ);WjmfFZ zJKLgfi~eo*!Qybg*&?BAWwY$hDu?xXIfs_;n8$5~uLwCD5{3Mw2-bvGAt%IUHWQuhWU^MXjStAMNB+y=R<`I^g-O%cv-#{IO zX@64K+MJQ6YqTC1jLIeH+FE}HY6$-c1eq?p=T~U>IL`(B3n2_B{w8UWwHfeT~+s9HntNE7s>JA$3)Vzq zxunjHiR8cz22xOKetgm=V$_?i&xIZzgV_5V%n}6}ZUo3m03Po)Uvu6p#zxg0qR7~k zEw}$^WVk(5!h#$27T;n+Ty&jW-o4y@a2MmQW9GUkzKbx?IQUIKSqw1ew`|@t;beIY z%(y__#e=LZYq&$P`fY1|0wyqGg1>!A>I4 zu}ND?s-+|w$F;mhn=pNY(df(@`iv3!rKl1R;RsE;_#-v%a5PK$0UUy-8pcMEpQOql zdB67mBuqpecFM7cvz)%3Pbfd}P){#q<&P1h>hZjy7C0?i<5P%cEhw~IYYeY=+<)$m zn3DCj&G3KiuQJBM!@GzvaXhom<$BiBu5z3A1L8V2WP(1y7V1bvvc^udW`0=mpNiy% zM71u2&FuFwM;nrGhKOEsqnBlg^7T{Yfp7*i+cZ^6qy)kL%v8XpxAeQ=a4eX!|G0NF zJhNa-UhSV`h9=2?rRrXAV2UrBuPt2qt=Es)G0^eFJsxauhRs=O9cOs~o1KTpvIr=_ zBmy*7YloC88iYPL20B5SRut~V%LGp1ZP&@O6)dUy zyZeF5PL2LMGK&OkHm%e=I8qXXsH*KXWIe+twP#!B#o1NFi+Z2w*7YWi!Lr^0r!4FV z2$8U`rsPMhiiY6c!i-lGtqdy<`uV@uw6ZLJGz<(nQ#g)^ZQwguT$052Mrc!5Ly((8dd8o!MB|nxwUUyH-Oqdl(M!#)3VmkZkE25EO>p;Ts zEL;X;4;ecJMHyqjcVMz(Z`b&H2DX zaSekejuUhmbLu8R^{eWvW2RK=DEE%zj^xRbNvGW>3c?pJUHlGZ8 zyz6EJdGUU$$D(K=7qai|#-+>R-44Fb3&L=R1(r_%)S2Ql1HY0Ct(=fz3YWr?u!xAt zw!*|=n2prP4E8A19C9Rzq(paZA#;`(IHg{*@t}eV|(946CW|9!i0=<{@ezY6vqT-UszoHg>Ox_ z3>s|sv>HuL1h8U8ajFKE8=^nAQ(v~=Bk(mWZtNlJc$qes)}|EQnTSuvbTt0wpmIW~ zKTX>W44Vvj?RnO-lZ|O``ijzLwF%1IZ%O4o^9vF1srwq1?KsNC_5*#z&(U97f(=Cx zQ_|6v8UFZWcUvbAHMVdo zL{i`RX2Pd0p>^OFYkdCw7A8Kygkao$Z2W#62loOAIkBwgs_T*VV2HQ+o`cmSRCbc{ z)7?rKXuE^I&puP|EIZVVISe@V2=6x8k>F~lgLVSC-?VlzE60Q`*a{NEXOxIHnIx53 zKbHh`D(6nE@)!n({*yFktiVb;n{fpp@1B@T{f3ycL zJfqXzxV3KMnE)+R`}1%MXPOXa@KS-5ewOhd3yltINjp(l5vfS8bHK{L=poEjh>5l; zN^a&D@#-CYd%;hu$J1=k?D3$`JMg)#P?Kq{l&{L7w%4DX&vlPWIFZKQJ-hqSRPwdD zwd*^n^D6mc8Fz})6EzIi=R4#NIU7i`b??4Vq(bo*zr)^V=N1i?Eiszo@QgU2<=XLl z1+@LJzr}|KIQ85JPveTI&U`;(<=>;zK4gWW_|4p(b_K;5N+?$wgL|C^5{Diz&Nrnu zcXumrOI}P6dMl8uW>*G*5RO#Qa;$&TkrqeIh=G6OU*R3lRc@8@-&p{96>mpc{2Uxx zlU7l;()D3!)gW7W!n}ofRJgCq$XwGRBVzu{nKCQWfn%J>r?ItFH|2v5sZ?tv>FiRp zI=cORSm>Ez8Cz2q1GA)QHF4`L&*i{iU>_*()!jS4r~mZEvP%Egq&9jeOk9)TAA8B!~F3heRE{6;ZMpJ-77zpJJ9vL z8bAt{Mv}tdp5bG~>Eag+`8R(&db`}*1UQ3tnc$A_*M0YmXxyj*E3&{n&Khn4cCx_1 z&=DAj*@liV;HSyyzx2VqO1jesf>ji5|EFV}-NWF5{BN$ojMPuIRRM z2Ttg+oES~&Y808=@c&K7qhEhvOyd-%{YNy<=G=QASNhJXw^`7OR#lAe)4CAO%(AHk z0h=_N^hcnOLw=6~V`3>Xeeg>mp6@`{058X|+@SDqO|r3QA-6f@w3m-hoKH5`1WM-z z{KzJKeT2I=c)V!O)FG||{R)n?rE8+P(=I&MZ0)c_o%O&W^CC5KMkMt7EC$_QvWZJB z%AE!rl?^RF^ULpfbhZDb766^WmZ5Z7Hg zo-PS7^bFZt!=GUs^682XGNUfen~n1nIN*b3MJfJixjFrCJaq2Oh(}-d6}%|j8`>uI zn_Q?Cw_X(DwTHT$_$KjC7UlElO2R~_W)lSRrK;8+l~T%NGJ6aRy646Z0mD;qnt@%2?<&LCU#E9Ffgwmy^xcEJW?&S>6$!ProNj zvI!sUJcV0H$JE5YGA5ch9vvqaJ$n-4Pch_v>-)2NyZcM*d8qceDEfp+up0VvbE>!{ zDpn1xZR|wV0_U&2K03@)vt=N)-mUJPxi)hJ=9;!|g%$pd6eXXU`eve3G*8!f-cT=7`KqX8Wb^vfCO(KdJ~sxa4T_x{oOaOt)X_3~NBbhd+WTMfH2U)#+T>03C&93So( zy;t@w(Y#1Xy7rmuW9eJ6VkXT%wWoun@`2hnER4qcjoHHnKk^uN9G-4k`Bihb*~ba@ zA0N8L;+mYt3Y*NiC#=7CSmvZz6yz`XcPBAraFVM|@-0thBeKzRS;?;TD{8^PDI9l6 ztZJ;nBkFv^Gb_`U18H7tc05brb876L?H-q85@#HpVr9y{hR9qR#9fv^syZ8q=u@#d ztoe+qy!NYKVF`0dx^`*le7yJVTKQgoey8=Io6qVonR=K{V|NHi-Yvf)lI1*R=gSxs z7>;S(?+!3F`AdI9_0E#wqtr{|f|RUg_F24BO&pc(o!lRAd`S}0=KfZ>R{oFO3t7Tc zS9ObAL1pCH?U!ss85bs&eyfw8hM5@G)zBdDPF7 zyDGi6JKES3&WOiKEbYhkCQ8%z>Yg(N%FB~_cp9atoicL|<4Mw|Rk;zYs?29L97im= zB|9VGm3+mcIX;#D?tn(|@iv81CuyjfdI4tJ+V%RUT90UUS$a|%N9bbP#NKCjN2JB2 z@E%tWO23tUIj)$H-bzAsrN!46Yhc_*QhV9CzJD>0S`aG9kA?v%X{C=HXAJD|_u;Zv zXcdJYzwjHxSvngcThSn<*33bXXuAKJR6$~!gsK~AsX4Od{t{^Nehhd@oFSP{=euO| zD{nDPLF~!=D+82TLMj{Wlju%S?~YCKkZzQnE~XcZw2-5Mndt>4b@|Tg=NMx+vXp<{ zLOxvkVHT5uVNCtg?<+N#7e=Y`?5cB~$$fM4$v%d9wbc&=c|>y#sP=-Q=(0h&%DA8B z4>ntB)SDblrlvRa2Ucqb4%-y7I8CZ;38*)>cc3>I~O)aV~;A zt3xMNk%epQgrQMKsNuJDYY}R$9BCWj4a?#yQ8s=_>Bm9o*E;*VNZA7&VbaUfk5S!D zq}gmGEODabS>~4i*xBqz_tunEWkf zm1T}q6(ZVRXd7?3pF5f#GZf6(UHZwDH}nz{+s55tB8`3v?LR(vVKmV)0)`D(d;>im zBnrRyF|Oa>c%@EOaj$FRdi?3xb4BCW{Gvx5PtiB?+{53wq)=s2a&T+*Nh)E!1+K?_ z4XJt+E`3$5A-9)^YTD=RJ!0aGcEKET(wjG{NR*_~l;=uDOTT-#T)gxek7Oe0jGH{t zpoCp1ugUnr5zf_^tE~V;8JsNs1nM~26^r+JB5zfU?r|{1GEoe9-oibi@9GexOEEr- zX7}+FW-H0QF4D$6<;^gC!O)xfKHOr7;`*bl=9g9MXLNbDm_67OZfgwT-K5X|T%`37 zVtvxaf4b`KRF(AW(>M6@@0C?1&yFWc*W29a>0Q@^Dfky0zr872zW}e}Y$Tk|&`4^0 z$J|-LJ3k`Va!{BoBNT0FxNC~m zxMKWFoJjG1b@!HGQLo{<=um>7un+{5QWOyB4oO9kMx;9gq`OlEK@gB;Xi!0=rMp2I zrMtVOVSxRNYwiEu=eo{^^ZD?FYi54&=JP&z-##BdN1BAMKB!kY+R+m=VN+&Kwvt2< zx_ggBg0?r)(iATJ<-xB!DbaWd?zCfuE{#41xr0zqoF}a|ICY-CaGya@Sj>oH+~8}$ z>ucLfkv?SIksl~<&rVaU(+DoV?h)b2@jWg!i!?h+5a2S^2V9h7AL?Z9TR}6_sWF=Q z2+g9hqYddOcJYVY{fW-&2tB>s^LOtaAvqOGvM(=&hXXoGrVRzD@+*w&#(u)iNx=mB z*9-iD(_hVUJP$?^Q^ErAj<$T#j9MRkyCY-n{(vgOX*yF!)L3uun<_(wW8#~XJiRoL zQqrnM#sIg~%1retQw~XmIN<=9==;q(FItah(rC)KR=Y91M5t=7BX*zA+%EqJYmVKi zQMqDpqkV}=lx-Mys^a=+iT}n0^N&?qu~KVxGo|`~A0Mu8$v}1>34S3qwpgY-yE&}}1e8@x8W6B|$JTU-5}ii+;)Ml+jX8U>SOHqIss|8oN``T_EVYuV)^ zmG5z<$#iQnSH%pw6!2F5ESCp=Fb&~3TTFOF@H*xEoUyuQBf7dt={RBmxnIY;F+YQI zK({^@IVCzXw@+iLFl(m$g=21$8kclDc}mcm39%R~B4&TbSTbfoeUyXx`{_R^PN-~s z>iz}JNUmhh-`HI2EKeMk8U~)^7d3ylX=1Xo$Tj%Kp8vMst(H)KdO7^sceDDxXm@wj zi|}UW*v`%$2R!P__!##}9&VcQd8~Bp^XIyqxsNd>n%-WXvUM`DetVeX0Rt=C;_OV! z)IxzBNmAvwhmrr_?PeVHnrpFg#S(mDdbqFr;4L|!N&lbcP~}%Ao_DF*bu0JK_B+og zQxkKL!SZZcxvuE^;GHJ!u(re9<)a)#9NP&(%9>OAW|V6&HllAc;px(7((Xm7&pA{M zvem}zVqmblbMLK2U$oXJdmO~E%%30D_KEk;_*QPd5%HStez-9p?72#cI$^p(VWN4` zO=wtCqgcsXbwrCgo!TDKTbfE{tF32b>2f5e5qhObO+@wPuH^LcbCTOsgj|<6nABOd zOd96Dy;$_>Y@C@cIM}xHx{-h7>A7b(#gr#kkr`H3!sAa*m#kDev)mpo{yMFkTo*La z^f!;nsn5nWeV+9wr^8!zN2s8!peZ9xipIid=(mwI(WK3(_rVRZVgy-Y$AuMXxOUf= z2;1q!MsC}ZYgHM4-$bQzju{5CN_){i`z6opvVVoST6v8Gt>9~;^LdovB=m94| z_q~PEcpU6FP9qcU*Eyjm|&Bvd+#XOqq8aO=g&7xC8?HE z*5;?vSbcKHFV0r3XZvrEafWoU9kPK)?l$J~$i&3m6Z?hf7_Cl^zFJY`ocL3tB%41H zFF#-Q@fUKVt>vW|=`5b>yfRkCm-c&yV7yFQVAr8SeW)lePa}_$^P2epXQZZP(e&}# z$eYFX+^nS<_sfjBLOsW4<{A>7vr!vct!v(rHBZ&3^OwM2r`f}Z81JW6OOTV~{l#8& zC(AvzVh>lnq*FGZ-*Y(eaG%G3ojyZsjhQrnP`uWgem=3>TOY}pQ7K4&33bN8v=x!a zkMSb2LCXe7R$J(@hKI+llh`9_^QhxX(YQvHr?j`Sd*QW!7eu=wS6r9FcE_jJbJs~2 z^xLjE2s-}sTVc`aTp2EK*rcYwuHJfwyx7}Rm9pckkkH!P&B6_#Xv`^%mtvV6FpM-p zmYL92-`acd(Rzw&<$rdJG$B*l`wt|07Qe%u=R93F3uR=?@YoKZk=Gk6`iAt^s`0ER z*NoF+l;)`^E*pM~u(Gvwa7O!46E zG1u2`Z#S|V`f2|#0@*;1Wq zcN30<3^|9Ax`q9^k5SlL)u!}zmZOgD)eX$V#Ea(_C$X2)Raw5hkmadNzgbw)X?Xm4 zA=Y!suLyhdWHxvGRM3`vbJK3myq7@ITT|=tqfYm?A-9k{$}vSneKNnZbu2{Kc6JsE zT@EZa!F0*+_g+!z3t@iJ*wPwCyAaa>Whu*-#sSnwHFj1bLjfYJgr#GsV<9hl{!X(K z$1Emh<@!9_%J=oc7Q5LFc|xwe8=;}y#||sK^&28~>B|KB+^u1i6Fnkp&H;Y&sN?>; zE$7O9bWwfgQG;^_D&iO{Fg8ChU#Q)SSQl9z|{1#_}N&sxys z9g!$^%9rrFU7I(_Bd?!JM|0xt_lWXwd6rso5Iko>UB92%C#8(MkI1lz_pTr79uW+9 zy2aN{=)==7@N$T&GW)8J{yQQG32o1ao*%|;qx1@Y%vO}NXhehJTM*Kdln+e?CACVs zJLAWy$2?z*72+Oj^3+Dfrpu7;hEy2Ka8dNg#0;XnQNEXbq@+wbO6=xjnPO5>+`9C< zS9tPD0d&yRWNt9e=778=Zl#as=~uksAoJ#f+S0mhT75NMwe^YzJFct?8DC;tfJdcHEwFhpxKg zrIdiRJU$uwqocUG-x*h{_O5vzAdiiXj+YjvxEl3z6Bg!XJEu{tG<>+nbz*%gE*EEu zV-q_B8*B^Zyi^=4lq`g};{N#T=24e@STy4>mPAph+b#m3)Lmm6tS%*)+A)(M?pP*_ zv0ak9rh1$9<;w!449|_ykId)Pj`%%q^g1Fuk|*W_X4qs}LruQLK2WjOr6x8wr})cK4<$-XB84!UW8Xa?Hx4YGcA8ra`@i@?eAO4l~Cu?5HYdo1@bNr1N#AM*)N;Aw}O+(v;}RX7P7( zj@y~KDzuk8WCI%g+6A3DCktTXJDZv18wCh>?S|Z}R4L53{4PA4Ud(A7FPcejvL_Yq zWd)}|%q=3q<>MLmXRTGC294AHgsNDZcXe{KMdRW z4CYN!N+52kqnO#Es8DU)p*@Qt)x$@p2jxAiE`nXW@660hYL}jWvhU`MLCMH)vE-0P z@LbwnObE`PXEP0!x=k4H7C^XuL)FiE2Q|zwqy}}H-K-+T5eal`xzcyt?i)db$;-IG zF9TU!f~I4o3999HC1v?OhlSnz~teh!V{02nB?xfiOtlJ0U11gocE3O zTcd&|UFF|Za&mKzI&M*Vr?HXg3YGtitmeL;d&dT_6!B_S$<>j#VryRqWw(TqBD{6; zZMNE@O)Sj@95Srs@lWosJ0!=j^0s#*8c`J<>$;9zkrunTJ%kU0R4>60vy z6P;33buelX#iYjC6Q-3)lN#LRjak@g+#0%gTkQ)zYCqO&V62eAW}?Z!AY*@HUWz3B zy9(Fqt&_E`69=4;3g?=bPMHzf2fTx*dMd7#4+27-M*z)LsN)o^!OefSu_{zPNmiZZ zK`?pagv+i*za8}^-oBB+MhH#g-7r#}tIoEJdd#1HGLIGpj)}AhMDq5FM&)f?#6L{m z%>VlR(KQ;I!LQ?$Ly39M8~w-=E(K!l?6jH?bY@SjhTk&PB=)G{7PjaBI2o39wE8N|Rs_D{5!~kF}|_6}!rQK{hT+ zm&$zT-NQ{^&Eg>Mw6Qn3ZC;I+NHAkq{X;0a_;&pKcBcl1h8$&va;+*XH!FLJEXn5A zo=J1+kQueU>1gh=(zi5P_C7Q6?49}4;gb|miSjP^h)I$_DPt+koXM&1YyFeS%Zjep zUS750I~i_Q!taFp;d&UvR(0TPj3WKV>WhT(G{0yp#y$|H()Au;4#6=g16ZF7x_^pD zo)PC;A%w#SbX#uIV*Rh((G*a#LgX=m!FRhywCPC2EM*v;3C_3WKR*Pk(Ye@ z$!GavdA80&>oPBftZTe~j5FEX^1I*S?4HbP^G+D{_Wf&WI$Thj+_Yc&$1uK?R7d;? zpe5a=Z}FtgQs!t>zs2*T;`^+@2xsBK?CQWGibNr9AvuUWkP-0!v8b5#2uIgrg9k7( zohH|W({U6DB6P<$C+N#q)b%y58X3*>e}iFO;VyKt7~~dDe~jCgv~D{uLcc4krh_xr zV)v&+3y+$*lW~aAS-3FR-1z(TZVQr~e>7Np5&yS&_%due)ppAgL#VIBYSE@;vCHI* zcCEJwn@!tX$B6EpNZ-N#4-vHShPm&IGwvo!2z) zK8=eei(x4=4eRv3cQ0;+A58RaTpVN!DtN!)S=!F%iVOhM0@`Wv{@M^$zQ>{UV4fZt z6YQCk)C?Rmrp-auVY>wY&SxJ0wxUt^pz_pMu3m#6qM^LQ|78-5u%?bqEE6}Wb@la= zLq4BWg=B7)x1iLugsS9OV^YO+%`A0QZqx7RQ_rQaey}Np;?R$Jis!tAUcDIG(f!~0OCgh0D5i; zxw4ChhyY+O4H~lM7LR#vwTH_s?pJkyzLKLuu>FW2!u*|4JpsYn%w*2s>dkSp!8Aep zrXp;SlUI|_l;P?a;>dvtuIfiS6g8L>DHb( z=~f*#KVnmm5bEcfipyawr2kaC{buD>Ny1#~OdCU2_jCQ0)2O9vI>-y`ns7+W;E(S^{R~6#9-kX!WV!w!ri0xxiRWtfX_LRdlq&pFCrN|c=5olm z{FH!PQ%7Tl-?mOR<8<#u;rbw0yF+=C%wb;;_wDb1Dw%UY#_GrTqO-QrWhw4sWHFiM z+xDx>50oT?293gy?~S7$)Q3{_ru(lD9?N*=?`onG_t)3bFPsyy;HrlE&9R zR}H1W75327ik+9@IG=y7ZZlM%0|$0%PivUF!G1QYq=b;l*-1tM_k;Gt6yY)Edr4#7 zi^;4alUD-T@O@@xOiW4rYYia`agQcuT?bR_EdS)_RI}{e=Rnt*-(TdORUGO%crVG5 zr2jZ*VquM8pFXd%leHz* zk8I7Mn5jRFPn^d}5m8JUgqbb1fj<}Q1r2&{yROhVh}^*dV7R%p>>tiK8kM%cXdTX1 zv%1P^voA9%t*?Bgvqug#+r<9mOx)o$GUvo@X>ERJPO7C(|!< z{25uD?VnT~gnpagM^}W{MC~$jKr8}5`3cPtK&xasTFN(3yU>o@-KxR@NqMu(f1{uA z27mARe0VY;oLKDq*4i_orKAElV&NUO>rEWLbyg5U>PzCmSpe~YZJ9NfXj;R@ zuKTV6kYv+q7MPlm^cmnXt3FEC7_(WD?_1^b60ADS{U%-&^Y>;*GC}Yum)FlqOEhJL z(Abc@4-I73X}n6&kd;T)X~aM$UhU3qh+Q^8kMg<@c3f9y4`ZX2Lr*iRY*!L-OU=yE zj*fPA{}wNI&TF}NF?-G{)K^?4jAKm7wRe{utKUGKR|-r4e5r_~CT24kL^D~#I~EK_ zYK#$nM;3RKi5W2s47TUO6bmy10BF`ETYqr2Gj?{wG|gCs->xBhiJSzh_Usa!4B4x; z*%9>Zzw&Usn?opkJuJ-Rn28x_0Wnji1or~zTH?Z{ZTDpIkXT;MpITV|!$@OducCVS zwRcw-6WyCXF(N<`+3Fj4l4^b@U2*LzMF!P;;7_mm@kMa* z2R66I26QEKxz-R|#`6uKxPE>w0sY{(YA5G|i><(l#s+B#iSq)>k!F|6QZgNlcm5F(*`B(H zzeu6NEbI=Wwz6jULj*4timxzuU_B0o8Xf^*VFe{|c%PuNpH0o{|I9Sjt>Its6-`EF zq?OO8&x&>#5D#$GN?>@xcbA8WM@s{~$aMLIZQJ&3WW|UI{C(od+4dHqpCHQ=79ef; z_6|UK=HxyK!hq45f8DV#yS>whD608h+&lnTPV-@ysn4jh&n~Z;;O$-g?Ai8*Ozkc$ZG`CGuXl4(Fuq<>TA(cj)Y=_S^mo%orYt!z1DcvJ z>w(YC(Mw7qgDH|lvJ}yq?oNQ-y~J&zELe9Vf`{kT4PO|JxH~eL-84g>yk>0%TXJ!3 z3*ArL*5Als1c{7p5i5Nz@@H@JV+ZZQwK3h13!4A*Ogj}oH3S%%`w_vqSKWzK=z{`G zg%iC-POYXG1ch#~v!Ic6o5RshXn5P`wmZa!fd>)v_HU%=jh_m!0I~I%-506bwB_m) zl`*137nkeiu2Pql-6AFqfAfhPwR!!rY+ z=dm#-OY*-3-4|k?&@k@r>LC@u5i2MLZyy@fuddbx z#aAP56~;nKJE?%7Xld2i&T%hU_OpDmAZn@PLR}{mo*xdIV=PD}bS~-o7J_{_Mx3AO z#OWVmVvk;81xKwio7 zbF%b8tBxqn-N-)Z60!{Eja_w5g+`Z<;IR~00cs{uPyJ~YUV*gIH zdV35;KG-aP`^w>Sj#}@Ch=@=xx2HpwDfvfB89aL?qkk|sf*AMOpEx>xH6cn&T)>x? zgp(K%(Eu>IKY9Q{B>{}17bTV&x!`p=IoRm1$g6G{P}7qG^y3@cul@mEj|?!D$y8bV z(;yM1Y@F4TQbe}Q^v%Bw=(fO`1~9+!jgqk+J%?LUG`^D5ZhlbK6bE%^wx}aJKvI@^ z^avA8V*-$&cW;YvJ+78g(!9pS+k==sx7cF%$@X(L2$o9rl5ORLbyo2GT<8Se)vJI9 z|9lQZSUJ|Fg57CO8QzK#p0;^}xhDb#Wm4!AFBR7PgO5=$O+yJamr{*#Lh)hS(O$rA z$>XtHVdtDc@>9vv7bm^^yUM9S0j^SVHxYcn2au%-pG06Bt?Zt_9q0_5s^6KlKJ7J4 zUVb?K9O(;qSsfsMckbi+&N?aey|`Ir%Z^~<_IUkQ1-=KHTZ0tQyta2-LsY<6fPHkS zw@_T+-&^?M7M0(ezmL|#dJwNPa_Hz}qKeR)iMZzz;=b;}%2qOcWAtk*T$+;8-oHCU zC;~IpHKgbRx5)7s2|`nEAU;U^I!o>|Sh8GjEDSC4<$Mi_`9lFLE_|n zOb+jsT$5d{EIdhqR%`rSLrY4CJwt+Vc2V0+A~ABVDfsz)XB*Y&BlNvUIQOv(nZl2wVtG2r5wU%{_&kZRF}mI(YZ7ZZgULEw zR{!R|GJ~4?Qtw-63kemqoTDpu%G9ab!Gh@4Ir4dj{AODJG z8hl^s_7!fMuHuC}oatcE+SIXiYt@+f=bSpos?)Jb#5k!N$w0gEzru0$F-GrWe_Veq zNFG2P^@jClDHHj&tugF&9`>kfBTa7<+5Uq*up!!OWDyLb#%MwbbSYL&#LejHG$_dg z)Y)s-lw1oHbXduq82XL-!sTGaW;n;U!<4WUE$uq8#s;U(h(n5)cwb-!>h~FWmJH}I zhM&KNP9@8-_%{3Yt^7^BvzW+*eOV#9)zI0+mBZS>35$F|qUADTMDS(3 zOtzHCQ$`}a3wGqDte{UHvYr4}OGh;v#A#LGELGk5iJjcB#ou}QeDoZ_{4|k}fu{I0 z5VVwtnfB=cx;#$HHukKJ2TD_0N67;|IT~+D%{$vcMnfI$ky3bWymmX@GrlNZ~uV+<@(azH3t6+0A|&>*kup8bv=1Ipk2mpm**wruJlm5T1a+arh% zM~qFe=A~Q7{>W3v%)0lPuJ=!249aeq2nL6JE88_-e(xnh#PTrh-*x4K@2i{s=o`N0 z(EdX(b2_IO&NFs!Ly(0|p##R(1Jz=y@Wm#AoZb_LmHgGKW)(1cgZ+*I*tgQ$U}uNN zgtt`pZ5mI8x~axSvx#n?-Zw?Q_eG!S68K;`#)1hFZyd&Qw~h}15w3|Bn6IUUw|ZV0V)=`?%Gc&q>a3mJox6QWZB{AcEl|gi19u1su02Oo3~aSrPg7IZ z0zEj8{5fLJ(CNW|f!pCilx@sy*qSUfQw@OK3~gs1QB}}aYhXpVKRql$ca?Z69kILs zil)ZNuoC!mJ|-i(lTxPI(xM(i`=94AyW;p-wCg-}H10xyTFLkf-qm(KMTv>(K6}t>pf$6=!{>;i_g{ZJXZCz~C;BZ@;m*&e z=`9ikyIV={bX^btmwmH3bh}v8CJpU)Ks-)LV)Q;uZ-2V8Tk8$FgN(g9=a5`kX!T`} z99E`)wl#W(djm!C@^JS3omf`}9I=FNDrsbW4;5NpzwLkVt^cN40G1SPHY?Lu-7ywM z-~*E8jREVw+A=^@AznR3hrHDeef+U-88el>p6Oc6D$QoI1`pt>IUF4sAX=t`C&8GM zkf@5qOqH8(+3@ll+~K0+e1E`~bC~S<2)hF=1c^sw3^BEJkk& zI%!ODLj)6@k$5Tc*2kD|6DgK8!yyjSHOfT7Oy@J$q>L|N01scCNg{0zvEe{nml>DL z%oDWZoO>BQ^y_%78zH24ijm9cBNr}O3j>&RAAw(e>%g%7E&-S|^OYM@zm5~SpNw8R z8feKIwzI@V5Dj>J{h6!=hgB{q0>@YD`((p7tHb5(tNPu80@^%_-)RY6pZP2kiM@Pw z&t;%2>sj&(xVD=V0eR4?EH_++_z{HkH1qKVLvWtye(e$P>T`rIu%{<@x5!oji!3lO z4RK#UNcDo_(u5_w0lLLGcE$YBZr^*8^QMT-5P^8_Q@y$l{11d+B<$lcQxoSzOD_T- zo{Pv|8)jYokoWi<)2F%=Q)m#JEkt$8s-Fl@JHXm8k0M1ZRH2U%QwmXnI!G?+Pf#R^ z?NCYW+1Wc(z)}<_<4nrkP)!AE88JpFo< zX#R8u=K9_iG$UQa{DPQd3yD{kP+QX`v#ZxWG-nk&)e=ilgWa1;1MeqOL_`U#jHH?# zaI)O>z9}B8ps9UeRDAJ6n6)%`P_39=P^cnR8Vt;EAtktS&EYXkMgIzB-5X(oSG#Tr zGTtAKD;Eptya~h(jL&~)dE9w;&g*d=`br=@za5OJ@L*_U2j|7i zF?Yx-{5nv~7SnDL>FkMUq5JtmfwO4%&Sl(Ti3PHc#8(u#GdB99GdTm!#tP!b)F4f1gVQk$VW7H1r2u0p} zW?_mw<{!7vbE=K+8^I=@8F_s|4XxDJ%`MJo5OKLp%u|+*B;>~?wK`*Nk6PtvJV#Gc zV*MZnJ3alSfX47S}925FN$i3Y$e8C78^cr{%k%@8L z4d-Obz0b`9XmXjn0UY%l;CDm;HP^_JmzUMW-Ew9~CwPA-`x4-W*7-}`@_Bn<`RMte zC4c-d58_I>Q(&_Sn#|-rVs>p!MqNE_z}OXsCXU%de#Iw@)CcDsl~l-HTY_D{_A zSY{$IX?J`?@q>Ot$T9`lZeR3 z9*lr8lM&Zp2w{If*i8%gvlg z_OF^c@PcCi1CI!wL5P2R_5qOJ{AUIf@9&Hq7$JI;D;&+t`@e#h{b9F9b#1LEaOphJ zR@ot;_7t41c3RTnj_U^vV0j&ZrVbkX;Y7YY0t7k3z}mY<^wEX>ESsJr#o5d2Q7%2_fXYKa-`OExiqXNS1pF3w+m)da{2 zM}GwC9R3mifBdMmg&m=1T}t5#;n!d$xG%h_UC`Q;s&(TTqzuA@VFZ5ofcE|o6PGIk zp9PqtnmX_3D6Jp1PI=mwYoqpu^nmOPk}&Z13V?I~u6_w-C?KJeE*o`x={ud#*zCjCD@F24r9fp9L=6aawntMM|9+Oq>NO-6oi&or9#eWJ_G&Q8pLMsYwR&0%dGB%~Jl`ItypqTGG~@5+_WfTID-HKVIP zEE%C*5xBgb=VY!Z5QEuUyzgBa@eoW7G{Oj)aRc}<)hnG@fHX`vN3(bqUaA^v z@(_)C;<7cFtzPg304Lr9Z=Bsyl8ZgqyIC@Y)o2zmyIBb!3lq$eDJTX^*I(HhT+&hZ z>kp@VdNSk^T!C$Z@kPdmfiEM!0iOP*sJ9TBVFL_gU^a_Ddq@B=d}#G|6PDS{8$^A8 zbq+DWCP2Z(D4eo=`SKo+({Te^NKu)f$3y#hyz5M=Xl67tt)yzKkro6!B_t)efF=?h zGzROu6#$sQEQq;8Ncoek7S(``BC@uoNs z-bw@PMf3xeb~`t4v<&|+4t}C?IW7jcG*5rS@S#b%oCHdEV22In>U03xYBux%z+O0j z#11`EGHlgN@GY9)3C)-lE=gTbAvA_2cLM;@#T8i8!+CQul`UBwmLJ7Q>8ESkX% zNY3g2yE&V+x#VDLs;96=qyvUnLQKqeU;%G2_&IdR4Ln#FU-fE5(DX;ZmWuC7cC?z6 zcQhN!7RPCf4;-*25V_sk7>fn*yms~x>>>A$Fj{kSbB&N1V-Gnvy?1~tj`_PZkia$q zU~NYPoeUfy`4yC7ngFE}Ktw|?C@6S}W<~lB^H>0!QV<6wQ+*{0{C?WNiy*+71<)Tr zky`qd*2ClccnRG-B9Wup2&c6{W0;96G$PsB`$^O?d1SS}a{t|E_ z7Ugq#*jG-VDXbuE=ZAhhCJdU1lT^uI`V)e4)UE;q$y2<{hx6~iC>cYa@O{W$4Q7uB z$lL|WyAZfoQ#rgE7)NIv7lpDHXkne3hw3`x5fG-8MX*{ zQE09j^sWIS2osDuM?w_?r0(M&Bx zW-oMo&YXaSw9}^ctmU&*WE{6y1Z*26SV!oYRMWP@L67}Jg%cVP26nfGPQ2@F7Oc6~ zKor%HU{fQdtxbt0mg$V+Ky%c=#&4amO+5Sqhvx3`r!X=r4trgI&mZDsCp!f)XSbbZ z@{t;^hj5gA0>ZAnAKMdLl28`$+%I{{pwuNA~~# literal 32130 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 YA-rLUvRu^QmyUQSrz)F&&-D5K0mJZM!~g&Q diff --git a/01.fit_a_line/train.py b/01.fit_a_line/train.py index e51eb3d..9b4f6e6 100644 --- a/01.fit_a_line/train.py +++ b/01.fit_a_line/train.py @@ -23,14 +23,24 @@ import numpy import paddle import paddle.fluid as fluid + def parse_args(): parser = argparse.ArgumentParser("fit_a_line") - parser.add_argument('--enable_ce', action='store_true', help="If set, run the task with continuous evaluation logs." ) - parser.add_argument('--use_gpu', type=bool, default=False, help="Whether to use GPU or not." ) - parser.add_argument('--num_epochs', type=int, default=100, help="number of epochs." ) + parser.add_argument( + '--enable_ce', + action='store_true', + help="If set, run the task with continuous evaluation logs.") + parser.add_argument( + '--use_gpu', + type=bool, + default=False, + help="Whether to use GPU or not.") + parser.add_argument( + '--num_epochs', type=int, default=100, help="number of epochs.") args = parser.parse_args() return args + # For training test cost def train_test(executor, program, reader, feeder, fetch_list): accumulated = 1 * [0] @@ -62,14 +72,18 @@ def main(): batch_size = 20 if args.enable_ce: - train_reader = paddle.batch(paddle.dataset.uci_housing.train(), batch_size=batch_size) - test_reader = paddle.batch(paddle.dataset.uci_housing.test(), batch_size=batch_size) - else : - train_reader = paddle.batch( - paddle.reader.shuffle(paddle.dataset.uci_housing.train(), buf_size=500), + train_reader = paddle.batch( + paddle.dataset.uci_housing.train(), batch_size=batch_size) + test_reader = paddle.batch( + paddle.dataset.uci_housing.test(), batch_size=batch_size) + else: + train_reader = paddle.batch( + paddle.reader.shuffle( + paddle.dataset.uci_housing.train(), buf_size=500), batch_size=batch_size) test_reader = paddle.batch( - paddle.reader.shuffle(paddle.dataset.uci_housing.test(), buf_size=500), + paddle.reader.shuffle( + paddle.dataset.uci_housing.test(), buf_size=500), batch_size=batch_size) # feature vector of length 13 @@ -78,11 +92,11 @@ def main(): main_program = fluid.default_main_program() startup_program = fluid.default_startup_program() - + if args.enable_ce: main_program.random_seed = 90 - startup_program.random_seed = 90 - + startup_program.random_seed = 90 + y_predict = fluid.layers.fc(input=x, size=1, act=None) cost = fluid.layers.square_error_cost(input=y_predict, label=y) avg_loss = fluid.layers.mean(cost) @@ -140,12 +154,13 @@ def main(): sys.exit("got NaN loss, training failed.") if params_dirname is not None: # We can save the trained parameters for the inferences later - fluid.io.save_inference_model(params_dirname, ['x'], [y_predict], exe) - + fluid.io.save_inference_model(params_dirname, ['x'], [y_predict], + exe) + if args.enable_ce and pass_id == args.num_epochs - 1: - print("kpis\ttrain_cost\t%f" % avg_loss_value[0]) - print("kpis\ttest_cost\t%f" % test_metics[0]) - + print("kpis\ttrain_cost\t%f" % avg_loss_value[0]) + print("kpis\ttest_cost\t%f" % test_metics[0]) + infer_exe = fluid.Executor(place) inference_scope = fluid.core.Scope() @@ -182,5 +197,5 @@ def main(): if __name__ == '__main__': - args=parse_args() + args = parse_args() main() diff --git a/02.recognize_digits/_ce.py b/02.recognize_digits/_ce.py index 40491a5..512f387 100644 --- a/02.recognize_digits/_ce.py +++ b/02.recognize_digits/_ce.py @@ -10,28 +10,30 @@ from kpi import AccKpi train_cost_kpi = CostKpi('train_cost', 0.02, 0, actived=True, desc='train cost') test_cost_kpi = CostKpi('test_cost', 0.02, 0, actived=True, desc='test cost') -test_acc_kpi= AccKpi('test_acc', 0.02, 0, actived=True, desc='test acc') -tracking_kpis=[train_cost_kpi, test_cost_kpi, test_acc_kpi] +test_acc_kpi = AccKpi('test_acc', 0.02, 0, actived=True, desc='test acc') +tracking_kpis = [train_cost_kpi, test_cost_kpi, test_acc_kpi] + def parse_log(log): for line in log.split('\n'): fs = line.strip().split('\t') print(fs) - if len(fs) == 3 and fs[0] =='kpis': - kpi_name = fs[1] - kpi_value = float(fs[2]) - yield kpi_name,kpi_value + if len(fs) == 3 and fs[0] == 'kpis': + kpi_name = fs[1] + kpi_value = float(fs[2]) + yield kpi_name, kpi_value + def log_to_ce(log): kpi_tracker = {} for kpi in tracking_kpis: - kpi_tracker[kpi.name]=kpi + kpi_tracker[kpi.name] = kpi for (kpi_name, kpi_value) in parse_log(log): - print(kpi_name,kpi_value) - kpi_tracker[kpi_name].add_record(kpi_value) - kpi_tracker[kpi_name].persist() + print(kpi_name, kpi_value) + kpi_tracker[kpi_name].add_record(kpi_value) + kpi_tracker[kpi_name].persist() -if __name__ == '__main__': - log = sys.stdin.read() - log_to_ce(log) +if __name__ == '__main__': + log = sys.stdin.read() + log_to_ce(log) diff --git a/02.recognize_digits/train.py b/02.recognize_digits/train.py index da59918..6ebb177 100644 --- a/02.recognize_digits/train.py +++ b/02.recognize_digits/train.py @@ -21,14 +21,24 @@ import numpy import paddle import paddle.fluid as fluid + def parse_args(): parser = argparse.ArgumentParser("mnist") - parser.add_argument('--enable_ce', action='store_true', help="If set, run the task with continuous evaluation logs.") - parser.add_argument('--use_gpu', type=bool, default=False, help="Whether to use GPU or not.") - parser.add_argument('--num_epochs', type=int, default=5, help="number of epochs.") - args=parser.parse_args() + parser.add_argument( + '--enable_ce', + action='store_true', + help="If set, run the task with continuous evaluation logs.") + parser.add_argument( + '--use_gpu', + type=bool, + default=False, + help="Whether to use GPU or not.") + parser.add_argument( + '--num_epochs', type=int, default=5, help="number of epochs.") + args = parser.parse_args() return args + def loss_net(hidden, label): prediction = fluid.layers.fc(input=hidden, size=10, act='softmax') loss = fluid.layers.cross_entropy(input=prediction, label=label) @@ -73,18 +83,21 @@ def train(nn_type, params_filename=None): if use_cuda and not fluid.core.is_compiled_with_cuda(): return - + startup_program = fluid.default_startup_program() main_program = fluid.default_main_program() - + if args.enable_ce: - train_reader = paddle.batch(paddle.dataset.mnist.train(), batch_size=BATCH_SIZE) - test_reader = paddle.batch(paddle.dataset.mnist.test(), batch_size=BATCH_SIZE) + train_reader = paddle.batch( + paddle.dataset.mnist.train(), batch_size=BATCH_SIZE) + test_reader = paddle.batch( + paddle.dataset.mnist.test(), batch_size=BATCH_SIZE) startup_program.random_seed = 90 main_program.random_seed = 90 - else : + else: train_reader = paddle.batch( - paddle.reader.shuffle(paddle.dataset.mnist.train(), buf_size=500), batch_size=BATCH_SIZE) + paddle.reader.shuffle(paddle.dataset.mnist.train(), buf_size=500), + batch_size=BATCH_SIZE) test_reader = paddle.batch( paddle.dataset.mnist.test(), batch_size=BATCH_SIZE) @@ -122,7 +135,7 @@ def train(nn_type, place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() exe = fluid.Executor(place) - + feeder = fluid.DataFeeder(feed_list=[img, label], place=place) exe.run(startup_program) epochs = [epoch_id for epoch_id in range(PASS_NUM)] @@ -154,17 +167,17 @@ def train(nn_type, exe, model_filename=model_filename, params_filename=params_filename) - + if args.enable_ce: - print("kpis\ttrain_cost\t%f" % metrics[0] ) + print("kpis\ttrain_cost\t%f" % metrics[0]) print("kpis\ttest_cost\t%s" % avg_loss_val) print("kpis\ttest_acc\t%s" % acc_val) - + # find the best pass best = sorted(lists, key=lambda list: float(list[1]))[0] print('Best pass is %s, testing Avgcost is %s' % (best[0], best[1])) print('The classification accuracy is %.2f%%' % (float(best[2]) * 100)) - + def infer(use_cuda, save_dirname=None, -- GitLab