From ad2b5323d9c7641abf98892029c3aa75471ff90a Mon Sep 17 00:00:00 2001 From: Dmitriy Shamatrin Date: Fri, 18 Dec 2020 12:36:36 +0200 Subject: [PATCH 1/5] Keras examples for single input and multiple inputs have been added. --- examples/keras_multiple_inputs_saved_model.rs | 51 ++++++++++++++++++ .../keras_multiple_inputs_saved_model.py | 39 ++++++++++++++ .../saved_model.pb | Bin 0 -> 109392 bytes .../variables/variables.data-00000-of-00001 | Bin 0 -> 4856 bytes .../variables/variables.index | Bin 0 -> 1389 bytes examples/keras_signle_input_saved_model.rs | 45 ++++++++++++++++ .../keras_signle_input_saved_model.py | 32 +++++++++++ .../saved_model.pb | Bin 0 -> 86045 bytes .../variables/variables.data-00000-of-00001 | Bin 0 -> 5485 bytes .../variables/variables.index | Bin 0 -> 1771 bytes 10 files changed, 167 insertions(+) create mode 100644 examples/keras_multiple_inputs_saved_model.rs create mode 100644 examples/keras_multiple_inputs_saved_model/keras_multiple_inputs_saved_model.py create mode 100644 examples/keras_multiple_inputs_saved_model/saved_model.pb create mode 100644 examples/keras_multiple_inputs_saved_model/variables/variables.data-00000-of-00001 create mode 100644 examples/keras_multiple_inputs_saved_model/variables/variables.index create mode 100644 examples/keras_signle_input_saved_model.rs create mode 100644 examples/keras_signle_input_saved_model/keras_signle_input_saved_model.py create mode 100644 examples/keras_signle_input_saved_model/saved_model.pb create mode 100644 examples/keras_signle_input_saved_model/variables/variables.data-00000-of-00001 create mode 100644 examples/keras_signle_input_saved_model/variables/variables.index diff --git a/examples/keras_multiple_inputs_saved_model.rs b/examples/keras_multiple_inputs_saved_model.rs new file mode 100644 index 0000000000..fbf2023342 --- /dev/null +++ b/examples/keras_multiple_inputs_saved_model.rs @@ -0,0 +1,51 @@ +use tensorflow::{SessionRunArgs, Graph, SessionOptions, Tensor, SavedModelBundle}; + +fn main() { + // In this file test_in_input is being used while in the python script, + // that generates the saved model from Keras model it has a name "test_in". + // For multiple inputs _input is not being appended to the op name. + let input_1_op_name = "test_in1"; + let input_2_op_name = "test_in2"; + let output_op_name = "test_out"; + let save_dir = "examples/keras_multiple_inputs_saved_model"; + let v1: Vec = vec![0.1, 0.2, 0.3, 0.4, 0.5]; + let v2 = vec![0.6, 0.7, 0.8, 0.9, 0.1]; + let tensor1 = vector_to_tensor(&v1); + let tensor2 = vector_to_tensor(&v2); + let mut graph = Graph::new(); + + let bundle = SavedModelBundle::load( + &SessionOptions::new(), + &["serve"], + &mut graph, + save_dir, + ).expect("Can't load saved model"); + + let session = &bundle.session; + + let signature = bundle.meta_graph_def().get_signature("serving_default").unwrap(); + let input_info1 = signature.get_input(input_1_op_name).unwrap(); + let input_info2 = signature.get_input(input_2_op_name).unwrap(); + let output_info = signature.get_output(output_op_name).unwrap(); + + let input_op1 = graph.operation_by_name_required(&input_info1.name().name).unwrap(); + let input_op2 = graph.operation_by_name_required(&input_info2.name().name).unwrap(); + let output_op = graph.operation_by_name_required(&output_info.name().name).unwrap(); + let mut args = SessionRunArgs::new(); + args.add_feed(&input_op1, 0, &tensor1); + args.add_feed(&input_op2, 0, &tensor2); + let out = args.request_fetch(&output_op, 0); + // + let result = session.run(&mut args); + if result.is_err() { + panic!("Error occured during calculations: {:?}", result); + } + let out_res:f32 = args.fetch(out).unwrap()[0]; + println!("Results: {:?}", out_res); +} + +pub fn vector_to_tensor(v: &Vec) -> Tensor { + let dimension = v.len(); + let tensor = Tensor::new(&[1, dimension as u64]).with_values(&v[..]).unwrap(); + return tensor; +} diff --git a/examples/keras_multiple_inputs_saved_model/keras_multiple_inputs_saved_model.py b/examples/keras_multiple_inputs_saved_model/keras_multiple_inputs_saved_model.py new file mode 100644 index 0000000000..5c10451a16 --- /dev/null +++ b/examples/keras_multiple_inputs_saved_model/keras_multiple_inputs_saved_model.py @@ -0,0 +1,39 @@ +import tensorflow as tf; +from tensorflow.python import keras +from tensorflow.keras import Sequential +from tensorflow.keras.layers import Dense +from tensorflow.keras.layers import Input +from tensorflow.keras.layers import Flatten +from tensorflow.keras.layers import Concatenate +from tensorflow.keras import Model +import numpy as np + + +input = Input((5)) +x = Flatten()(input) +x = Dense(3,'relu')(x) +dense = Model(input, x) + +input1 = Input((5), name='test_in1') +input2 = Input((5), name='test_in2') + +dense1 = dense(input1) +dense2 = dense(input2) + +merge_layer = Concatenate()([dense1, dense2]) +dense_layer = Dense(1, activation="sigmoid", name='test_out')(merge_layer) + +model = Model(inputs=[input1, input2], outputs=dense_layer) + +v1 = np.array([[0.1, 0.2, 0.3, 0.4, 0.5]]) +v2 = np.array([[0.6, 0.7, 0.8, 0.9, 0.1]]) +print(v1.shape) +x1, x2 = np.random.randn(100, 5), np.random.randn(100, 5) +print(x1.shape) +y = np.random.randn(100, 1) +# print(v1.shape) +# print(v2.shape) +outputs = np.array([1.0]); +model.compile(optimizer ='adam',loss='binary_crossentropy', metrics = ['accuracy']) +model.fit([v1, v2], outputs, epochs=1, batch_size=1) +model.save('examples/keras_multiple_inputs_saved_model', save_format='tf') diff --git a/examples/keras_multiple_inputs_saved_model/saved_model.pb b/examples/keras_multiple_inputs_saved_model/saved_model.pb new file mode 100644 index 0000000000000000000000000000000000000000..a4f7824da60c80be5b8847fe0dc82c7f6e156693 GIT binary patch literal 109392 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%0DlSSBx0KKdAJPeDdd9$ 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 C=nRJd literal 0 HcmV?d00001 diff --git a/examples/keras_multiple_inputs_saved_model/variables/variables.data-00000-of-00001 b/examples/keras_multiple_inputs_saved_model/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000000000000000000000000000000000000..a471e2cd4d30a89369c495aaba80ab34a68bac50 GIT binary patch literal 4856 zcmb_eO>7fK6t+p6OeV3x6GEH~5FjlS0d7*eon8q*|o634OmNvf_kVG~yP2fQ1n zAZTf6RSvneQV*?Ksi#)-=TIan5+_m*RWJQHRV@^$QYEBHRZplrA$4ZQj(5F3PGi=x z_RY+j@4YwQd-K+1|2dC#xr1M%zX>EA{{()IHU@`pzLEE#8~s)beP(B8g9|IK1<5Fb z=TARq3rW7quH2S_f%m+xuhd?aXMs=h zf8{@jKL|`QcLD^X4P$)eywUII+KDl*EB+SC!H?ctO4!(CqDP(whkBM1-yO>n`QwSv zrM`##N2vV6QuO|vyF|Xb!Yu#!ZT}LTA6;(wX;GHLkFGB#c0d^`{K%5u-I0>z#e4UA zne_X9qEDVb9*6vV{^g@YZU=Am&WumG3v%Dv0~01q1 z_h0(EkIZBF$k(^O^nchn)%^Wq_|OU)ffdy!xyyX^P!Aq#Dh@o*1!~Y%d4*jNr1R_o zFU*~nL|Lt-sOH6cYKw!zc#lnYj|Z#SifTS+2X&|+b5Rmf!WBLXTR}Z)ma?3X=BAT8 zo8z(q5k%Mq0BXtdbMr|&b%m3JOqxw*L=i99K?7f~H!sZP!{Np*6rDXNomy#%*I8`;-`UwD@Xzc8*BzcA`yOuza1=Oj6vLiH(L z$_g_g>;O-rcAEV9`PUBiqSiFdN4>m-U>~ZJcauY}I=P+T8GLG_M%ki&B%w*_>^CCx zfH9$6YC;bx2_>nsN0B<6YpHX{$WphlCAZpAkJ6H(j4ul;pOHE7C^_*~;^eRyCq4xy zRhO|7^y+b9fwI?qO0WHuygp*)^-+b_RbLcN&|mKL6gmqXr$Vuz(1}QxJr#;1!f3O^ zixQiem)!IYVfu9XfTytN?heJ{v7r-*czD9C27;$iLIZAJ11Faf};C7u)t;K$cOcW8YQkoQF}s1V`xN^*VH@4 zxAsZyE_}J*5|JG@OKV*~IYxazdC3frq)mh#?+7{G&E;pMYf<)7&!Xo^hv0En41s2P zlm;rG28P<)Yxt=^p(=3jRTJuT-zHnE22vpvrdKCLcF?0@y)(5 nqwD86w^5#RPlD&%#&|Zhy-uEU|DR`5v+Ls7z^EC|W=8)5r@wf_ literal 0 HcmV?d00001 diff --git a/examples/keras_multiple_inputs_saved_model/variables/variables.index b/examples/keras_multiple_inputs_saved_model/variables/variables.index new file mode 100644 index 0000000000000000000000000000000000000000..66e5d3cd4e6069b40507249f1534b7243799e352 GIT binary patch literal 1389 zcmZQzVB=tvV&Y(Akl~Ma_HcFf4)FK%3vqPvagFzP@^WCja}q04i{i^OOETiiQ!~>uN{V$2^^-Cai}AaYMF<#*3KBrKZnTKek~S6c4+!z} z^^9^2iVybj57EyrD9OyttV%7?&n3p7B_J0ClxI&fkr65*MneY^P(#D51V2$lVPM?k zr4k5N4xoG4KyKEMFm(y|drH<+j9eGPjZ)|VnRd12-$gSSF#@heX!-!sj2d+s}{84 zlIP7V0md7ibj=A&*D@L$ri`Wc92ty|e36rySd^EUmmXh~Sdxm*1W?W}09u%NI@E~4 zK(wSNF*7eQDJM0)EU_pP!~o?lJT71q0tF~55Hl;7XxNyVm5bHV!&Wc?O`EH7 z*v){bD1~V1VFGG0jgVa^A|ps34ng^bS)o9K$JEAM;gvXL`G#5H2_w*?qbc{i42a4% z%nB!%fEp%u8p<&MK`=7|0~3g$&d!?%q8UNNflmuJFfcNgGEC=!i = vec![0.1, 0.2, 0.3, 0.4, 0.5]; + + let tensor = vector_to_tensor(&v); + let mut graph = Graph::new(); + + let bundle = SavedModelBundle::load( + &SessionOptions::new(), + &["serve"], + &mut graph, + save_dir, + ).expect("Can't load saved model"); + + let session = &bundle.session; + + let signature = bundle.meta_graph_def().get_signature("serving_default").unwrap(); + let input_info = signature.get_input(input_op_name).unwrap(); + let output_info = signature.get_output(output_op_name).unwrap(); + let input_op = graph.operation_by_name_required(&input_info.name().name).unwrap(); + let output_op = graph.operation_by_name_required(&output_info.name().name).unwrap(); + let mut args = SessionRunArgs::new(); + args.add_feed(&input_op, 0, &tensor); + let out = args.request_fetch(&output_op, 0); + // + let result = session.run(&mut args); + if result.is_err() { + panic!("Error occured during calculations: {:?}", result); + } + let out_res:f32 = args.fetch(out).unwrap()[0]; + println!("Results: {:?}", out_res); +} + +pub fn vector_to_tensor(v: &Vec) -> Tensor { + let dimension = v.len(); + let tensor = Tensor::new(&[1, dimension as u64]).with_values(&v[..]).unwrap(); + return tensor; +} diff --git a/examples/keras_signle_input_saved_model/keras_signle_input_saved_model.py b/examples/keras_signle_input_saved_model/keras_signle_input_saved_model.py new file mode 100644 index 0000000000..28de026111 --- /dev/null +++ b/examples/keras_signle_input_saved_model/keras_signle_input_saved_model.py @@ -0,0 +1,32 @@ +import tensorflow as tf; +import tensorboard; +from tensorflow.python import keras +from tensorflow.keras import Sequential +from tensorflow.keras.layers import Dense + +import json; +import numpy as np; + + +tensorboard_callback = keras.callbacks.TensorBoard(log_dir="/tmp/logs") + +classifier = Sequential() +classifier.add(Dense(5, activation='relu', kernel_initializer='random_normal', name="test_in", input_dim=5)) +classifier.add(Dense(5, activation='relu')) +classifier.add(Dense(1, activation='sigmoid', name="test_out")) + + + +classifier.compile(optimizer ='adam',loss='binary_crossentropy', metrics = ['accuracy']) + + +classifier.fit([[0.1, 0.2, 0.3, 0.4, 0.5]], [[1]], batch_size=1, epochs=1, callbacks=[tensorboard_callback]); +result = classifier.predict([[0.1, 0.2, 0.3, 0.4, 0.5]]) + +print(result); +classifier.summary(); + +for layer in classifier.layers: + print(layer.name) + +classifier.save('examples/keras_signle_input_saved_model', save_format='tf') diff --git a/examples/keras_signle_input_saved_model/saved_model.pb b/examples/keras_signle_input_saved_model/saved_model.pb new file mode 100644 index 0000000000000000000000000000000000000000..ae075ff0081f09837a0494519f227f9fd509961a GIT binary patch literal 86045 zcmeHwTX0;-br>!Nk3oX~flH7Cn*<3CK`uGFBxZVMfSJ*1wFGyU%YBgsxhqAAc4`P* zfU_LTz%zs4a#!nzqEZyej-pf)+p3BzQ?@LxB3qFvvCB$DPAX0%PUMO{RH;-sl`2(5 z6;)iZ?2ml-M>&0;-S?jRm8BKh{2PTFzTPUgw5`4BwQ{3XX;tbqZSzvOT2&{>NV&1y zWU(8S8lW->Wg|C$;=}>MU#p~AX|~RC%Fdltpq2VZ*V_rAY^ft#d$kP!7~81Vwkq4| zShLlr)VArcI+UPfpYgV|+o-qd(zl~zN_$h=*lX1rC0>pAkrVJw6*39*KVPnGat2U| z0g1z80x-AAm73NNOD2wxN#JKg+bq?}I}%ctz!Jbik@JaDWIr&ceg}$fYVFE~)>QZD zOfU#KM~BG}G%PXN)EaFqIm#|%E~MCzw*L2gV}qS%ne*E>Gb`E5%FR@MHLs|@{`nE| zCYf$&%~q*WTfVI|Y8tR#AS-!@OqUErE9tFisv~5$IFy{Uv}-t}BoA0kCB?Wp93SQX zB~Qqd&Zw?>$j_66T=O#5DgA$fV!0HJy09dVdm6Zph|LfiN_NRUtIC^|a^} z87q$HWG={LPODN4q(TYNiNFN&8qH-NRym$ z)g6gWH=YnFD$;;K8f40@v_FDWpaIgzx?h#6Ah*d$sm@4b$~Xcf>LPH9OkCV7?<`kZ zF#dNspiXdR8KVpzYN<@vr0Sq1C9+`G6NwdF)2D*98!+S zq)e$Ia*iFX4zNbfcx#SCB!Vp(v9FWSR=rj3 z#^RC&h(j`c$M6N%MlQlXu9%dItAMU3M-{+_dbu+4wn@GGx&!Lvf}M%}Ei$XK-oVj6!6#(F zA5gv3fW3d(Q+Fh?y||)_{8I`!bG>GP^jedL!FlEj-5i3>hxL*(yT z9sH6)=Hxc?O9zzXX_*m+RJ0~?mz>2~5QzsU#sFn-QSUbev>)sg(Ds`G+L4%mP66!@ zJ#dYL=oHWm8@ieT+V~U@jeKMZXa}f(i*S4j=!WvHr+_v-1$08aGzD}hdSnXdhJ26U z!>52YHU&f@+cO1pAadU+pc}FgsYjjy+Wu2OG%ny%K$!epgP_k8&(qJEzdj8ct|)F)1xQ7zR7ZY8FcjR;5a(zREMsVEDJ@#J@wtN_@*Tw43) zQhZz;TKn1(`JqDQvVE)7Jf9+y@MT>80zc;C!zfr9z=kcb zG=RlWFa}^T3yhJe_=q}D-)&WPDsO2Gau|Xl2U-n?2l04Wsci<%ngBPZPB=f0K)Vk% zwC%krK)hAvL9tS`-fU_dGOkWQh^E{um3J#-IzFM2W@WopZtX$jjer{{PSi0YhC|}< zNp*x96;Sg&znZ7yny3A1-Y?e7Ynl;inzd_E{c1WO*EHu}(?NGlhlH9A+cnMm)pSIz ziTc-cRIKTrE5Nd2>InDO0(lGSnBnk*=i}xxBNOox>ZtB!BeU^EbxLwl(Q#nEvNQiQ zJWTS3i|{bRAJ*VumOosAheQ0~8F)C%AD)E=DAk^S4j!OXd;T&!K&kfp^Y8$r+VfZ7 z0ZO&!Uw{WF)t-NmB*`c*mx4b~Dh+?241+&VA_IQ_J_~;UI@b~G5cxX9W&L!O#80YY zdUt7(qw$1#xCYvZDfMjp6mUoHaXT7>TQ{1}IhNFM>&J=sY4xb_-A~t}_KG3$Vf8~~ z`n8MeS1zu-^la(1i!Z(UtUJ_5SB%Q!?r(-#mM>hqabx|;+N(F7y}m5tA+M=7Jh-Lk z9L=Jbb#p!dFT{2w`MH0aa`5T7Bz{Ja!(%~mIO~P;&On|%8-Nj+mwUPcu(RfK@RC4 zIWVsrGNK%^VRDE%vplap=V6r-b))BOqd*T128}*1sV{gii2*PAxP!}>u6n@6JlI$e zwindrJ#7=BJv8YwO`kD?aA6}j5>%ng!6{9>LAVcsVkw4x4I49MjL(!q@GtN3Ipfm` z|HR(~{hI{?VAYDPOvLl*sP6d&!>k}09aHh5Xjwc1rQYY1deSO29e=+{N?Wzk?K?c# z39vjRWBGuH<*NF!huucRhGuP>aM_$+ms86|+$UfLLJ{ip;0X0kL5$|yTs63v=iJ=y z=F88iS3M+H!4Is?bT|c5&ggj{xB8lc5^=%I!s5fYbuA|n0VWTf! zxO(lzm6xx4_}TT+^_Q;RSa!5~Cy3E^)jOW*5pT>6g)~3!n#UZFyQ}(b^{!9V;!MAc z)9uXl-Bo@^-SbrLaY*1)TjoG_75{?zF;B&~4*)0JnP0oB|1A}A^kl;ncj}@Nx2E9k z>W-}I?QV6w-3MK7qm-w@bUm=@h`Nr`9YNOvE03h>IMt!L9$0a7UB?NJpzDG4N7Z$l z_E239tQ%Z%3p{t0r=4tSTjjlKt7Jy0Av+dQtyM8|8X`{a%-DnEKyg-`jQ_;?N6|Ax z#U#z-F)OnR10`RG`DaD@rAyP`M!OScsl0xbQbwt`uJWuMWP3lU8j0AGWP*(=bNWBY zDKigyl*E{#Bp1lx(nh^n)izp{wpQ9H*UH=Ag{y2fRY+Ej%0VT0me5iIa)V3tTJ6j>JeEm*KX-VQ}u(56TWtd~*?+TIqlDc*uM z#ahq?+dxW8{C$kgpAs zOCoGj`}sYs)~b}NC1WAK0o%Vyu-yy{APD)@z_O}s>f7cxgdQU-6$%+JhsJbkwK=b- z`^ltb!4_6m=jY@X1$Z$|Cx028 z2}JHl$XHdHDl#5i(M6TXF_;Xjg1+P04gx#&xI9qBys%pK#|eK*F(A;J!wD$=u2{(C^uBT^*5py1VSzjU5N!}%1~!5 zYHbRVPmw8OZEtNkK2IJ;94mY$I`$uXDx^!O!99kpg^qe^*s#c+3754Rstv`f@gem^ z5|PKFWRc93_P~WzYVK+qm92`k%RH`{GamWg7^HnIiK?tCi>SvCl1irwImwQgB;$Lv z+qL?gnqecDKT0Wd{`d7<{NLd&+*{UUZMA?-*tHL406qg8@ntIghxll+=wnscU69Vd z?gP?s&mZli=U;I5`~`9}pyxB@OSoQuRC*yOpWFgox#a@vd8WWE7xrBRNweK^9H46ft$1C> z$`MhF9NxkX2lq@`%kC1(&yVXX@0pAGc;XzNa!*m+uS)5A$^q}o6#5p2WhiV0eVaw! z=Fqn*=-XBFZ61AFzz9a0%TR(DN-)DQpae6NV1^RRfMBnD0Il~WVD-KPq~4b(PT-*z z5?JVcS)l)TKRL8+IH+D@%f@L^`e{W?pZt9P6Kal$TVBVLUxXwfX~=cw zXXqST>oPret*hi)v^FPT@0$#a)@DW9{YzoAIZ<-|au{t^eA~ZN^z6d5PLc;bz(Kiz zYaQhNt#y&px7Jn08(u0b9}FuMo|uN03a#rtWQ(o!Jqc_LYo*hDx=J%bTWNKz?l5Al zbh=%4I5A#YU9vljSSwR@I<_y)pfnbgmp!FIbu00XTNx_xK#UkKBS<_DXIByr#CWW9 z>G@|by?E{Fl~-=)8&P$Z7q30f=KW?~`X3ZRok>|gQAv*lHLLnbfcVC_ z$P@F6*1Wv7_Ov}K53P0eFFO|0Qu;^3WWpvybsnj>IHo6T5Xk^>92BP<05>yiAoo7P zPbi+0tp?e}T!{DcT{20=^dmc)svg}8ism!OuCfWG+l~uWa19@@0g8sL)-0ynl-usw zc@GC5$i%4?y)^WT3h}HYRL>h4=Dna^->$o1bDs9_+yXIUj;Y?Z(A$JqZez%la@^zy zFVgNRBk%%FkaW<~-&WvID%ZLSYK_7V*-=9eI9Pp^Gy+HFu=YqiVZl6MJ@SO%JYkV| zBKxHTp0IxNgh@Qf1oI@*BTq8)9;PQ5geSpnIDsRXesd%vaU>hek!+6~$zuqE4Xwqzx?ya%v`a2j~atK>OovZ>=a{XpXPGZVRFjH21m@<*{pK-)d zc7^^H#*`I=DS8kuw~pOnCoIj`-S?#6hXk}9CT&rg{1SZpbTD-mNtbWUi0FZ_WmB1pqz28jkO z#-MI2T8TkvKG-7dz-(IoK$ysrbl-WBmU$u?v=~piv1lcpFdv>^HZ8&vGx{g;q$hJ0 z)e|Q3L^NnIo^)f;N<7K%0T)07jX^B&r$E1n z@&_}CJ4jd&nbebkj50~KkXeX@%zCwuS&DuGV-i&Cb!tY=(h*q1QvJ3Ep~>PRf`!<~ ztXCVErSbU;D)zF-JD>TbCW$=iyUh%3mUt9mGqYZ8X2$T*nqfAxceKXyu|y8_-GYV| zOB@QZpjodLG|TvK2(zFO4xveCB8U2JO+$+%4ux3LtXFHAW%2opVb-*FKEpEaME>;M zu7>tX{0XtES+90A%i;4G!|ZDBeCC^OC^D(E+>(88(aT0D2aqUmsCAH$v{mdD1<7P|Vq!{nQgq_6_Md0=`PiTZC zF`q&TE)Md5rf}Fa2AjrV83xO6*bD}n!C|u)Y!-*jVX!$Ib_Ii7!C_Z1*i{@hkHO|~ z*a8MyKqbr&3FF*_1;1Cq43{vhd=Xe&!mt8FV13$vNtodhhE)NA7nd+t$OtShVTMVV zt)Se^Al%KMkXZyWi$dlQ$Q%l}f zlMHu%3cDf6@5ISh;a+iZXR@_*E%F|FII%+7wG6upcgn4uy{dkAoUqBVVc%5Fw^#Bl zRpm{7tV($k1@atmLVp!*v3t4PdU>y^pOxk8w^H5LRfn{oqx*u`VV_!QlZ+Y7QO&>9 z+BLm^HnXVj!hx$b>}1HOd(0VJK5d|+zXF$ftpV>YZiZgk9meCxHwWN7srvuvj9HcK4DEv5u;k+y=@y#% ztMYHfGCy8Xzbgb%f4iuogQFQb+@Rh6&DQ_u{p80a|ceqN zZuo#!pCwBsw7nl2rEfxojng8eu`e5iRZv*w1M9FtZ-Kr~+XpmF&WlZuwrl$ofgS1= zH~6mYP$=WbvLq#vW6g7>O78ezXXFA_N|$lOGLnM&l}V8& z#Cilh^(&DhX|aU8dpm@n3|U5t1yU5uyLK16i&#eDonIM$-uaaX;hkTxK;HQkg0tI9 zhQrZu&DQ)lohGCLgz>|M;NSsc54rlX*4WlwW0!7e8@G4sm0GJwKMNOD@&iFC8|&J( z_U3bY)hbM^8@E*St+bU#b{r-B{6)!wWPG>Wf@2|SDpBLFH#5cM@**_*4{vfdgnFU&U3&nRT9aifQx8u=z=vNf7-}Oaxzn}*kZrDtv$6dvYhCAO6IAq!{ zW!d}E!)85=qQA1A9Jme^)!={t=hm^o0Rj45hs(N!I5;4n8gQ}2;DCV6F1COO#GLp$^H&`=+b z4dLtGp%HvLHcWtDhj#4Kp&j~jWOzx*P|pnQ$d5xi_uUZSCSVI7?)!q@M{@cPFJIpg*9EN|F;AM>PAt*MS& zD{tHm9FNCeH?X=J4E_YZx>u~Q#CSlcM}eSY#1`q>#l4MJG3V8?7Y-xRnH$95ftwyw z0DNz>w-VYwV>Tjo$hh*Bb5|Mak`dxJbVoe8MA&KTJ&Fab+YytGONDz(?1Zg!;-u(6 zRI&3-lHc~E%lw`~zM??FOq^ej#{VnwV*p2ee=GWTUc&uvrx-egAL3zfuY@o)>q{8C zxCEEg!l^)>Q*nUn0(%zY!z!Gz4fMe%%-Nbt>@dbl}(h0biHks_`h&nGNLXC}@is3D1F0 zJaeIVxRehD;!&VIheGj;0-nQxcsO12k?rRT)d z75wfV{bc=2UdmAkI9Z?H&0`&P&yS53ewtVHSYI>pSGc*yld^J8@jaFQce}ZC(#kJE zPUUwF=ubP3%z4Z>kJ?$(Z)(+2eq}|SCC2rrm6~yN3FLb4(5`cbm$i1;3Cl=ZAq*+Tmpp++S?M|b7((gbwMxt)u@18PXkSySs|xpdo*xvwB8!2T{NJtHO{G-KmEDM+MS=oi1zHOv|{o zdU|a)_Etd0bqVH)PTEGlr;wuoq&VGo34`+VU_tGS>6UX1XG_mIWW1>sQnwZ@;sj~Eaxk>e}AIY0kAAviXAMVRk zJDO)Z>?IG!Wvah?nEd51c}DD7jwMH9dGw!PS1t`a@+RVj( zt2)nGEUHoktiN15gBWsf8+e+`eiw+d&YHKrc-B^yg!{do8s&RQtXfUB(Ot67dL?*3 z?8cd3-7k_x*|b~({Y_Z48H;{{@-WFo>fxQKJFF`MT0nn8A^XJdwyIN+Rr1bndP*$e zqN(d8u+BXZF~1$^nDHW_;zt|yqO1M!;QBf9rlbZsDt}0%MDX1k67Ijc?{~F?zCno5 z1VPo!M)g6_Ax+4^PT@ceV|;M@NiMDM8Kc6doe*VrEtsrv%C{Z#OV&8$fY>TO?~vqD zcw?AyinyrjTIUsem~wFQ%ZyIwosYkZsQHm6<^bh)@$zJ7EBO6FGwzl;UEqlQ$usO5 zGn7AlJunn*akJ|+nMXe+yffF1&XUz>X3zaX;djW{wOfnWTj(No&JFkQ`@^n+KkUWm z{;)+Ke^^{K%_#CW2i@c~$v#0kNN*ZSzRc5`o?m~iAFDD} z800r8)@goSt+?-(_xsCnNXjNpi3@Li-i^NIE~Mnt#z)`v?OJaA^j+Vh58U9}}i`NtrG9d|4Z{P^6g8Tj$9?sn~h8~E{i z;oZQGKb%sSHBLERahJz^;K%phls)j{8@q$L59AK~_{MrbUk#85e*78o&A#N)u!3ZR z!#T2glmr(2=~S9;K9=9);0>HCYq$>qA}{}DDfn&emxQ4NkT8zK^$M_fl2z_03q~-I zpL(io?NzVAd98ZtkG6TKT&>-)+klrywhPa zl#F^*e{zXX<2>Ygt$G)pnsvT*F!rZ5RXACm4lBdS^JE_+P;FJV;kcK2tFA7nN69#e zUAp$_3><$;Vwd4zhz-9mlvh5k3?;AdXuvb;YrWsqz^qWFKbz^7VkB7N{(>-Kul~60 zafk|<>O8a5BQ2)OTuf{0PxtE4XRw|N>~i$$F%sIP{H1gz5V<2GBQ9r+7F7EAfI8G8 zkiD7+7X|%+f(E|Ng$;|2ERMe(C^WkGx;Z`g4Z`%K0m1D^pK-e5J*XX}#y;h~!RtJE zyf~}6J#JQ@&i$7?71Alx;6B6F!Y7!piHtoHE^9TkWA@+i_tzaI4?xJ!n)Zd06CQ%( zf!`k_4>+a*IG*X4G8`Kj9qZIw7@Um)cPpsg)7O%{4nf_VjdH(o2Yx$FAUo~@J>(9g z)A>P6(7IU5T0#tBf`gb~i{Esy3rBFm$fmF!(t8eJvr$2;^bY0tchlTwW#bMJBX#;YnFh^^Z(ONBOL6YcQ5q^ zJLt(##JsQ_AAKJy{#K7oToT8MZua>WR@0aR0WJVFT~MV$j)xA{63zV<-E6GnW`94^dgpYiJfb*4dZq6OLH{C@92aN<1^oVZ{9%6=IiITm7k za4;vrZ718*}<{yll2FAz0_%L=HzK1d+?w9fL{W0=3IU_ngELVlFgHpdLW;JpI z1hEHv6BK{^NFE(H`p{=HKHMhslyvg}~wK5?INa z{`K<^im4fedNWbgCrR9jrK&07M=M@hp>S$otyynuRqJ=);tRd{<=uw1S=ne6|M>4I zwQF85YQ$O6ykXj#k;e)oPwkkxBS6u780a^KkVf29^e}VGAq`U@;Vo0a(le zV`M5mqE6IzTa}&4TUvu0hU-8Nv>G6s^3AGNYL^=o{?G)tF?GWEc?52gJlN2-_o@K# zR+%6DY99Owka2b5w$>;&OXb}PnT}7W#GVG4WMBLxHC`%hz+RD3i6rAMt7r6Q;WSzP z$$O$KIU0XOJ#2|q*OZctH}QGC8K<>XGAecgS?Wk!0eSwv6K^Lrs^w<0#BVQ86c-cM z?b`qnPb?;^w@yL+)@B40Xf^gUc%{9$3!6fkCH)guwQ^(I`MTMEAWTRx0TA^@-LRjcr6XAdsTf?Xl4I!usTjrtBJ8}@+!#8$c5ZAY)dXm{?T@4!op*5+=x(c}!U zn%^jIZ)=;v3yaZGmrJ|@2;D7s20D!9YPqX4|BA@y{?WGwLlS314k|A5y+OL>!;3^i ztM2jU>@~I0P1t4!?@WyWjjX{Hb$m3dl&id#!8bRt>!AMiomc9OopRMh^Nv=oL5b9b z6rgXmHaE4l@sl^Asp;J1a^XBo@Txac(dUWl{2M?D(}dN3%nqw(!8-jH z4t(Ene(jXsEV6#kdBjXL-Zo1A>aC!UC zsi@K{Z8yrhw@Njwb*J9A4K+A}FARua#5Tb~f!7IkA$uXk5#20r+}3J*YDze!8UJA1 zC@SzF$Zin8thq@xAqLa4X-hgX8BEVXmcU?o22JU^ef6_7=67LCL#hlP{19u}ng$ZW zn#MAt2Gg@)&YM$Y7v}Cq^@-44O$ze~zek17PB&pK-nd)Z0IR(T>FbU9?p=MF(prtm z28Z|vSV$Xtjq=9b#79AdhTDKUT5Jfjc^sqVRe*BlTYK^EEI!?H@Wsut+orWrIx|#0`Sfg?vH(XLTi= z%crx9YnJ|%>0jX+$CYOJ)$B?t!!c>Q%}Q0D)YIDe)GE9w?=-;-uveR4W4uHDHV#`S zi8^M8hQ#BO>Ih%WfTv@hpQmF=_H<19dph=uo{oL-tCDBqT2#+Q;``%dzvH~nO$O6% z@$GT9EbL{mB>{6K?bCaG{1w*v9P8ZunV*~H(HSB>4IXCs!zFk) z#2=o4hr|5gS$Kd_?fK{60ZO&!FT(?rYR^9p4^XN-e+3?(RD1pfcz{yv`4oC8Re)_@COj3;SZo;@CT4&;18h4!XH48OB^SMV4=EkTMrFaD-gT9176o%t#Kc4 zEr!B(1+zPfil2c9dcqw+2RDN2KGwuBh>ve;H4U5wB?z1}O7)v> zKqT7~-4ot~x%;e-b|I_E^yNrtITR7XSCo&|Cy zeytDMalClUC2#X;OjFwP#Y2L$%?l81S;K(BhZh)7(vf7{34BCZ`>eJ|{Bc3nPXx*O zyjRv2L|HF~$vWz~ZeP61g&fFwy$`ZJSv(=gT7kZ8To(%t;$>6ZM~g>Har4jiL6A=G zhDn1<943uu67K{)qQre{ZW2!k5>E$7oOval5hb1tlXz6?eqX#xa~>pqqYn~?Q;i@; zYv^o@O>l4SvTn>AEFJ(E^OuwQOVh4FUo$dSR8452LmSr4u_86!s`^{W@F6+S5XDfG zVZ-u>f#nf8LWIlT1;JD7T!sptQF2DrD^YaRg%L4*?gIqU?)y+nKWO=xZ|S!cF!EQ` z(N?`xuEJwp9o?w!)mo4XSrC`_Q}Lp(j!%37Zi#i={)WkESXlH8x99C;o&^T$Da-4x zM~C1ywtf|YNTJ|7M8aGDKBx6hTCJaszh5OK*a&m`4rDp<9MGp^YCa%R^DTdBeqF)H zd0CH7eb87!h_u<^tmyQG71`30Kg>{?4GhH37WeZpYB6?JVW#|~SB4z{)R4mlM$ zmI}ZbOBLQ2h0Vz@W@{o*)efVo9fhhk38bnWk*anmRc-P&!|bny$vJTYhLe~io(0DD zxusJ1$e`J5RM2!T7a25@SN}vIf2e#j2E)kYbCAw@v9Zl_($q8=;e(HQ?hCOqWbBQR zrdHh|@i)vv{Rnv@ZUxWz*PU|nHf-)6hfH<76r9$tPLfghdHW7Ox?ep^;^yXnraJkB zSey*+4iWxgmXObBf0SEbu z82j%r()*E0Io6MxehVvozyi0w^?@MR^7S4N?++CAKb5deP3pf^$Y(&0|GrC)Crv%p zHEY(ER{!P8jbdmwAQ!SA~67iM%`Z zoDi2b~a*aef=gI|cL-cB3XLHkL%*)9K%!v42HE{bEJIcbRlp|AnP>pm;#SEfD^ z)c(1`{VY+fJmLZ*u?A%aEWZsRX z$OU05W8%}pCxoA#IRRXJ>TmX;`~6*YcxIL^--|s#PTz~cH7TDSUa)SURz0;sOo8a_ z)nSi*dU&2FDIYLys@;h=;9c#m74x4SK8V(?enaVlk(DZ}sJCpW0^S zX*gKVJvO{^j(=8(x^{!bqk6M%e8qbjAA~w+Q8wFaiv))Gx9C%md6b6r?MG}Lb=|@H z(iAw=zuTrn;>y>RNYmdZ6`LQI@5P=Wv3s#0^8R;YMUr=~Q=+b2x|`g7t1n9fnBK_b yeVg9yMqZG?1lLVFaLs~Qm@g6fah^Qz2dtJpPyhCm_EvP085q<}LvRK`1O7k!4>F+u literal 0 HcmV?d00001 diff --git a/examples/keras_signle_input_saved_model/variables/variables.data-00000-of-00001 b/examples/keras_signle_input_saved_model/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000000000000000000000000000000000000..b38e7e3e1a411f4f13b0ae20670fe0ad5a8c0c35 GIT binary patch literal 5485 zcmb_eYfMvD94{bnIar{FSFLO+V@^dVEvN{zJSGYZ2g3qRr_Dt!(AXB&URnXS88n(K znOU+g>W5{<8Rj0z_F?ly>*DrdZdqco#Vm85)R^g_X4%Wk>GnV8_HoO7aP2H1=XcNl z@jK`I{^xOG%lo!_rMAdg^BQ_bW_eL)El>mu6M=oR9T8*!;<9P!v)(_0{m6-L3%sI-; zxngF*lqX^`#F(%WQ+^^-fihF!Y^EX+Q*n&RsKm4&k;$aYv{20SVG1l+37+TTK`g{P zfing;o^@IPKN-PRl*KH<>4V%3b{rX)#aQp=SfAJB9d`Oyo-<{_@~3!=O#re9Xa)t^ihg(ts-U#&Y;`Hj}|hexY!HTDOc16<|$Ym zy5l???{n?&!{#W%nbD6$%+q+GU{|Vjt-C^pw&2Yur?0uEy}6~c)!EnF+1rY9c+Sr| zU0$=W9ZahQvc&BlF`6rz9gd#%mR?8eCUasQ)Q26C-1DQk$@VhU$Yv%cwY)hXj#$6h z-w_=Yb}nL;igb8JO^0Pt9hQrASTUClTF;2hxKFxLgPhmTscB%*pn(JTNHQZKv!VhP zvlazl&yXDid&Yu@0^;w80tzP@V#-AdtW;B=LaIQeSON1~3TQn$x8fHi>y%4tb##nZ z6TzxMgnryBNv@A2SJc6(Ne4Kshz@XC2|9?sBRVLY_lT(y>0nXQ!7A0ETC79OTsmmI zS=#V=$x>xC53(LJxm--kV~+y*t#(Ru;tolsY??{9oJ{5MTtd(P$Yzyfv#Mq5z-^MT zAv!jCL7G;?hekWpa>2LVcwQH)R^RDRuBiw)`r=w3?Vm zpW0syJOI|<+L<9BOv{1bS$guft>UuEvm>o+-W z&9xp#w$=lWq1FS*)w(LR##)!3w}x6*CD&Bz^0S_^)>VnM*Sh?~HPpH)zt&oppZlD( HuEzZzq$vJ9 literal 0 HcmV?d00001 diff --git a/examples/keras_signle_input_saved_model/variables/variables.index b/examples/keras_signle_input_saved_model/variables/variables.index new file mode 100644 index 0000000000000000000000000000000000000000..f29e13ee823937501ab142637f8da956271a40e9 GIT binary patch literal 1771 zcmZQzVB=tvV&Y(Akl~Ma_HcFf4)FK%3vqPvagFzP@^WteW33LBV!rb)h^_sL8~jDV{Vns%@NH5p6Td=*v{ zG9)^r?=S-WyTS1HH;RM0hXrU-gHlT)(A2ZxV6-7x3YK01*Pj@DN_|Fg| zh9#L9>cdQQZp3Nd9>=ecXqrw&z zph-*WOFM{*2}XrIY(Nc@-z?oEswf5vJAB0tEYUG4d;le%1<@_DsgUj&6&8S!kd#8I z0r8>DsIUT*j65C)2QX;!Axej&)RM$_L;N|OL16+Y%>TYVexF~4&xnxXDImqW-~PJE zrNEbxnw(fkNW%<}hGo@)R$TIYnI*s?3s0HO2`tk)m^3&{8B6aua%u48q$U>SW#*;F z7bTXY;?oGK4Ca6=$~+xv!~g^p%nS@nAV$s%K~@mW2qF%ATDXCMk-30jDlc3tDs8s> WEMAV~y!;>`{2=^yL$^w)`)vS`DbE7{ literal 0 HcmV?d00001 From 43d7169bdcaff630a624f7e65ad7ac7949d6b96f Mon Sep 17 00:00:00 2001 From: Dmitriy Shamatrin Date: Fri, 18 Dec 2020 12:37:57 +0200 Subject: [PATCH 2/5] Performed minor cleanup --- examples/keras_multiple_inputs_saved_model.rs | 2 +- examples/keras_signle_input_saved_model.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/keras_multiple_inputs_saved_model.rs b/examples/keras_multiple_inputs_saved_model.rs index fbf2023342..605a58de3c 100644 --- a/examples/keras_multiple_inputs_saved_model.rs +++ b/examples/keras_multiple_inputs_saved_model.rs @@ -35,7 +35,7 @@ fn main() { args.add_feed(&input_op1, 0, &tensor1); args.add_feed(&input_op2, 0, &tensor2); let out = args.request_fetch(&output_op, 0); - // + let result = session.run(&mut args); if result.is_err() { panic!("Error occured during calculations: {:?}", result); diff --git a/examples/keras_signle_input_saved_model.rs b/examples/keras_signle_input_saved_model.rs index bd1a14ffc9..718956a6bf 100644 --- a/examples/keras_signle_input_saved_model.rs +++ b/examples/keras_signle_input_saved_model.rs @@ -29,7 +29,7 @@ fn main() { let mut args = SessionRunArgs::new(); args.add_feed(&input_op, 0, &tensor); let out = args.request_fetch(&output_op, 0); - // + let result = session.run(&mut args); if result.is_err() { panic!("Error occured during calculations: {:?}", result); From 8c89064d4ac5b9dc03228d8184acecc7e453fd00 Mon Sep 17 00:00:00 2001 From: Dmitriy Shamatrin Date: Wed, 24 Feb 2021 01:21:02 +0200 Subject: [PATCH 3/5] Performed cleanup. Applied requested changes --- examples/keras_multiple_inputs_saved_model.rs | 71 +++++++++--------- .../keras_multiple_inputs_saved_model.py | 7 +- examples/keras_signle_input_saved_model.rs | 45 ----------- examples/keras_single_input_saved_model.rs | 46 ++++++++++++ .../keras_single_input_saved_model.py} | 13 +--- .../saved_model.pb | Bin .../variables/variables.data-00000-of-00001 | Bin .../variables/variables.index | Bin 8 files changed, 89 insertions(+), 93 deletions(-) delete mode 100644 examples/keras_signle_input_saved_model.rs create mode 100644 examples/keras_single_input_saved_model.rs rename examples/{keras_signle_input_saved_model/keras_signle_input_saved_model.py => keras_single_input_saved_model/keras_single_input_saved_model.py} (74%) rename examples/{keras_signle_input_saved_model => keras_single_input_saved_model}/saved_model.pb (100%) rename examples/{keras_signle_input_saved_model => keras_single_input_saved_model}/variables/variables.data-00000-of-00001 (100%) rename examples/{keras_signle_input_saved_model => keras_single_input_saved_model}/variables/variables.index (100%) diff --git a/examples/keras_multiple_inputs_saved_model.rs b/examples/keras_multiple_inputs_saved_model.rs index 605a58de3c..e58fe8fc86 100644 --- a/examples/keras_multiple_inputs_saved_model.rs +++ b/examples/keras_multiple_inputs_saved_model.rs @@ -1,51 +1,54 @@ -use tensorflow::{SessionRunArgs, Graph, SessionOptions, Tensor, SavedModelBundle}; +use tensorflow::{Graph, SavedModelBundle, SessionOptions, SessionRunArgs, Tensor}; fn main() { // In this file test_in_input is being used while in the python script, // that generates the saved model from Keras model it has a name "test_in". - // For multiple inputs _input is not being appended to the op name. - let input_1_op_name = "test_in1"; - let input_2_op_name = "test_in2"; - let output_op_name = "test_out"; + // For multiple inputs _input is not being appended to signature input parameter name. + let signature_input_1_parameter_name = "test_in1"; + let signature_input_2_parameter_name = "test_in2"; + let signature_output_parameter_name = "test_out"; + let save_dir = "examples/keras_multiple_inputs_saved_model"; - let v1: Vec = vec![0.1, 0.2, 0.3, 0.4, 0.5]; - let v2 = vec![0.6, 0.7, 0.8, 0.9, 0.1]; - let tensor1 = vector_to_tensor(&v1); - let tensor2 = vector_to_tensor(&v2); + + let tensor1: Tensor = Tensor::from(&[0.1, 0.2, 0.3, 0.4, 0.5][..]); + let tensor2: Tensor = Tensor::from(&[0.6, 0.7, 0.8, 0.9, 0.1][..]); let mut graph = Graph::new(); - let bundle = SavedModelBundle::load( - &SessionOptions::new(), - &["serve"], - &mut graph, - save_dir, - ).expect("Can't load saved model"); + let bundle = SavedModelBundle::load(&SessionOptions::new(), &["serve"], &mut graph, save_dir) + .expect("Can't load saved model"); let session = &bundle.session; - let signature = bundle.meta_graph_def().get_signature("serving_default").unwrap(); - let input_info1 = signature.get_input(input_1_op_name).unwrap(); - let input_info2 = signature.get_input(input_2_op_name).unwrap(); - let output_info = signature.get_output(output_op_name).unwrap(); + let signature = bundle + .meta_graph_def() + .get_signature("serving_default") + .unwrap(); + let input_info1 = signature + .get_input(signature_input_1_parameter_name) + .unwrap(); + let input_info2 = signature + .get_input(signature_input_2_parameter_name) + .unwrap(); + let output_info = signature + .get_output(signature_output_parameter_name) + .unwrap(); - let input_op1 = graph.operation_by_name_required(&input_info1.name().name).unwrap(); - let input_op2 = graph.operation_by_name_required(&input_info2.name().name).unwrap(); - let output_op = graph.operation_by_name_required(&output_info.name().name).unwrap(); + let input_op1 = graph + .operation_by_name_required(&input_info1.name().name) + .unwrap(); + let input_op2 = graph + .operation_by_name_required(&input_info2.name().name) + .unwrap(); + let output_op = graph + .operation_by_name_required(&output_info.name().name) + .unwrap(); let mut args = SessionRunArgs::new(); args.add_feed(&input_op1, 0, &tensor1); args.add_feed(&input_op2, 0, &tensor2); let out = args.request_fetch(&output_op, 0); - - let result = session.run(&mut args); - if result.is_err() { - panic!("Error occured during calculations: {:?}", result); - } - let out_res:f32 = args.fetch(out).unwrap()[0]; + let result = session + .run(&mut args) + .expect("Error occured during calculations: {:?}"); + let out_res: f32 = args.fetch(out).unwrap()[0]; println!("Results: {:?}", out_res); } - -pub fn vector_to_tensor(v: &Vec) -> Tensor { - let dimension = v.len(); - let tensor = Tensor::new(&[1, dimension as u64]).with_values(&v[..]).unwrap(); - return tensor; -} diff --git a/examples/keras_multiple_inputs_saved_model/keras_multiple_inputs_saved_model.py b/examples/keras_multiple_inputs_saved_model/keras_multiple_inputs_saved_model.py index 5c10451a16..95615530da 100644 --- a/examples/keras_multiple_inputs_saved_model/keras_multiple_inputs_saved_model.py +++ b/examples/keras_multiple_inputs_saved_model/keras_multiple_inputs_saved_model.py @@ -8,7 +8,6 @@ from tensorflow.keras import Model import numpy as np - input = Input((5)) x = Flatten()(input) x = Dense(3,'relu')(x) @@ -28,11 +27,13 @@ v1 = np.array([[0.1, 0.2, 0.3, 0.4, 0.5]]) v2 = np.array([[0.6, 0.7, 0.8, 0.9, 0.1]]) print(v1.shape) +print(v2.shape) + x1, x2 = np.random.randn(100, 5), np.random.randn(100, 5) print(x1.shape) +print(x2.shape) y = np.random.randn(100, 1) -# print(v1.shape) -# print(v2.shape) + outputs = np.array([1.0]); model.compile(optimizer ='adam',loss='binary_crossentropy', metrics = ['accuracy']) model.fit([v1, v2], outputs, epochs=1, batch_size=1) diff --git a/examples/keras_signle_input_saved_model.rs b/examples/keras_signle_input_saved_model.rs deleted file mode 100644 index 718956a6bf..0000000000 --- a/examples/keras_signle_input_saved_model.rs +++ /dev/null @@ -1,45 +0,0 @@ -use tensorflow::{SessionRunArgs, Graph, SessionOptions, Tensor, SavedModelBundle}; - -fn main() { - // In this file test_in_input is being used while in the python script, - // that generates the saved model from Keras model it has a name "test_in". - // For multiple inputs _input is not being appended to the op name. - let input_op_name = "test_in_input"; - let output_op_name = "test_out"; - let save_dir = "examples/keras_signle_input_saved_model"; - let v: Vec = vec![0.1, 0.2, 0.3, 0.4, 0.5]; - - let tensor = vector_to_tensor(&v); - let mut graph = Graph::new(); - - let bundle = SavedModelBundle::load( - &SessionOptions::new(), - &["serve"], - &mut graph, - save_dir, - ).expect("Can't load saved model"); - - let session = &bundle.session; - - let signature = bundle.meta_graph_def().get_signature("serving_default").unwrap(); - let input_info = signature.get_input(input_op_name).unwrap(); - let output_info = signature.get_output(output_op_name).unwrap(); - let input_op = graph.operation_by_name_required(&input_info.name().name).unwrap(); - let output_op = graph.operation_by_name_required(&output_info.name().name).unwrap(); - let mut args = SessionRunArgs::new(); - args.add_feed(&input_op, 0, &tensor); - let out = args.request_fetch(&output_op, 0); - - let result = session.run(&mut args); - if result.is_err() { - panic!("Error occured during calculations: {:?}", result); - } - let out_res:f32 = args.fetch(out).unwrap()[0]; - println!("Results: {:?}", out_res); -} - -pub fn vector_to_tensor(v: &Vec) -> Tensor { - let dimension = v.len(); - let tensor = Tensor::new(&[1, dimension as u64]).with_values(&v[..]).unwrap(); - return tensor; -} diff --git a/examples/keras_single_input_saved_model.rs b/examples/keras_single_input_saved_model.rs new file mode 100644 index 0000000000..11ed30092d --- /dev/null +++ b/examples/keras_single_input_saved_model.rs @@ -0,0 +1,46 @@ +use tensorflow::{Graph, SavedModelBundle, SessionOptions, SessionRunArgs, Tensor}; + +fn main() { + // In this file test_in_input is being used while in the python script, + // that generates the saved model from Keras model it has a name "test_in". + // For multiple inputs _input is not being appended to signature input parameter name. + let signature_input_parameter_name = "test_in_input"; + let signature_output_parameter_name = "test_out"; + let save_dir = "examples/keras_single_input_saved_model"; + let tensor = Tensor::from(&[0.1, 0.2, 0.3, 0.4, 0.5][..]); + let mut graph = Graph::new(); + + let bundle = SavedModelBundle::load(&SessionOptions::new(), &["serve"], &mut graph, save_dir) + .expect("Can't load saved model"); + + let session = &bundle.session; + + let signature = bundle + .meta_graph_def() + .get_signature("serving_default") + .unwrap(); + + let input_info = signature.get_input(signature_input_parameter_name).unwrap(); + let output_info = signature + .get_output(signature_output_parameter_name) + .unwrap(); + + let input_op = graph + .operation_by_name_required(&input_info.name().name) + .unwrap(); + let output_op = graph + .operation_by_name_required(&output_info.name().name) + .unwrap(); + + let mut args = SessionRunArgs::new(); + args.add_feed(&input_op, 0, &tensor); + + let out = args.request_fetch(&output_op, 0); + + let result = session + .run(&mut args) + .expect("Error occurred during calculations"); + let out_res: f32 = args.fetch(out).unwrap()[0]; + + println!("Results: {:?}", out_res); +} diff --git a/examples/keras_signle_input_saved_model/keras_signle_input_saved_model.py b/examples/keras_single_input_saved_model/keras_single_input_saved_model.py similarity index 74% rename from examples/keras_signle_input_saved_model/keras_signle_input_saved_model.py rename to examples/keras_single_input_saved_model/keras_single_input_saved_model.py index 28de026111..b1b8444f78 100644 --- a/examples/keras_signle_input_saved_model/keras_signle_input_saved_model.py +++ b/examples/keras_single_input_saved_model/keras_single_input_saved_model.py @@ -1,26 +1,17 @@ import tensorflow as tf; -import tensorboard; from tensorflow.python import keras from tensorflow.keras import Sequential from tensorflow.keras.layers import Dense - -import json; import numpy as np; - -tensorboard_callback = keras.callbacks.TensorBoard(log_dir="/tmp/logs") - classifier = Sequential() classifier.add(Dense(5, activation='relu', kernel_initializer='random_normal', name="test_in", input_dim=5)) classifier.add(Dense(5, activation='relu')) classifier.add(Dense(1, activation='sigmoid', name="test_out")) +classifier.compile(optimizer ='adam', loss='binary_crossentropy', metrics = ['accuracy']) - -classifier.compile(optimizer ='adam',loss='binary_crossentropy', metrics = ['accuracy']) - - -classifier.fit([[0.1, 0.2, 0.3, 0.4, 0.5]], [[1]], batch_size=1, epochs=1, callbacks=[tensorboard_callback]); +classifier.fit([[0.1, 0.2, 0.3, 0.4, 0.5]], [[1]], batch_size=1, epochs=1); result = classifier.predict([[0.1, 0.2, 0.3, 0.4, 0.5]]) print(result); diff --git a/examples/keras_signle_input_saved_model/saved_model.pb b/examples/keras_single_input_saved_model/saved_model.pb similarity index 100% rename from examples/keras_signle_input_saved_model/saved_model.pb rename to examples/keras_single_input_saved_model/saved_model.pb diff --git a/examples/keras_signle_input_saved_model/variables/variables.data-00000-of-00001 b/examples/keras_single_input_saved_model/variables/variables.data-00000-of-00001 similarity index 100% rename from examples/keras_signle_input_saved_model/variables/variables.data-00000-of-00001 rename to examples/keras_single_input_saved_model/variables/variables.data-00000-of-00001 diff --git a/examples/keras_signle_input_saved_model/variables/variables.index b/examples/keras_single_input_saved_model/variables/variables.index similarity index 100% rename from examples/keras_signle_input_saved_model/variables/variables.index rename to examples/keras_single_input_saved_model/variables/variables.index From ce8b1c98933e68c46cd51de249c9d6888a2c7623 Mon Sep 17 00:00:00 2001 From: Dmitriy Shamatrin Date: Wed, 24 Feb 2021 18:25:55 +0200 Subject: [PATCH 4/5] One more cleanup --- examples/keras_multiple_inputs_saved_model.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/keras_multiple_inputs_saved_model.rs b/examples/keras_multiple_inputs_saved_model.rs index e58fe8fc86..e117592dc7 100644 --- a/examples/keras_multiple_inputs_saved_model.rs +++ b/examples/keras_multiple_inputs_saved_model.rs @@ -46,7 +46,7 @@ fn main() { args.add_feed(&input_op1, 0, &tensor1); args.add_feed(&input_op2, 0, &tensor2); let out = args.request_fetch(&output_op, 0); - let result = session + session .run(&mut args) .expect("Error occured during calculations: {:?}"); let out_res: f32 = args.fetch(out).unwrap()[0]; From 756920c8f18ea121d49fa1452c4604494c20ca49 Mon Sep 17 00:00:00 2001 From: Dmitriy Shamatrin Date: Wed, 24 Feb 2021 20:08:34 +0200 Subject: [PATCH 5/5] Updated tensor creation for single input model --- examples/keras_single_input_saved_model.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/examples/keras_single_input_saved_model.rs b/examples/keras_single_input_saved_model.rs index 11ed30092d..b90c57c1bd 100644 --- a/examples/keras_single_input_saved_model.rs +++ b/examples/keras_single_input_saved_model.rs @@ -6,8 +6,12 @@ fn main() { // For multiple inputs _input is not being appended to signature input parameter name. let signature_input_parameter_name = "test_in_input"; let signature_output_parameter_name = "test_out"; - let save_dir = "examples/keras_single_input_saved_model"; - let tensor = Tensor::from(&[0.1, 0.2, 0.3, 0.4, 0.5][..]); + + let save_dir = + "examples/keras_single_input_saved_model"; + let tensor: Tensor = Tensor::new(&[1, 5]) + .with_values(&[0.1, 0.2, 0.3, 0.4, 0.5]) + .expect("Can't create tensor"); let mut graph = Graph::new(); let bundle = SavedModelBundle::load(&SessionOptions::new(), &["serve"], &mut graph, save_dir) @@ -37,7 +41,7 @@ fn main() { let out = args.request_fetch(&output_op, 0); - let result = session + session .run(&mut args) .expect("Error occurred during calculations"); let out_res: f32 = args.fetch(out).unwrap()[0];