From 05d3f39527902bf0f81edfa30fa12681ab167746 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Thu, 10 Nov 2016 18:02:59 +0800 Subject: [PATCH 1/2] Attempt to fix the serializer python script I was able to fix the fully connected layer. Conv net doesn't seem to work. --- utils/serialize_keras.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/utils/serialize_keras.py b/utils/serialize_keras.py index 16436dc..19ad99a 100644 --- a/utils/serialize_keras.py +++ b/utils/serialize_keras.py @@ -98,6 +98,7 @@ def get_layer_params(layer, weights_file, layer_num, param_num_offset): layer_params.append(layer[param]) return layer_params + def serialize(model_json_file, weights_hdf5_file, save_filepath, compress): with open(model_json_file, 'r') as f: model_metadata = json.load(f) @@ -106,21 +107,35 @@ def serialize(model_json_file, weights_hdf5_file, save_filepath, compress): layers = [] num_activation_layers = 0 - for k, layer in enumerate(model_metadata['layers']): - if layer['name'] == 'Activation': + for k, layer in enumerate(model_metadata['config']): + if layer['class_name'] == 'Activation': num_activation_layers += 1 - prev_layer_name = model_metadata['layers'][k-1]['name'] + prev_layer_name = model_metadata['config'][k-1]['class_name'] idx_activation = layer_params_dict[prev_layer_name].index('activation') - layers[k-num_activation_layers]['parameters'][idx_activation] = layer['activation'] + layers[k-num_activation_layers]['parameters'][idx_activation] = layer['config']['activation'] continue - layer_params = get_layer_params(layer, weights_file, k, 0) + layer_params = [] + + for param in layer_params_dict[layer['class_name']]: + if param == 'weights': + layer_weights = list(weights_file.keys()) + weights = {} + weight_names = layer_weights_dict[layer['class_name']] + for name in weight_names: + weights[name] = weights_file.get('{}/{}_{}'.format(layer['config']['name'], layer['config']['name'], name)).value.tolist() + # for name, w in zip(weight_names, layer_weights): + # weights[name] = weights_file.get('layer_{}/{}'.format(k, w)).value.tolist() + layer_params.append(weights) + else: + layer_params.append(layer['config'][param]) layers.append({ - 'layerName': layer_name_dict[layer['name']], + 'layerName': layer_name_dict[layer['class_name']], 'parameters': layer_params }) + if compress: with gzip.open(save_filepath, 'wb') as f: f.write(json.dumps(layers).encode('utf8')) From 15b3f270f114bf475ac1279a8b8b03ba577a9df0 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Thu, 10 Nov 2016 18:02:59 +0800 Subject: [PATCH 2/2] Attempt to fix the serializer python script I was able to fix the fully connected layer. Conv net doesn't seem to work. I did not try other types of layers. --- utils/serialize_keras.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/utils/serialize_keras.py b/utils/serialize_keras.py index 16436dc..19ad99a 100644 --- a/utils/serialize_keras.py +++ b/utils/serialize_keras.py @@ -98,6 +98,7 @@ def get_layer_params(layer, weights_file, layer_num, param_num_offset): layer_params.append(layer[param]) return layer_params + def serialize(model_json_file, weights_hdf5_file, save_filepath, compress): with open(model_json_file, 'r') as f: model_metadata = json.load(f) @@ -106,21 +107,35 @@ def serialize(model_json_file, weights_hdf5_file, save_filepath, compress): layers = [] num_activation_layers = 0 - for k, layer in enumerate(model_metadata['layers']): - if layer['name'] == 'Activation': + for k, layer in enumerate(model_metadata['config']): + if layer['class_name'] == 'Activation': num_activation_layers += 1 - prev_layer_name = model_metadata['layers'][k-1]['name'] + prev_layer_name = model_metadata['config'][k-1]['class_name'] idx_activation = layer_params_dict[prev_layer_name].index('activation') - layers[k-num_activation_layers]['parameters'][idx_activation] = layer['activation'] + layers[k-num_activation_layers]['parameters'][idx_activation] = layer['config']['activation'] continue - layer_params = get_layer_params(layer, weights_file, k, 0) + layer_params = [] + + for param in layer_params_dict[layer['class_name']]: + if param == 'weights': + layer_weights = list(weights_file.keys()) + weights = {} + weight_names = layer_weights_dict[layer['class_name']] + for name in weight_names: + weights[name] = weights_file.get('{}/{}_{}'.format(layer['config']['name'], layer['config']['name'], name)).value.tolist() + # for name, w in zip(weight_names, layer_weights): + # weights[name] = weights_file.get('layer_{}/{}'.format(k, w)).value.tolist() + layer_params.append(weights) + else: + layer_params.append(layer['config'][param]) layers.append({ - 'layerName': layer_name_dict[layer['name']], + 'layerName': layer_name_dict[layer['class_name']], 'parameters': layer_params }) + if compress: with gzip.open(save_filepath, 'wb') as f: f.write(json.dumps(layers).encode('utf8'))