From 6ed141419e23d6936560b5758baf9b06ba025132 Mon Sep 17 00:00:00 2001 From: GeiduanLiu <61015788+GeiduanLiu@users.noreply.github.com> Date: Mon, 30 Mar 2020 22:56:28 +0800 Subject: [PATCH 1/5] Update main.py --- source/train/main.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/train/main.py b/source/train/main.py index 49aea59084..f76c714086 100644 --- a/source/train/main.py +++ b/source/train/main.py @@ -4,6 +4,7 @@ from .freeze import freeze from .config import config from .test import test +from .transform import transform def main () : parser = argparse.ArgumentParser( @@ -15,6 +16,13 @@ def main () : # help="the output json file") default_num_inter_threads = 0 + parser_transform = subparsers.add_parser('transform', help='pass parameters to another model') + parser_transform.add_argument('-r', "--raw-model", default = "raw_frozen_model.pb", type=str, + help = "the model receiving parameters") + parser_transform.add_argument("-o","--old-model", default = "old_frozen_model.pb", type=str, + help='the model providing parameters') + parser_transform.add_argument("-n", "--output", default = "frozen_model.pb", type=str, + help = "the model after passing parameters") parser_train = subparsers.add_parser('train', help='train a model') parser_train.add_argument('INPUT', help='the input parameter file in json format') @@ -62,5 +70,7 @@ def main () : config(args) elif args.command == 'test' : test(args) + elif args.command == 'transform' : + transform(args) else : raise RuntimeError('unknown command ' + args.command) From edb1ce9e532545bca0abf18f522617189b49ff08 Mon Sep 17 00:00:00 2001 From: GeiduanLiu <61015788+GeiduanLiu@users.noreply.github.com> Date: Mon, 30 Mar 2020 22:57:12 +0800 Subject: [PATCH 2/5] Create transform.py --- source/train/transform.py | 59 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 source/train/transform.py diff --git a/source/train/transform.py b/source/train/transform.py new file mode 100644 index 0000000000..4656393ed9 --- /dev/null +++ b/source/train/transform.py @@ -0,0 +1,59 @@ +from deepmd.env import tf +def transform(args): + new_graph = load_graph(args.raw_model) + old_graph = load_graph(args.old_model) + print("%d ops in the raw graph\n%d ops in the old graph" %(len(new_graph.node),len(old_graph.node))) + transform_node = load_data(new_graph,old_graph) + for node in new_graph.node: + if node.name in transform_node: + print("%s is passed from old graph to raw graph" % node.name) + node.attr["value"].tensor.CopyFrom(transform_node[node.name].attr["value"].tensor) + with tf.gfile.GFile(args.output, mode='wb') as f: + f.write(new_graph.SerializeToString()) + print("the output model is saved in %s" % args.output) + +def load_graph(graphName): + graph_def = tf.GraphDef() + with open(graphName,"rb") as f: + graph_def.ParseFromString(f.read()) + with tf.Graph().as_default() as graph: + tf.import_graph_def(graph_def,name = "") + return graph_def + +def load_data(new_graph,old_graph): + new_graph_node = load_transform_node(new_graph) + old_graph_node = load_transform_node(old_graph) + if len(new_graph_node) != len(old_graph_node): + raise RuntimeError("New graph and original graph has different network structure\n") + for nodeName in old_graph_node.keys(): + check_dim(new_graph_node, old_graph_node, nodeName) + check_precision(new_graph_node, old_graph_node, nodeName) + return old_graph_node + + +def check_precision(new_graph_node, old_graph_node, nodeName): + new_graph_precision = new_graph_node[nodeName].attr["value"].tensor.dtype + old_graph_precision = old_graph_node[nodeName].attr["value"].tensor.dtype + if new_graph_precision != old_graph_precision: + raise RuntimeError("New graph and original graph has different"+nodeName+" precision\n") + +def check_dim(new_graph_node, old_graph_node, nodeName): + new_graph_dim = new_graph_node[nodeName].attr["value"].tensor.tensor_shape + old_graph_dim = old_graph_node[nodeName].attr["value"].tensor.tensor_shape + if new_graph_dim != old_graph_dim: + raise RuntimeError("New graph and original graph has different"+nodeName+" dim\n") + + +def load_transform_node(graph): + transform_node = {} + filter_w = ["filter_type_0/matrix_{}_0".format(i) for i in range(1,10)] + filter_b = ["filter_type_0/bias_{}_0".format(i) for i in range(1,10)] + fitting_w = ["layer_{}_type_0/matrix".format(i) for i in range(0,10)] + fitting_b = ["layer_{}_type_0/bias".format(i) for i in range(0,10)] + fitting_idt = ["layer_{}_type_0/idt".format(i) for i in range(0,10)] + final_layer = ["final_layer_type_0/bias","final_layer_type_0/matrix"] + transform_node_list = filter_w + filter_b + fitting_w + fitting_b + fitting_idt + final_layer + for node in graph.node: + if node.name in transform_node_list: + transform_node[node.name] = node + return transform_node From 959dbfdbd92350c2fdc72345aa4c924137462bc1 Mon Sep 17 00:00:00 2001 From: GeiduanLiu <61015788+GeiduanLiu@users.noreply.github.com> Date: Mon, 30 Mar 2020 22:59:55 +0800 Subject: [PATCH 3/5] Update Fitting.py fix bug --- source/train/Fitting.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/train/Fitting.py b/source/train/Fitting.py index 960ff64e12..49ca40b2c7 100644 --- a/source/train/Fitting.py +++ b/source/train/Fitting.py @@ -212,7 +212,7 @@ def build (self, if ii >= 1 and self.n_neuron[ii] == self.n_neuron[ii-1] : layer+= one_layer(layer, self.n_neuron[ii], name='layer_'+str(ii)+'_type_'+str(type_i)+suffix, reuse=reuse, seed = self.seed, use_timestep = self.resnet_dt, activation_fn = self.fitting_activation_fn, precision = self.fitting_precision, trainable = self.trainable[ii]) else : - layer = one_layer(layer, self.n_neuron[ii], name='layer_'+str(ii)+'_type_'+str(type_i)+suffix, reuse=reuse, seed = self.seed, precision = self.fitting_precision, trainable = self.trainable[ii]) + layer = one_layer(layer, self.n_neuron[ii], name='layer_'+str(ii)+'_type_'+str(type_i)+suffix, reuse=reuse, seed = self.seed, activation_fn = self.fitting_activation_fn, precision = self.fitting_precision, trainable = self.trainable[ii]) final_layer = one_layer(layer, 1, activation_fn = None, bavg = type_bias_ae, name='final_layer_type_'+str(type_i)+suffix, reuse=reuse, seed = self.seed, precision = self.fitting_precision, trainable = self.trainable[-1]) if type_i < len(self.atom_ener) and self.atom_ener[type_i] is not None: From df5f3a69e4025bec934824c4473655da3185bcb6 Mon Sep 17 00:00:00 2001 From: GeiduanLiu <61015788+GeiduanLiu@users.noreply.github.com> Date: Mon, 30 Mar 2020 23:03:11 +0800 Subject: [PATCH 4/5] Update main.py --- source/train/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/train/main.py b/source/train/main.py index f76c714086..1e35d3bf17 100644 --- a/source/train/main.py +++ b/source/train/main.py @@ -71,6 +71,6 @@ def main () : elif args.command == 'test' : test(args) elif args.command == 'transform' : - transform(args) + transform(args) else : raise RuntimeError('unknown command ' + args.command) From 8385272e3abb815732fef7610a614857aa916b21 Mon Sep 17 00:00:00 2001 From: GeiduanLiu <61015788+GeiduanLiu@users.noreply.github.com> Date: Tue, 31 Mar 2020 13:18:58 +0800 Subject: [PATCH 5/5] Update transform.py --- source/train/transform.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/source/train/transform.py b/source/train/transform.py index 4656393ed9..66ff871aad 100644 --- a/source/train/transform.py +++ b/source/train/transform.py @@ -1,4 +1,5 @@ from deepmd.env import tf +import re def transform(args): new_graph = load_graph(args.raw_model) old_graph = load_graph(args.old_model) @@ -46,14 +47,17 @@ def check_dim(new_graph_node, old_graph_node, nodeName): def load_transform_node(graph): transform_node = {} - filter_w = ["filter_type_0/matrix_{}_0".format(i) for i in range(1,10)] - filter_b = ["filter_type_0/bias_{}_0".format(i) for i in range(1,10)] - fitting_w = ["layer_{}_type_0/matrix".format(i) for i in range(0,10)] - fitting_b = ["layer_{}_type_0/bias".format(i) for i in range(0,10)] - fitting_idt = ["layer_{}_type_0/idt".format(i) for i in range(0,10)] - final_layer = ["final_layer_type_0/bias","final_layer_type_0/matrix"] - transform_node_list = filter_w + filter_b + fitting_w + fitting_b + fitting_idt + final_layer + transform_node_pattern = "\ +filter_type_\d+/matrix_\d+_\d+|\ +filter_type_\d+/bias_\d+_\d+|\ +filter_type_\d+/idt_\d+_\d+\ +layer_\d+_type_\d+/matrix|\ +layer_\d+_type_\d+/bias|\ +layer_\d+_type_\d+/idt|\ +final_layer_type_\d+/bias|\ +final_layer_type_\d+/matrix\ +" for node in graph.node: - if node.name in transform_node_list: + if re.fullmatch(transform_node_pattern,node.name) != None: transform_node[node.name] = node return transform_node