4141max_conv_inputs = 1
4242max_mdense_tmp = 1
4343
44- def printVector (f , vector , name ):
44+ def printVector (f , vector , name , dtype = 'float' ):
4545 v = np .reshape (vector , (- 1 ));
4646 #print('static const float ', name, '[', len(v), '] = \n', file=f)
47- f .write ('static const float {}[{}] = {{\n ' .format (name , len (v )))
47+ f .write ('static const {} {}[{}] = {{\n ' .format (dtype , name , len (v )))
4848 for i in range (0 , len (v )):
4949 f .write ('{}' .format (v [i ]))
5050 if (i != len (v )- 1 ):
@@ -59,11 +59,51 @@ def printVector(f, vector, name):
5959 f .write ('\n };\n \n ' )
6060 return ;
6161
62+ def printSparseVector (f , A , name ):
63+ N = A .shape [0 ]
64+ W = np .zeros ((0 ,))
65+ diag = np .concatenate ([np .diag (A [:,:N ]), np .diag (A [:,N :2 * N ]), np .diag (A [:,2 * N :])])
66+ A [:,:N ] = A [:,:N ] - np .diag (np .diag (A [:,:N ]))
67+ A [:,N :2 * N ] = A [:,N :2 * N ] - np .diag (np .diag (A [:,N :2 * N ]))
68+ A [:,2 * N :] = A [:,2 * N :] - np .diag (np .diag (A [:,2 * N :]))
69+ printVector (f , diag , name + '_diag' )
70+ for i in range (3 * N // 16 ):
71+ for j in range (N ):
72+ W = np .concatenate ([W , A [j , i * 16 :(i + 1 )* 16 ]])
73+ printVector (f , W , name )
74+ idx = np .tile (np .concatenate ([np .array ([N ]), np .arange (N )]), 3 * N // 16 )
75+ printVector (f , idx , name + '_idx' , dtype = 'int' )
76+ return ;
77+
6278def dump_layer_ignore (self , f , hf ):
6379 print ("ignoring layer " + self .name + " of type " + self .__class__ .__name__ )
6480 return False
6581Layer .dump_layer = dump_layer_ignore
6682
83+ def dump_sparse_gru (self , f , hf ):
84+ global max_rnn_neurons
85+ name = 'sparse_' + self .name
86+ print ("printing layer " + name + " of type sparse " + self .__class__ .__name__ )
87+ weights = self .get_weights ()
88+ printSparseVector (f , weights [1 ], name + '_recurrent_weights' )
89+ printVector (f , weights [- 1 ], name + '_bias' )
90+ if hasattr (self , 'activation' ):
91+ activation = self .activation .__name__ .upper ()
92+ else :
93+ activation = 'TANH'
94+ if hasattr (self , 'reset_after' ) and not self .reset_after :
95+ reset_after = 0
96+ else :
97+ reset_after = 1
98+ neurons = weights [0 ].shape [1 ]// 3
99+ max_rnn_neurons = max (max_rnn_neurons , neurons )
100+ f .write ('const SparseGRULayer {} = {{\n {}_bias,\n {}_recurrent_weights_diag,\n {}_recurrent_weights,\n {}_recurrent_weights_idx,\n {}, ACTIVATION_{}, {}\n }};\n \n '
101+ .format (name , name , name , name , name , weights [0 ].shape [1 ]// 3 , activation , reset_after ))
102+ hf .write ('#define {}_OUT_SIZE {}\n ' .format (name .upper (), weights [0 ].shape [1 ]// 3 ))
103+ hf .write ('#define {}_STATE_SIZE {}\n ' .format (name .upper (), weights [0 ].shape [1 ]// 3 ))
104+ hf .write ('extern const SparseGRULayer {};\n \n ' .format (name ));
105+ return True
106+
67107def dump_gru_layer (self , f , hf ):
68108 global max_rnn_neurons
69109 name = self .name
@@ -205,6 +245,8 @@ def dump_embedding_layer(self, f, hf):
205245 if layer .dump_layer (f , hf ):
206246 layer_list .append (layer .name )
207247
248+ dump_sparse_gru (model .get_layer ('gru_a' ), f , hf )
249+
208250hf .write ('#define MAX_RNN_NEURONS {}\n \n ' .format (max_rnn_neurons ))
209251hf .write ('#define MAX_CONV_INPUTS {}\n \n ' .format (max_conv_inputs ))
210252hf .write ('#define MAX_MDENSE_TMP {}\n \n ' .format (max_mdense_tmp ))
0 commit comments