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!")