From cebf890165f1d10930169753bc22d96cd413de78 Mon Sep 17 00:00:00 2001 From: lucasdelimanogueira Date: Wed, 22 May 2024 13:24:01 -0300 Subject: [PATCH] sigmoid kernel avoid overflow --- build/cpu.o | Bin 15032 -> 15616 bytes build/cuda.cu.o | Bin 144760 -> 153512 bytes build/tensor.o | Bin 50480 -> 51832 bytes norch/__pycache__/tensor.cpython-38.pyc | Bin 19496 -> 19860 bytes .../__pycache__/functions.cpython-38.pyc | Bin 10296 -> 10740 bytes norch/autograd/functions.py | 12 +++++- norch/csrc/cpu.cpp | 16 ++++++++ norch/csrc/cpu.h | 1 + norch/csrc/cuda.cu | 33 ++++++++++++++++ norch/csrc/cuda.h | 3 ++ norch/csrc/tensor.cpp | 37 ++++++++++++++++++ norch/libtensor.so | Bin 194792 -> 199352 bytes .../nn/__pycache__/activation.cpython-38.pyc | Bin 1616 -> 1616 bytes norch/nn/functional.py | 4 +- norch/tensor.py | 19 +++++++++ test.py | 4 +- tests/test_autograd.py | 2 +- tests/test_operations.py | 4 -- 18 files changed, 126 insertions(+), 9 deletions(-) diff --git a/build/cpu.o b/build/cpu.o index 64295093a522141da1cc4b87261cfd18857efdb7..9e6ddf72119849b4fa9e352ed8e0ba963aa216fd 100644 GIT binary patch delta 860 zcmdl{+E6t?gNeanqgK3Jy+`vK1&_|!7apCZ501NjVE_V;Zr2yx4my^uU-)}pK=~fs z4Beq$Jd!VY9DKy&!Fb^_zW_rT|NE2t`Ui{BKpLNFjt`*bG%6vRP5Hh=s$VI5RyrKQm?WeQi+|hSZ9J$$h#ijOQj_ z)D_=+L05rAa-tkWBNLEf2VxtjIWs4JG!!>nizcfBl|73?{2NG@Di_pEFf(DgWsdc3cdK5RDQnlV@3)ab}o6xGyH(v^3|G gP=)Y1CQDkGb1u+=@ODg&1o8sRA-t6k2b=K#0AX6xW&i*H delta 329 zcmZpu+EF?|gK3B9My+_c$r=JBlZ6$0nHU%*Cn%V1-l!nY!m7f+z;I>qMiu$ZBC0m5 zyoEq62=uZrFbGT*R2A90P^*ZA#Uweucyhe1C@%w$kp@x1aBgy;zWC+>eFYZArpX_T z#TQ$cFmDbppTNjFOAe|8L``~y@6c_3T6)3j2wZYnoejs37u!8yj-m^^3+{yg^-}C&>^UU0He(!tU z?VR(TGk4}D*FW<;^XvF6*;e+%7kYizt^P{Z2FtpcXJ0GmXT6bU9~d>X-aqnyY5gU~ z-rcjG^+XP!e)g99Np|SgZ>;p*_O+6J*2P{x@2Wr0KgqOK^yGbq_H61qp$G5Vwg>gC z-;!TtTI;(JmpwgyfPJ)gyzL*^tA0yiifNv)uNL&Tc6J5l;QExIBTTDf7cTFgnSlD+ z$A%5G5A^rcvqGO~&CB4Vf(+ueQ-=1hzuLQnY1MZo*j#H5?|(~u!N4Dw){&0(ZwK|W z9_&a4!1$#4yutfTbFcm4p#Ii^_6oK01}D|uUR-Kg=h|_}d)kp?VMlsf4qa>msDJ&j zVfk>PHTQm8Ye3TbzqaCBds_jLkvq_myf;_bXGZi72kzSx-u2a#`U9ixFs-|jc{4AW zB*DRi`rnMPOzUtWm-fR%z{BhF#&t5SZY?@mh_e`F>b;>Sp|78p2 zEn2dGow;DPb1yJZ?CK?%^@pZhcG(MNq}2ax#v(JNvC&NYmHDvws%8AqavQdPW=3Gn za+A0X%P`FnT(fVrN6eg>9x4^EQ6R44-Q$fCW1ta-_eq9n=P&8w&s%hA$gHeR8Zt9Q~g$Fr4BnnUV5P!EQd;!OYM&Vy^yt~9T z{c{noIAd5;haNt{dqm+|IbITlw?q8njO-}{@f^h6URpp zuEig%%oLj2qf{<3Xs%P4FYy{oN-BPYp2{KMaYmkKXzy+Pgpbw`QGFJ87vO#=x5SkC zuSi0rR8Sxl3~fn*@}mUp=J=Q>JTE{B#)K7AN=3^hK1a&Wkn)cQL5MR7q6B5OB7AHV zUeEEuD7thU5o9)&OC z_(X*_jsH8G&`%M<*TG1LamIvjTUEa0cz@LlU+1I|e?_>hDh(VTpqlau{r>jU0qMw5 zC};t{mdG*YR6H2NfPau^;5{Vs?4LN^lra_lC^BQfuVqF#Cl*0vAm}e{5+n(?Bhv-^ zTBeiuNMx>nU(09`?+F6}{$XJ`28NKzVob7tzl7KMo8%vdd=u~w=May7NY2Ut5=+28 zBHSS)XQ_n*67Xw@1p=si!Er5rU^!ArKt2fgoAQK`b0^k)z|Yq`=L;ps`F8~!1OBG< z3IZ?75%Pe)X_+bfTdbOZUt1m0vrn-)0)A~3Nc|zd(HMv=0mpm zXsYKSKy5bJ9UkozsF8N5oqkT7y?T3RGsO8q#J8UKTAr7DYUiJ0U)Y`=Elwp(bq;9o z+B1GS%6i7M_y2UU)y}d5TNaxe?K6*L+s|$pZC$tQFSabU=EvD{A6aajkF(F>GR9?( z*t*y{3tvZigi_1li{Shv=d+kZv@3&5P z?X%nOu?l?l;76yLJM1$o81Iu)#&5s7y~?VIw^y^N=6QSlW7+mgk4|ejMhgB^NIG^oiIB|n4Kg!cct^= z7`8LR)zxRv(Ts{Kpw(My^?aW(1#~*C5I@za5P!H1{%{@qlR>9tLi|*xLj1BGG+gKq zCZNM@U{D58oeFgb*TEmIgMSj}${?y!A^vb3{NXzIDYYv36VBu+ z_NTk@$I|j8KXP%ULcPLu^a|I(lOtF-Pq+>qUboYB=XX=mdTN~EIyiaV9<-;oUAa3u z%&iV`q&r*(H?P|-fIGB1+w5gOyF1@3u;0adiXFcv-}Kw-@t$aZ%iotio^N)w_u<`V zpTWDwHlLt+A%CyNdy4(Y6K&Hn$V*74WXS7?M+xdF_A5`c4RQojLUV{B_M-h2W-I#$-do#APd;I`wTJ(FnqBaW z&rGwEo~kfA*e#!)X21B9-|Pg+Ap85L^2~HQ_h+`*#eU^yL9;v1d5F89b>8~4-^@do zc^Cu<*{7fOnMG(p?6b*s;K`k4f6;=HK`?8iz4qBe^A@gt2&aU8ks73co{&MJj7e?z zS=3PN9WpJe_EoK20)BO@BKmN=PE!SiE+g(Y4Ow zHfjrx@`V2e7l3iR@v6}P10ay-5C7rlZ~0(DU`CzC0|SO}15TzGzGWVf8))#rpRv(P z^FX7!4L&i54g-Q254hdJfD#NT3|Q`l?9ecdy_I74>s+XY%*KXBFL@BCb0K1(VB;}F z2<^l=!_|nJK{X{5p%h~@W(6dnhzMDA7*&cG{f;9=Sv&^8-C_22=|=e03uZDa*>BFcEK{+^%Vmk z;`cG63G)$;kej%DwQd(_=LP0HxXiHJ_T_gv1m)0zvxFk)l0ykeU+|H*b(LvksG+{t z%+SUfSyJ`?9@*gk_s~X+>__R^T*OEr6c&YsqDUh{Q>E5TkwqynjJGOzY}_I?As$&@ z9nF+b5F9Q8QzLUZpBjh|iX7U#JniwJHHITXqR>=e{~Ba=4PrLY;5W*_rXc!x7qB3R zX?3o~cA&f3h`~&(#q2`6rm|^v?L`}A@b#Ca%Y#W_{z-zrtB+5XD((h+4Elbc%_b~h zUz}I07d5+F*b_0k_!^E3TXC<=?w!hd;N7DR~*)d zTs}csFCGeuzFx#$BRmS!CA%9Ng9cw;usCaZQX>UOMGWiFMGKA##3%;pyhwAQVU0Ji ze9%s-O-!QX&`57I!IxoMN7djC25J4oqa8X*UeJQitc{P4@US+4pQL>ypnsgwv1_e3 zS^Gk0W8MbpdjDyF&B5m zYJIfM#56|;R8ls$M%op;2zh9jm^ArFvK|l3DjEkK)2_8%+Bd{zi5SzYAqJjMMB77y z&Zi=8yZJ0@qI-Dq;WLR0ST0fzk0EjkIT-q;$wAs^D%b@6<8^7d;Ygm<6rHF;C@&MmW(J^suEp%nk(&Ja~eH4nn}$uV@a_Zbhp+Xq^2wpVLHV zhkKYA{w=&01_s#=OU1)3L5<(9$)W|saMbNQbXCd)Ie4~d>a!`jfN9KlSxNn)) z;0IJ%0bP9bVxV?@Kzt|>T<0ox8P2eCQ zRzO;<*l2m`hvD8@7oUFMFljtt5N*sx&7?2*bV|c=rrGLc7kZm%xA}Mm=f?=@jFlYD z=sdP^u&*PO)UI{&bQz9yo!dwJD%62mkK4n_bIeWwn#7n^$7Dwe=h_^zvzMPUu*UY~ zm}wLmaJ697xn{?#t29O;EhG9gMM9o2=+3t~#Yu_07zm9I7=nEFlzA`Xe=DJb)o_K~ zpKEq8Td)hcW@<+%VDFVC6I5mwdq*0AlPPmK1(t%r_mV5@`&{$h`nta~xa-fK3q4^K zv|=-soBb1NTEPL7lJ;yT+PMdEMLU~s4dSRz_m5@Mpwk>L=x5s1Gg~E`?2d7reP;Kxp5h~Vv}kr_mD!4Atu#|JFUQ~sjTh=G+4PlWdiw)BQ5sRAPLF3> zSDM{3e;|@>6g{I%h}p~Dg_yL}JUK**ImRZgCX4D|Q65h~(L5RDVTwrhP|$^Ylv-SzwLXJ@{4(dYQblDzzCj;b@G+jN&r++mGp% zU^Du6%l>;gnZ9Q-_*Yqu{zXPzfOFJHzVM}3-U^;05fVUwcG=e+YGuarHM>{x_$@YL zjoG>9A<${X(YaeM2jqS0@TzCkE6lcOZ-A#c_7m*PTAJ7QnW<^DU}%n~n6+F7p1Z)) zvpw`R$8+FzVTAnsiD9sP_nB>b{&x)aEZpIt(!_p&*dK!D%}L*JhhVQGA{Cao66_U- zaC7YbS%RxcdNr}r39C8w4YQr>`-nXrsh~Ob>s5kX-LEv*1!Dh84E8P6f_*K?qQWxk zz>ZH&%}P(aQ*ddvgFS5ovP5&ngxJI&#^x#HrJnR5usNO^cMFkC7F-|;K8wL#H&3u{ zY%+Ki*bgGXG$-9yAlNsA*{g|tJu*mh>>KWN8nX}VY2%PdnqxQEBO&nXykVZpDFftusFx>ShNrUY5A90{j6 z_KnM&7G$n5+Xg!$zck10S|QlOQv%KA@>2_>m*)D{-RH0lP1+S4`6P6!B3 zAT%r3-RsTX?DTrm7v$fS0HeG$4BwoDaMjCoG{`Wqw`!D!L_H*SO5VQ&pBFOTS}r;voz<%Y!u{{SC=LSzLB@r`VT z?-&Tp8oHZzi_lYwc!VUZE*oS*bJ`i&!#TP}2)MNw14`ZOWff%qv+HcN)km{+;x{1xqnybm|C+H?6^x^0Yj*xeW`=cO3hHgTe(SrX0OzNMhC0((4zo_WYY`omVtq!JM3;LH2Cxchl1Qb(&|iAM~6j zVc{>m>GRV2yyT8cofUk)GJc$u+IO6lw0TB)pK(@#=dzVPVyxwJUB2IY?e3&bR!Yn2 zc&pLt>+r7k>fDsX>Uj4+qt$>x?|L7e9A-!!A(k5{v&mTFY6_-=o!+O{CUgwiGREt()EdJF~qf3j$r( zh<M2117DNzcY&2yve@vWkoO#`J__jz*%@kmDOxXzRx!Iqv>Pn#7-$>V`eSI7 zvTACb6s=9XWu+zvz2`)8rf6CnTdN6Y+%? z(Pv6J|E#6xRt1qceJz{#irI%1bg^6qH@#ven%1k`+0IwZ+3i2*PI3)HUW`JlXA23( z>cIlX&4;al(+=)GZuYkZFN7!)E4_iUi#$Ws-N32CY-DaK+(cYolX$~a_Mg|y2hD%5 z^>3I}<`?Y38#n-)*oV7_`?b7RKmLvlA9w)L+ROIa?1eWGu%T?}n`T>cthiuiQ0oqH znJX>}#AP)*L$s};wToZU_DiWR$$Xn3ug6*82{8X%aD6Aac4iCZ%BD{272?X{7k7_# zu#!G_o5KY@OKf)XDOZ-coQ4Qmg zH1u1E*X0QQ0&y|YFz%$S0l}uC92+e0E;0`*S7@GqALktiq@v8*Bs+|il9fTnCEg)f z@GAvZCElh;;7UQ~L}Ab^;*N~bMLJL_@i+PqKlBe4{fvc@Fbi8371d#@#Mem4ivMMa z2eCKn{0$N>7$9)P@5AARBD4=%F%|9r^cw||@bN&78_I*}5`U$Yz$Zu#)=B(5DS4bA z8&63*rL_R6CI4xOe^V@QxjYO5k;Kow zbLcjSe}c~+RMZ^WByn%Lz}u;x-5-#I$43i-GUzW7PtQ;t#PvIg7mbbN?}E8Q1`Ws* zcyH$BNHAuq+Bn!rU&Rg9_2Z60a?bRPchtS9gu%e_P_736cEtJOLTBm9{e! zB|iz1mhj;_D+HlHT#Q^v_(eAXs16kp&y%x9@h@XbPa!33=9jd`C09ld(R;P@|6NWF zeksXs%e?l5B$s1JkTt2jMYp>ozCq&8Fc>PwhWI7mFeco)0yp4mR)nYx3$E|>)#Hs_yaY6MRGJ?!>R%zN0ePjK?O@d?f^ z_p{84W?SaFXl7v_&ZYXyi)LcdpF~{v9juXT7VxA}KsV@1Hk1U`@>8(x04uwMH**vl zPQVGsVVelOPH!DQg{Vj6q@fLbBirG36_8j$Iq2c4% z^Mrpu_+||+XCDfwNuPmS{29mxG;#$S0z9o!)AnbLT*?*^d4xv31D`~xkTE0J9+1u3 z*l#~G^V22+Q6}%yxF)chq&w$-pnEzUE>Wm=3CsN-g|i5JRv3RL0^bZgA~G5B3?m|Q zgvgYKl@%e4JcV5*sU0uDirpGs&N^KZVZQ|OT9D17Y#-G(qRz^Q|5J^>l06S%TB)X{ z*oy{=aOy)M>%+HEBNwxz%MK&YXyj>Z2$A*P`0;jFcrjb#?0vUJp2qfo%uZg0$?Dg< zWK%gib(y<(lgK%r!^K~+iJzlB5cP<`e@7En$!38k!c%-(s~NMI$hxg7HS#!igvisu zuZClvMlNHQ$$+veh_U~QnUzM_Nim+)7$>muD_~p;#-y(_yppX09%0=gdEg|UN3iFK ztk2wClH3dA+t`O!5R%C(=_tCjSx*41lfjEZMwYV6MAnV`iAFAFoxT8BUvq!e$g@~E$ZYKw7`rPPUe4Bi!6)SN zME-!t0i3(2kkShFAxYJ3>Zg%QS<=59HvLi~7qcNm)@}M$BUiCSM5awl#iOO4Gz;D3 zY|p>BX{W%&Zu}dj_0`A~>?ZZrO`E2XOIhxh4%1F)$H7b~EoOU&tlKn8Bj3$V zkhcn|`m6OW9^3>oz@vvz)RC`HaZ(&{p&2 z4;mTyjFgsLr+jwZu^#D6sN^7@U5A_sO-?+Hbc$Tc))85^;-4CM9DAO~3$)(pIIpSR zW$Z(cS@E}K;-lX>jHuN3Ca@vjI*hniBV%}otQ*mwkuf|()`uq#XFX-af3Z^_vl}oX zX_SUzc)k_G^B)?X|A0(qN7W6(13Y4QHfdxG50Q17EcxkEWYZ%=)@`cP$cxxzQrhu5 zD4nn2*!{obHkE$|@>(K4q>(GwI^YpD{YoR3vge7c+mtRp;0l{QB(iSPe2u(>CEbA1 z;u}yJ((rONy?|a8F z@_CJG0$T?z_T2Z-y|7bL?-KTW82?2C{$Uuu7=b4>Is(+EbCWo1A4JvzWNYMQY!S$8 zH~#!d(yuif`$i)V&?zF{0NFgdJ=1Et-Df4Tlf->PuA_RXNKfW;~g9n+{~+mBe7=cbjoy}^n+RbA8ACNTUtnaC`Zn$Z-5N>)zfQccNH zjf_2m$hw8U(a1YLmcv)kf+!>NNJf1GsW+63|g7Sh^@l~#nc4C>(*+FI0h5rVK62= zq2ZP62=HL3CjW*;*3D|&9ZV=>mW~h6aDCp**6{V{qsIPD4VTBzAir~PpGGLxI)o%{ z0i#bqxp-0eiN>#geA=er6TqhwKc?aO`Qu=B3NH$IrXOt&YaR3my(4ili2BG6J;o;v zTpoLjf5*VTQ}Rjw19&M*+xI{Ng@peAFNN=xcrRdddrIL?N?aM#5i~0Q)a3jSZN;B2 zZ&NBcK}ER7K~OmUxB@TE2yN4FJwhime1oR=cuygR6i;cwgN<)Vg7P3s@EM83i9(8X z52i}oA*gY44E$+Ljy}Y{=Q!d|3QF-(9>>c&wuC>Z;j1N1{ibR7dWkCsazLYUT$7_a zkR%zn9DRA0>I4W-2F;c@8KiqqtKqr>`!xJVnw%`Td`R(hiFcy)*IN>l2Yo@LvWN{& zK#DlnOh4-Oc?{f_C%QZB?Wp0py_Fii5nYwvjK^_N`Ah?g##EOWzk5DpnLF$hW{8c6@R zJb(jtNSua1m$Nkn{#=usV8o<9)*Qo6#nl?VLE_4R$)HhrL*h*i zQ2bH+{RD$k(C8R=wZut~J_IW?Tpxm8Y4|4eQ4SOZ`!^}RQzHzLxbk48U^CW8yvYOM z!0R#O+=zj<86X4(ogVa(1j2O>?$q$jnxX%aI7RMm4ZkdL<-lE_QOO@Dt|TAJI2aDa zDoJn(IuHYYOB19I!QV7ocOWpRN%6y|iXjL#Hhv%pq0%{6kHU?!Yw-*Bux#gzM)HZ$T9fApR(?O9CnWFG1k=Nr@{D){6c{ z@=#GB4|E4^m$*~TPh;TE4(0hTdI*ka3Um*?*6>F(Lst(I29e@L8oplQ%7G1n%{VS` z{&1)6K~jm}a0)7ofzOsWMM58fS`F77_@#z#MW65yvE6XAP)P9-ywv1Mm$>qPvKN(V ziIZa8fnUau^HK9S9tqS0=^m&*r$!2N4~C5(^6s^Nc>xN=|{XjEE^ zq<4(J(}O9TAR?g)+7tu-xx`71?!e0$t~>C#hHr!Zum_(K7Ycc>3@_!`Rf#JPb`ujy z(XHZ2iuEB_D{-fs`eyJTt+P{_Al-ut8m@bgKdMRbc2t$2dnHbaS7`Xt5?2m9CAu4* zjuPjOs3GVxT5vc8-5UenAaRO>?!XQW*By8>j3fS!YL@mL)1-K%hTkG_<-v1;%~&UK zQv5@W|IHY3zIWn0{uqLGV}(Sg2RRz9dvJ$_GfnY_5~s+m((sQZt{iw#s564y$BCNL zgBpoD1w9=De?^m{55YSct~=lz&-IGGRJ230bh#k#RiNKnS|f4g!C~pa5s5n;@RkV% zazK|eGy=!?tJ!#+D3>AOcMRc5i<~BJ(d{)U zZc+?x)fDnxi-G^QCT=AwPj@)`wWC|H z6n8TQ?z&B=qu8xr&pXBCOR^dY^~<&XG4LUpxMeIU!(rWgN4KY>bxUI4_i5smvPDjD z`yAa)N^#G`z<;fYTf$B`#l7d~rhX58AqIX?6Ss)vX5!YEzA9Qx7NJ$KOQi}*`xtnp z#Azu03oo^>AmI5cHZ<@O=#2Jp}?#NWq1y?i_*wiIZ5$RKZJ9!2kzA;X^eA)tZ7)F%&Ft$VrVuCzP7z@u0C%Q&0s)v*F4JbmhH2H@(KjQBU(fbZT3#EdOV&I=joD|%lDYzzar~K5ZU_#+T zK;!?ERM0^uXm}TilY;4ZsR;FwxKly7L(WMle{wT8={N4s6im|;+!;f`gAPHLq=L;c z@NJrW3W{=I_f&Z_ae8pnAt;L&P~M1vpVAc2Nm(g)N8(QTSHg1Of2!8uORdA>8vb3l zgP1SWhe{HK3x&p#lqkGY47{7fiT4S-ZsgEMQ-0C6tLk?U$ zS@2_l2YEb5@ieu+IXb9ks7^R=^$fxp4JSGCq@1f7P7bICq{QDq6XU=)74^_Unp;?` zBC%2m8mQq!Q%_FOU)QHX7`@a(4%He?2K`9N328X-^CzlkQSEgQ)Kd}9YB&jEQqTzv zCqe2-tBVd?JwpfV@slw1+{kndCpq6pIdvLN{OZxK9YF^{JZNGV`!t*c z@xOhE>oE-{LF$>X1_!R5OZim8NlshpgyQpwYmnOXQqPL%f8mR8^&m^3>_8X^>OmEh zN)0Edu7pr*;tu>bB^)+ZX*lErjR8{74vjz%9xmhMkONmw%DkfCWYB0SM?JtuO?s(k z&iENdVuXt)YcT%tbhtqwkOWPm3QD$y6QmwS8{@#$lQ5vYTD3hsadSI-{3q~TOOC=EKV z;RLCNZ!RB2d*Afp5wsP#v5|r1LYoVBsEYKI+1?NO6+`*>zwFV^kOJ$@J+0MRJ|JEn|F31Hb!l-t* h+`|6Z*Xo^c{c}MY(vG$7hp6}~Mb}i5{#Ie<{{xlhUZVg2 delta 22038 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 diff --git a/build/tensor.o b/build/tensor.o index 10402c807d458bfecf83492a19979ee8a777d22e..eb3c24e1f92b5a7aa761a7aa6c30b4739e9098b0 100644 GIT binary patch delta 1894 zcmZ{le@IhN6vyw|R<@x_=a1{FNF)L=h^AmAAqMqF>xZ@$F_moL)S0?;RtVNse}qMU zIF1qoQ4vAVKgB~R&A?3rB}xf|AX1}1fS`u$9QmrT8w$moeZPJn{S7{IvuXm7inK$h+Wr=;rgd`JGBsV_`n^c z+Esql@7oD+5skb!A+#a6=efD(y?Om@UJGF*NZnNqvA?=T>@T-UpOQzsVm+ma-zH-v z*kIol3AJ>DLrsl6!Olpyn>5zB4@v}q);ySL-<)wk09fhB15bF)#_f%rmv0@@#^K2u zs!tsk9=VXq=GwX#zhIWBM8?n6W~5TkMyS3QshLQv1~*gBNtLI*38@Vb7@=A-6pvD^ z7vk)GfO`u(L*DYy{yD_65&wpGCgQe}Y{3SPIfqS^Q4!o6rFywkOPP{|R1YjNwFcQb zk?Mz>w^YB7#`cHk~}r4b;(s! z-+5iwu!#r8Wv1t3K!xjsz!=qbLwt<7E9FzgZE$CGA&xuiI%s25e}q)rM(Z6YIU9~(VLR69}7b-cAAA2iCd@Iw`{?93XRIe=x9yN=Fn@u~- zj}?y$Zniwc`K>x&58@8Q4I+g?-C;v5Y}{ WV!yq=RjfiV%T}>TvFd?%qUaxjoplEQ delta 1253 zcmZ`&L1+_E5Z&Fh=q@puwD!AtXr&c2^k5Ov3KH;GTVt|HBQYshu!-1%E%s87)`Otp z!7_U3L6lxSG^}C|N!uuNlY(N&#e#}L4@KI82Q{Li^Y{PNA<%*SpLuWIpZPQUYxjL~ zcYOB_YjdT1_}MA@TmS7H_SCs%9iC?PsRekIX;t6ZTbWs1f1oL@4L~Bx)CqTejcDPYw>T&pjk$wF_7{+ZEi5!B1MP_Ct%g+fAb`%mtHu;dS zS;E=`&k?*#@XG{Wm3Vy(8xrTOWuR>dJfzf@^_`b>F(6yYS?uP&%eNDJFTqm; z-$U?Wg8K=63qE0MX18IVLvVqauO;i1?hT*{Cy{+mw7bd4>#p|aHd+Oy7g?_nLjfAU z9o4>&xR=rUAy!Cy6KcFlK7+c*x_%QjLD=Rq=%Cg2Fbw%6W}c92{lLybu*A&sL>s^} zyo^JTSYngogtZ8Jm*8}2QTY&fC09uN0Kw@ruM?b3?XkdP?v*GpPXr?*!B^f7G@h8^ zjl60!7q`b>R<-@!BmU?;Vx;*T(s7tr{-7PQAmv1iwyRvGC`V&3<3zMe7N|}Ov<)`E zrqe;)&T@yAv%o4x^_xkd>4e~56Ffm8pZqUFcRmTBO4N8O<7z%gRU$@wLC7{Vn5jhc eHy4E418bFTedn<77?>;FdQVAs*W3&vj{h$s^_sE( diff --git a/norch/__pycache__/tensor.cpython-38.pyc b/norch/__pycache__/tensor.cpython-38.pyc index c31fb5d2e49b5ea1c8b79ce7ec60ad3ebf06b0fb..718f29e989321313c477a400fa9f7df46e1c9b3b 100644 GIT binary patch delta 928 zcmZvaOH30{6oz}IwG^6GplxWINRfx66vQGZ3JGAN(iRvV#RYBzZ^iOzofZp9BT7y1 zK|l^f6m_8+kqvrdjOfNaY}{z-R*g%eabq+(XCz3Xv-ooEfBy5BoBMD9<`%)&X)t7{ zDa_T8QHhu$$p+=~LRy-iMO>HcTWhbG_#7xYbRCSqIJ0^rBO9!iC^|D^V0<3`@ zk|P)E#2R&8KJ&9C*|;a@X3eZ6shWVU3MMkUtmQDFL*+ciht;n$A;lZby8uKUwv4MG zg`cg}5Jac#erC74j?_ai5g5L+F>Nn}B0p^RsMAs!78-P?`1FpW01M40-7?%~NurUj5u8{U3c|@FaodgjRZY$T6F3WDdQoaTd z=LvT|=&z7xquJMrMZpp$K^dyROvfqypehdf>s!1<`+o?IE&oEP@Mft}6~X$0Z!OVH zQAsPA8D3WNM6F9{x<^7$32~)7pQqQYf@W4WBb4W8v#4qg-`58$^P3I+F4WJP8=n7b zFZKjro{xEc3OHM{nr4iKdI!TH?9R1ft7jXEUYl-vhoUj;^X8|g{V}j-xKdlN-53ZC zMZ?nW4Uvx=Sq50c!p09Ufn~K0bb5pE5vRQ;a@%Mp@jr{T%i4D|_)1_eR{N^tCpF{~ zFSL@AQc@>Dc}AxxI!hQKj1dxqal$1+l5m+YNw`Y5MwlW@6J`iE2sa7+gayJa!fnE$ zO1?MgjvS_R5h)xAO0iMtF8cgCp&bYOO*tl=MQ0Zv!z5W`lT#}hsq7xE`;Y$ytI6w$ delta 838 zcmZ9K%TH5L5XL*Vg`$;L?`;qgs8zI~G{Gv3A_-Ev0BH+FATig4s0Xw_rJSNbVnt(7 zQGDQlZK5vJjo?N-E2Dpc8znJ@7+DzOBPJ}=#JKXz4JxsVU%t#YbLMe7a|<41p`a^2 zf2~RWyx$_duIa}GKL7^MqSQhw)+s)SqIjeHMFz6&;kL@NR-iIE?R0S#A%>RxEav2v+7bTXhSI#eKTSlsD0|OBG(|7weqQ z!4j95I8@<4r(3fhr?N_kISa2Moe);nC&hM@^f5vo{@Ucu8IW=UUzWQuQn}Ffu$+{EKYeT?E8Wpm9m`Eop0PaM zua2&q!RmcP70V49#bV7oK+-r)*0&#Q6aPJK-=0>a9|)*0DIWSqz;^~N#yH)z;~GbQ}>Pt19`<$*+m!hPMD$u`uX_>-e>?6Q-$k zPE3|I;O$_uxEqN7OQ;D_0u7M~eo@4`Cb`Q~oZR~X#&NJE4GZ|ar8_rDeOrxp+NJ!6 zJmi6GcqinSe}#om+jtu#ki|O*#^>)P#R3jkV2%#(SFW>e_+1$TYn9&eq+nsvfvd_7YqmM#0805F z_)2ZiWxs43r0D?o%nsPJ`{jO|uI}+O@cvxnsj6)`fb!>ibUGd&UFJo#i7^q@YFZ6L zsD1_0&a>cmOt81G;<(S=f!EnC52I#dpYt#}cfuRz1p5FLwbLvJ4{L1fBRsBcmq*a@ z{XXjvv{qodcG1|5a(XsSvLAk4Xw1ecG1V7;v;UK|D=pu9zP9szkFQR{m z(1QpSC!>pz>(QBoOIdv~n!3V!Np%KpyXx5&c;*VrV<`B9qfqp*-JA}?xVv|6UOzJ% z?hEYJI9jV#ZlFjuf{##*$m)`bS$>YD#|RyS|HwTto6ntxC{R9i0h@!L&lU9-ylx1~ zVbuM=QP@D3&JVQ4n@oXkja!Zgd0!-Gh>$tgdoy$K#C$3X-w)L>8(2LP@+2x{_Aii0 z$0sR}sVta?C+89xtUKF^RWV;;1D%xOC36w|1a`yz*X&y9@xG^QRag?!EG;U6CZ78b$=g3jITD*@ySAkQ{bLwhN4a})8IW+>OVsa`3kHL_~20NZI)&v%> O+iaFh_%=vxN%;elxz@q} delta 798 zcmbu7&ubG=5XUp5iD^nw?P9kHNw!&A&7uf7Sdk{R)u{cElF$%I)1)C9TUVO|CR#)f z(t8nPZh{B#q_=htdT62Ij|%ERPtrd^EEJF8ObShUc9-|zy_xTu{qB3SmwB7^W<4Ia zO`h+`g`fIUZvaATr-R_EK*nZ7tO8VyLEd`T6SFJBtXkpG=wP_O?Z9D*`bH_;y8#LE zs0+#jC!VzwE;~*%6`$0)bBg1bq&1&PGkv$6Nm)+OR^Plb$Q32q*%CqNStbZI~ACPO?nkrg)JHi#vN(aY!C!e zv>nXBN9qsVff=@?IJ!CWnO=tCN`_}24%Ny~SWnP-ZQL2-IL75a;G6YaTLBm$E$q); zl=!G%OmIoiF9-@Q3lf4W48w&-WbPGQW#l`n<1Sv4)Hpo}pMW2< z9xf4jv(l$1t%%ZDC|!io9Vl0iasize; i++) { + // avoid overflow + if (tensor->data[i] >= 0) { + + float z = expf(-tensor->data[i]); + result_data[i] = 1 / (1 + z); + + } else { + + float z = expf(tensor->data[i]); + result_data[i] = z / (1 + z); + } + } +} + void cos_tensor_cpu(Tensor* tensor, float* result_data) { for (int i = 0; i < tensor->size; i++) { result_data[i] = cosf(tensor->data[i]); diff --git a/norch/csrc/cpu.h b/norch/csrc/cpu.h index 83bd83f..1d9547b 100644 --- a/norch/csrc/cpu.h +++ b/norch/csrc/cpu.h @@ -32,5 +32,6 @@ void transpose_axes_cpu(Tensor* tensor, float* result_data, int axis1, int axis2 void assign_tensor_cpu(Tensor* tensor, float* result_data); void sin_tensor_cpu(Tensor* tensor, float* result_data); void cos_tensor_cpu(Tensor* tensor, float* result_data); +void sigmoid_tensor_cpu(Tensor* tensor, float* result_data); #endif /* CPU_H */ diff --git a/norch/csrc/cuda.cu b/norch/csrc/cuda.cu index 7d056ab..da241e4 100644 --- a/norch/csrc/cuda.cu +++ b/norch/csrc/cuda.cu @@ -764,6 +764,39 @@ __host__ void cos_tensor_cuda(Tensor* tensor, float* result_data) { cudaDeviceSynchronize(); } +__global__ void sigmoid_tensor_cuda_kernel(float* data, float* result_data, int size) { + + int i = blockIdx.x * blockDim.x + threadIdx.x; + + if (i < size) { + // avoid overflow + if (data[i] >= 0) { + + float z = expf(-data[i]); + result_data[i] = 1 / (1 + z); + + } else { + + float z = expf(data[i]); + result_data[i] = z / (1 + z); + } + } +} + +__host__ void sigmoid_tensor_cuda(Tensor* tensor, float* result_data) { + + int number_of_blocks = (tensor->size + THREADS_PER_BLOCK - 1) / THREADS_PER_BLOCK; + sigmoid_tensor_cuda_kernel<<>>(tensor->data, result_data, tensor->size); + + cudaError_t error = cudaGetLastError(); + if (error != cudaSuccess) { + printf("CUDA error: %s\n", cudaGetErrorString(error)); + exit(-1); + } + + cudaDeviceSynchronize(); +} + diff --git a/norch/csrc/cuda.h b/norch/csrc/cuda.h index 73eb831..7f0f49f 100644 --- a/norch/csrc/cuda.h +++ b/norch/csrc/cuda.h @@ -73,6 +73,9 @@ __global__ void cos_tensor_cuda_kernel(float* data, float* result_data, int size); __host__ void cos_tensor_cuda(Tensor* tensor, float* result_data); + __global__ void sigmoid_tensor_cuda_kernel(float* data, float* result_data, int size); + __host__ void sigmoid_tensor_cuda(Tensor* tensor, float* result_data); + diff --git a/norch/csrc/tensor.cpp b/norch/csrc/tensor.cpp index 889fff6..6ac29e2 100644 --- a/norch/csrc/tensor.cpp +++ b/norch/csrc/tensor.cpp @@ -1290,6 +1290,43 @@ extern "C" { } } + Tensor* sigmoid_tensor(Tensor* tensor) { + char* device = (char*)malloc(strlen(tensor->device) + 1); + if (device != NULL) { + strcpy(device, tensor->device); + } else { + fprintf(stderr, "Memory allocation failed\n"); + exit(-1); + } + int ndim = tensor->ndim; + int* shape = (int*)malloc(ndim * sizeof(int)); + if (shape == NULL) { + fprintf(stderr, "Memory allocation failed\n"); + exit(1); + } + + for (int i = 0; i < ndim; i++) { + shape[i] = tensor->shape[i]; + } + + if (strcmp(tensor->device, "cuda") == 0) { + + float* result_data; + cudaMalloc((void **)&result_data, tensor->size * sizeof(float)); + sigmoid_tensor_cuda(tensor, result_data); + return create_tensor(result_data, shape, ndim, device); + } + else { + float* result_data = (float*)malloc(tensor->size * sizeof(float)); + if (result_data == NULL) { + fprintf(stderr, "Memory allocation failed\n"); + exit(1); + } + sigmoid_tensor_cpu(tensor, result_data); + return create_tensor(result_data, shape, ndim, device); + } + } + Tensor* transpose_tensor(Tensor* tensor) { char* device = (char*)malloc(strlen(tensor->device) + 1); if (device != NULL) { diff --git a/norch/libtensor.so b/norch/libtensor.so index 81254adae29b489efe3a4ff78e3b660f92ca5fc6..921564db54ba97b36ed57e04105c92944aee76ca 100755 GIT binary patch delta 49097 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 RkL@Qt-J}&^=6%`e{{b+!RTlsN delta 43009 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

|cHc%Ug^{ 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 diff --git a/norch/nn/__pycache__/activation.cpython-38.pyc b/norch/nn/__pycache__/activation.cpython-38.pyc index 0a2693bd37ebd5120abcdc7c9f3ff0a7df7ece86..cabcf189a092266ad3a7d3139e27b2e30bec28f3 100644 GIT binary patch delta 26 gcmcb>bAg9Dl$V!_0SJ!&@!iN>$jW$YaxLp+0Aj8PLI3~& delta 26 gcmcb>bAg9Dl$V!_0SH2mdvD|}WMzz+T+4bH09Von82|tP diff --git a/norch/nn/functional.py b/norch/nn/functional.py index 78b1f53..4c4d757 100644 --- a/norch/nn/functional.py +++ b/norch/nn/functional.py @@ -1,9 +1,11 @@ import math import norch import numpy as np +from norch.autograd.functions import * def sigmoid(x): - return 1.0 / (1.0 + (math.e) ** (-x)) + z = x.sigmoid() + return z def softmax(x, dim=None): if dim is not None and dim < 0: diff --git a/norch/tensor.py b/norch/tensor.py index a2f0cb5..f7f205e 100644 --- a/norch/tensor.py +++ b/norch/tensor.py @@ -948,6 +948,25 @@ class Tensor: return result_data + def sigmoid(self): + Tensor._C.sigmoid_tensor.argtypes = [ctypes.POINTER(CTensor)] + Tensor._C.sigmoid_tensor.restype = ctypes.POINTER(CTensor) + + result_tensor_ptr = Tensor._C.sigmoid_tensor(self.tensor) + + result_data = Tensor() + result_data.tensor = result_tensor_ptr + result_data.shape = self.shape.copy() + result_data.ndim = self.ndim + result_data.device = self.device + result_data.numel = self.numel + + result_data.requires_grad = self.requires_grad + if result_data.requires_grad: + result_data.grad_fn = SigmoidBackward(self) + + return result_data + def transpose(self, axis1, axis2): diff --git a/test.py b/test.py index 9468eb0..1d14a7d 100644 --- a/test.py +++ b/test.py @@ -81,9 +81,9 @@ train_loader = Dataloader(train_data, batch_size = BATCH_SIZE) class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() - self.fc1 = nn.Linear(784, 5) + self.fc1 = nn.Linear(784, 10) self.sigmoid1 = nn.Sigmoid() - self.fc2 = nn.Linear(5, 10) + self.fc2 = nn.Linear(10, 10) self.sigmoid2 = nn.Sigmoid() def forward(self, x): diff --git a/tests/test_autograd.py b/tests/test_autograd.py index 4739e7c..2265c6d 100644 --- a/tests/test_autograd.py +++ b/tests/test_autograd.py @@ -601,7 +601,7 @@ class TestTensorAutograd(unittest.TestCase): torch_result.backward() torch_tensor_grad = torch_tensor.grad - + self.assertTrue(utils.compare_torch(norch_tensor_grad, torch_tensor_grad)) def test_mse_loss_autograd(self): diff --git a/tests/test_operations.py b/tests/test_operations.py index 868f982..ad11717 100644 --- a/tests/test_operations.py +++ b/tests/test_operations.py @@ -258,10 +258,6 @@ class TestTensorOperations(unittest.TestCase): torch_expected_0 = torch_tensor.squeeze(0) self.assertTrue(utils.compare_torch(torch_squeeze_0, torch_expected_0)) - # Squeeze at dim=2 (should raise an error because size is not 1) - with self.assertRaises(ValueError): - norch_tensor.squeeze(2) - # Create a tensor with a dimension of size 1 in the middle norch_tensor_middle_1 = norch.Tensor([[[1, 2]], [[3, 4]]]).to(self.device) # shape [2, 1, 2]