@@ -90,15 +90,13 @@ def test_activations(activation_function, backend):
90
90
91
91
assert list (hls_model .get_layers ())[2 ].attributes ['class_name' ] == activation_function .__class__ .__name__
92
92
93
-
94
- keras_conv1d = [Conv1D ]
95
93
padds_options = ['same' , 'valid' ]
96
- @pytest .mark .parametrize ("conv1d" , keras_conv1d )
97
- @pytest .mark .parametrize ("padds" , padds_options )
98
- def test_conv1d (conv1d , padds ):
94
+ @pytest .mark .parametrize ('padds' , padds_options )
95
+ @pytest .mark .parametrize ('backend' , [ 'Vivado' , 'Quartus' ] )
96
+ def test_conv1d (padds , backend ):
99
97
model = tf .keras .models .Sequential ()
100
98
input_shape = (10 , 128 , 4 )
101
- model .add (conv1d (filters = 32 ,
99
+ model .add (Conv1D (filters = 32 ,
102
100
kernel_size = 3 ,
103
101
strides = 1 ,
104
102
padding = padds ,
@@ -108,22 +106,23 @@ def test_conv1d(conv1d, padds):
108
106
use_bias = False ,
109
107
data_format = 'channels_last' ))
110
108
model .add (Activation (activation = 'relu' ))
111
-
112
109
model .compile (optimizer = 'adam' , loss = 'mse' )
110
+
113
111
X_input = np .random .rand (10 ,128 ,4 )
114
112
keras_prediction = model .predict (X_input )
113
+
115
114
config = hls4ml .utils .config_from_keras_model (model )
116
- output_dir = str (test_root_path / 'hls4mlprj_keras_api_conv1d_{}' .format (padds ))
117
- hls_model = hls4ml .converters .convert_from_keras_model (model , hls_config = config , output_dir = output_dir )
115
+ output_dir = str (test_root_path / 'hls4mlprj_keras_api_conv1d_{}_{} ' .format (padds , backend ))
116
+ hls_model = hls4ml .converters .convert_from_keras_model (model , hls_config = config , output_dir = output_dir , backend = backend )
118
117
hls_model .compile ()
119
- hls_prediction = hls_model .predict (X_input )
118
+ hls_prediction = hls_model .predict (X_input ).reshape (keras_prediction .shape )
119
+
120
+ # 5e-2 might be too high
121
+ np .testing .assert_allclose (hls_prediction , keras_prediction , rtol = 0 , atol = 5e-2 )
120
122
121
123
assert len (model .layers ) + 2 == len (hls_model .get_layers ())
122
124
assert list (hls_model .get_layers ())[1 ].attributes ['name' ] == model .layers [0 ]._name
123
-
124
- print (list (hls_model .get_layers ())[1 ].attributes )
125
- if conv1d == 'Conv1D' :
126
- assert list (hls_model .get_layers ())[1 ].attributes ['class_name' ] == 'Conv1D'
125
+ assert list (hls_model .get_layers ())[1 ].attributes ['class_name' ] == 'Conv1D'
127
126
assert list (hls_model .get_layers ())[1 ].attributes ['activation' ] == str (model .layers [0 ].activation ).split ()[1 ]
128
127
assert list (hls_model .get_layers ())[1 ].attributes ["in_width" ] == model .layers [0 ]._batch_input_shape [1 ]
129
128
assert list (hls_model .get_layers ())[1 ].attributes ['filt_width' ] == model .layers [0 ].kernel_size [0 ]
@@ -139,12 +138,9 @@ def test_conv1d(conv1d, padds):
139
138
pad_left = pad_along_width // 2
140
139
pad_right = pad_along_width - pad_left
141
140
142
- out_valid = math .ceil (float (model .layers [0 ]._batch_input_shape [1 ] - model .layers [0 ].kernel_size [0 ] + 1 ) / float (model .layers [0 ].strides [0 ]))
143
-
144
141
if model .layers [0 ].padding == 'same' :
145
142
assert list (hls_model .get_layers ())[1 ].attributes ['pad_left' ] == pad_left
146
143
assert list (hls_model .get_layers ())[1 ].attributes ['pad_right' ] == pad_right
147
-
148
144
elif model .layers [0 ].padding == 'valid' :
149
145
assert list (hls_model .get_layers ())[1 ].attributes ['pad_left' ] == 0
150
146
assert list (hls_model .get_layers ())[1 ].attributes ['pad_right' ] == 0
@@ -229,11 +225,13 @@ def test_conv2d(chans, padds, backend):
229
225
assert list (hls_model .get_layers ())[1 ].attributes ['pad_right' ] == 0
230
226
231
227
pooling_layers = [MaxPooling1D , MaxPooling2D , AveragePooling1D , AveragePooling2D ]
232
- @pytest .mark .parametrize ("pooling" , pooling_layers )
233
- @pytest .mark .parametrize ("padds" , padds_options )
234
- @pytest .mark .parametrize ("chans" , chans_options )
235
- def test_pooling (pooling , padds , chans ):
228
+ @pytest .mark .parametrize ('pooling' , pooling_layers )
229
+ @pytest .mark .parametrize ('padds' , padds_options )
230
+ @pytest .mark .parametrize ('chans' , chans_options )
231
+ @pytest .mark .parametrize ('backend' , ['Vivado' , 'Quartus' ])
232
+ def test_pooling (pooling , padds , chans , backend ):
236
233
assert '1D' in pooling .__name__ or '2D' in pooling .__name__
234
+
237
235
input_shape = (8 ,8 ,3 ) if '2D' in pooling .__name__ else (64 ,3 )
238
236
model = tf .keras .models .Sequential ()
239
237
if '2D' in pooling .__name__ :
@@ -243,20 +241,22 @@ def test_pooling(pooling, padds, chans):
243
241
model .add (Conv1D (filters = 32 , kernel_size = 3 , strides = 1 , padding = padds ,
244
242
input_shape = input_shape , kernel_initializer = 'normal' , use_bias = False ,
245
243
data_format = chans ))
246
-
247
244
pool_size = (2 , 2 ) if '2D' in pooling .__name__ else 2
248
245
model .add (pooling (pool_size = pool_size , strides = None , padding = padds , data_format = None ))
249
246
model .compile (optimizer = 'adam' , loss = 'mse' )
250
247
251
248
X_input = np .random .rand (100 , * input_shape )
252
249
keras_prediction = model .predict (X_input )
253
250
config = hls4ml .utils .config_from_keras_model (model )
254
- output_dir = str (test_root_path / 'hls4mlprj_keras_api_pooling_{}_{}_{}' .format (pooling .__name__ , chans , padds ))
251
+ output_dir = str (test_root_path / 'hls4mlprj_keras_api_pooling_{}_{}_{}_{} ' .format (pooling .__name__ , chans , padds , backend ))
255
252
256
- hls_model = hls4ml .converters .convert_from_keras_model (model , hls_config = config , output_dir = output_dir )
253
+ hls_model = hls4ml .converters .convert_from_keras_model (model , hls_config = config , output_dir = output_dir , backend = backend )
257
254
hls_model .compile ()
258
255
hls_prediction = hls_model .predict (X_input ).reshape (keras_prediction .shape )
259
256
257
+ # 5e-2 might be too high
258
+ np .testing .assert_allclose (hls_prediction , keras_prediction , rtol = 0 , atol = 5e-2 )
259
+
260
260
hls_pool = list (hls_model .get_layers ())[- 1 ]
261
261
ker_pool = model .layers [- 1 ]
262
262
if '2D' in pooling .__name__ :
0 commit comments