3 parser = argparse.ArgumentParser(description=
'Converts a Keras model to json interpreted by the respective SNAB')
     4 parser.add_argument(
'-a', help=
"JSON", required=
True)
     5 parser.add_argument(
'-w', help=
"Weights in HDF5", required=
True)
     6 parser.add_argument(
'-o', help=
"Ouput file name", required=
True)
     7 args = parser.parse_args()
     9 from keras.models 
import Sequential, model_from_json
    13 from keras.constraints 
import Constraint
    14 from keras 
import backend 
as K
    16     '''Clips the weights incident to each hidden unit to be inside a range    22         return K.clip(p, -self.
c, self.
c)
    25         return {
'name': self.__class__.__name__,
    28 json_file = open(args.a).read()
    29 model = model_from_json(json_file)
    30 model.load_weights(args.w)
    31 netw = json.loads(json_file)
    35 if netw[
"keras_version"][0] != 
"2":
    36     print(
"Warning: script was written for Keras 2.3.0")
    39 for ind, layer 
in enumerate(netw[
"config"][
"layers"]):
    41     if(layer[
"class_name"] == 
"Dropout"):
    42         print(
"Ignoring dropout layer")
    44     elif(layer[
"class_name"] == 
"Flatten"):
    45         print(
"Ignoring Flatten layer")
    47     elif(layer[
"class_name"] == 
"AveragePooling2D"):
    48         print(
"Ignoring AveragePooling2D layer")
    50     elif(layer[
"class_name"] == 
"InputLayer"):
    51         print(
"Ignoring InputLayer layer")
    53     elif(layer[
"class_name"] == 
"Dense"):
    54         layer_dict[
"class_name"] = 
"Dense"    55         layer_dict[
"size"] = layer[
"config"][
"units"]
    57             layer_name = layer[
"config"][
"name"]
    58             for layer_2 
in model.layers:
    59                 if layer_2.name == layer_name:
    60                     layer_dict[
"weights"] = layer_2.get_weights()[0].tolist()
    63             layer_dict[
"weights"] = model.layers[ind].get_weights()[0].tolist()
    65     elif(layer[
"class_name"] == 
"Conv2D"):
    66         layer_dict[
"class_name"] = 
"Conv2D"    67         layer_dict[
"size"] = layer[
"config"][
"filters"]
    68         layer_dict[
"stride"] = layer[
"config"][
"strides"][0]
    69         layer_dict[
"padding"] = layer[
"config"][
"padding"]
    70         if "batch_input_shape" in layer[
"config"]:
    71             layer_dict[
"input_shape_x"] = layer[
"config"][
"batch_input_shape"][1]
    72             layer_dict[
"input_shape_y"] = layer[
"config"][
"batch_input_shape"][2]
    73             layer_dict[
"input_shape_z"] = layer[
"config"][
"batch_input_shape"][3]
    75             layer_dict[
"input_shape_x"] = 
None    76             layer_dict[
"input_shape_y"] = 
None    77             layer_dict[
"input_shape_z"] = 
None    79             layer_name = layer[
"config"][
"name"]
    80             for layer_2 
in model.layers:
    81                 if layer_2.name == layer_name:
    82                     layer_dict[
"weights"] = layer_2.get_weights()[0].tolist()
    85             layer_dict[
"weights"] = model.layers[ind].get_weights()[0].tolist()
    86     elif(layer[
"class_name"] == 
"MaxPooling2D"):
    87         layer_dict[
"class_name"] = 
"MaxPooling2D"    88         layer_dict[
"size"] = layer[
"config"][
"pool_size"]
    89         layer_dict[
"stride"] = layer[
"config"][
"strides"][0]
    91         raise RuntimeError(
"Unknown layer type " + layer[
"class_name"] + 
"!")
    92     data[
"netw"].append(layer_dict)
    95 if(args.o.endswith(
".json")):
    96     with open(args.o, 
'w') 
as file:
    99 elif(args.o.endswith(
".msgpack")):
   101     with open(args.o, 
'wb') 
as file:
   102         msgpack.dump(data, file, use_single_float=
True)
   104     raise RuntimeError(
"Wrong file name! File must end with either .json or .msgpack!")