tensorflow将训练好的模型freeze,即将权重固化到图里面,并使用该模型进行预测
来源:互联网 发布:township数据同步 编辑:程序博客网 时间:2024/04/29 18:22
ML主要分为训练和预测两个阶段,此教程就是将训练好的模型freeze并保存下来.freeze的含义就是将该模型的图结构和该模型的权重固化到一起了.也即加载freeze的模型之后,立刻能够使用了。
下面使用一个简单的demo来详细解释该过程,
一、首先运行脚本tiny_model.py
#-*- coding:utf-8 -*-import tensorflow as tfimport numpy as npwith tf.variable_scope('Placeholder'): inputs_placeholder = tf.placeholder(tf.float32, name='inputs_placeholder', shape=[None, 10]) labels_placeholder = tf.placeholder(tf.float32, name='labels_placeholder', shape=[None, 1])with tf.variable_scope('NN'): W1 = tf.get_variable('W1', shape=[10, 1], initializer=tf.random_normal_initializer(stddev=1e-1)) b1 = tf.get_variable('b1', shape=[1], initializer=tf.constant_initializer(0.1)) W2 = tf.get_variable('W2', shape=[10, 1], initializer=tf.random_normal_initializer(stddev=1e-1)) b2 = tf.get_variable('b2', shape=[1], initializer=tf.constant_initializer(0.1)) a = tf.nn.relu(tf.matmul(inputs_placeholder, W1) + b1) a2 = tf.nn.relu(tf.matmul(inputs_placeholder, W2) + b2) y = tf.div(tf.add(a, a2), 2)with tf.variable_scope('Loss'): loss = tf.reduce_sum(tf.square(y - labels_placeholder) / 2)with tf.variable_scope('Accuracy'): predictions = tf.greater(y, 0.5, name="predictions") correct_predictions = tf.equal(predictions, tf.cast(labels_placeholder, tf.bool), name="correct_predictions") accuracy = tf.reduce_mean(tf.cast(correct_predictions, tf.float32))adam = tf.train.AdamOptimizer(learning_rate=1e-3)train_op = adam.minimize(loss)# generate_datainputs = np.random.choice(10, size=[10000, 10])labels = (np.sum(inputs, axis=1) > 45).reshape(-1, 1).astype(np.float32)print('inputs.shape:', inputs.shape)print('labels.shape:', labels.shape)test_inputs = np.random.choice(10, size=[100, 10])test_labels = (np.sum(test_inputs, axis=1) > 45).reshape(-1, 1).astype(np.float32)print('test_inputs.shape:', test_inputs.shape)print('test_labels.shape:', test_labels.shape)batch_size = 32epochs = 10batches = []print("%d items in batch of %d gives us %d full batches and %d batches of %d items" % ( len(inputs), batch_size, len(inputs) // batch_size, batch_size - len(inputs) // batch_size, len(inputs) - (len(inputs) // batch_size) * 32))for i in range(len(inputs) // batch_size): batch = [ inputs[batch_size*i:batch_size*i+batch_size], labels[batch_size*i:batch_size*i+batch_size] ] batches.append(list(batch))if (i + 1) * batch_size < len(inputs): batch = [ inputs[batch_size*(i + 1):],labels[batch_size*(i + 1):] ] batches.append(list(batch))print("Number of batches: %d" % len(batches))print("Size of full batch: %d" % len(batches[0]))print("Size if final batch: %d" % len(batches[-1]))global_count = 0with tf.Session() as sess:#sv = tf.train.Supervisor()#with sv.managed_session() as sess: sess.run(tf.initialize_all_variables()) for i in range(epochs): for batch in batches: # print(batch[0].shape, batch[1].shape) train_loss , _= sess.run([loss, train_op], feed_dict={ inputs_placeholder: batch[0], labels_placeholder: batch[1] }) # print('train_loss: %d' % train_loss) if global_count % 100 == 0: acc = sess.run(accuracy, feed_dict={ inputs_placeholder: test_inputs, labels_placeholder: test_labels }) print('accuracy: %f' % acc) global_count += 1 acc = sess.run(accuracy, feed_dict={ inputs_placeholder: test_inputs, labels_placeholder: test_labels }) print("final accuracy: %f" % acc) #在session当中就要将模型进行保存 saver = tf.train.Saver() last_chkp = saver.save(sess, 'results/graph.chkp') #sv.saver.save(sess, 'results/graph.chkp')for op in tf.get_default_graph().get_operations(): print(op.name)说明:saver.save必须在session里面,因为在session里面,整个图才是激活的,才能够将参数存进来,使用save之后能够得到如下的文件:
说明:
.data:存放的是权重参数
.meta:存放的是图和metadata,metadata是其他配置的数据
如果想将我们的模型固化,让别人能够使用,我们仅仅需要的是图和参数,metadata是不需要的
二、综合上述几个文件,生成可以使用的模型的步骤如下:
1、恢复我们保存的图
2、开启一个Session,然后载入该图要求的权重
3、删除对预测无关的metadata
4、将处理好的模型序列化之后保存
运行freeze.py#-*- coding:utf-8 -*-import os, argparseimport tensorflow as tffrom tensorflow.python.framework import graph_utildir = os.path.dirname(os.path.realpath(__file__))def freeze_graph(model_folder): # We retrieve our checkpoint fullpath checkpoint = tf.train.get_checkpoint_state(model_folder) input_checkpoint = checkpoint.model_checkpoint_path # We precise the file fullname of our freezed graph absolute_model_folder = "/".join(input_checkpoint.split('/')[:-1]) output_graph = absolute_model_folder + "/frozen_model.pb" # Before exporting our graph, we need to precise what is our output node # this variables is plural, because you can have multiple output nodes #freeze之前必须明确哪个是输出结点,也就是我们要得到推论结果的结点 #输出结点可以看我们模型的定义 #只有定义了输出结点,freeze才会把得到输出结点所必要的结点都保存下来,或者哪些结点可以丢弃 #所以,output_node_names必须根据不同的网络进行修改 output_node_names = "Accuracy/predictions" # We clear the devices, to allow TensorFlow to control on the loading where it wants operations to be calculated clear_devices = True # We import the meta graph and retrive a Saver saver = tf.train.import_meta_graph(input_checkpoint + '.meta', clear_devices=clear_devices) # We retrieve the protobuf graph definition graph = tf.get_default_graph() input_graph_def = graph.as_graph_def() #We start a session and restore the graph weights #这边已经将训练好的参数加载进来,也即最后保存的模型是有图,并且图里面已经有参数了,所以才叫做是frozen #相当于将参数已经固化在了图当中 with tf.Session() as sess: saver.restore(sess, input_checkpoint) # We use a built-in TF helper to export variables to constant output_graph_def = graph_util.convert_variables_to_constants( sess, input_graph_def, output_node_names.split(",") # We split on comma for convenience ) # Finally we serialize and dump the output graph to the filesystem with tf.gfile.GFile(output_graph, "wb") as f: f.write(output_graph_def.SerializeToString()) print("%d ops in the final graph." % len(output_graph_def.node))if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument("--model_folder", type=str, help="Model folder to export") args = parser.parse_args() freeze_graph(args.model_folder)
说明:对于freeze操作,我们需要定义输出结点的名字.因为网络其实是比较复杂的,定义了输出结点的名字,那么freeze的时候就只把输出该结点所需要的子图都固化下来,其他无关的就舍弃掉.因为我们freeze模型的目的是接下来做预测.所以,一般情况下,output_node_names就是我们预测的目标.
三、加载freeze后的模型,注意该模型已经是包含图和相应的参数了.所以,我们不需要再加载参数进来.也即该模型加载进来已经是可以使用了.
#-*- coding:utf-8 -*-import argparse import tensorflow as tfdef load_graph(frozen_graph_filename): # We parse the graph_def file with tf.gfile.GFile(frozen_graph_filename, "rb") as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) # We load the graph_def in the default graph with tf.Graph().as_default() as graph: tf.import_graph_def( graph_def, input_map=None, return_elements=None, name="prefix", op_dict=None, producer_op_list=None ) return graphif __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument("--frozen_model_filename", default="results/frozen_model.pb", type=str, help="Frozen model file to import") args = parser.parse_args() #加载已经将参数固化后的图 graph = load_graph(args.frozen_model_filename) # We can list operations #op.values() gives you a list of tensors it produces #op.name gives you the name #输入,输出结点也是operation,所以,我们可以得到operation的名字 for op in graph.get_operations(): print(op.name,op.values()) # prefix/Placeholder/inputs_placeholder # ... # prefix/Accuracy/predictions #操作有:prefix/Placeholder/inputs_placeholder #操作有:prefix/Accuracy/predictions #为了预测,我们需要找到我们需要feed的tensor,那么就需要该tensor的名字 #注意prefix/Placeholder/inputs_placeholder仅仅是操作的名字,prefix/Placeholder/inputs_placeholder:0才是tensor的名字 x = graph.get_tensor_by_name('prefix/Placeholder/inputs_placeholder:0') y = graph.get_tensor_by_name('prefix/Accuracy/predictions:0') with tf.Session(graph=graph) as sess: y_out = sess.run(y, feed_dict={ x: [[3, 5, 7, 4, 5, 1, 1, 1, 1, 1]] # < 45 }) print(y_out) # [[ 0.]] Yay! print ("finish")说明:
1、在预测的过程中,当把freeze后的模型加载进来后,我们只需要定义好输入的tensor和目标tensor即可
2、在这里要注意一下tensor_name和ops_name,
注意prefix/Placeholder/inputs_placeholder仅仅是操作的名字,prefix/Placeholder/inputs_placeholder:0才是tensor的名字
x = graph.get_tensor_by_name('prefix/Placeholder/inputs_placeholder:0')一定要使用tensor的名字
3、要获取图中ops的名字和对应的tensor的名字,可用如下的代码:
# We can list operations #op.values() gives you a list of tensors it produces #op.name gives you the name #输入,输出结点也是operation,所以,我们可以得到operation的名字 for op in graph.get_operations(): print(op.name,op.values())
=============================================================================================================================
上面是使用了Saver()来保存模型,也可以使用sv = tf.train.Supervisor()来保存模型
#-*- coding:utf-8 -*-import tensorflow as tfimport numpy as npwith tf.variable_scope('Placeholder'): inputs_placeholder = tf.placeholder(tf.float32, name='inputs_placeholder', shape=[None, 10]) labels_placeholder = tf.placeholder(tf.float32, name='labels_placeholder', shape=[None, 1])with tf.variable_scope('NN'): W1 = tf.get_variable('W1', shape=[10, 1], initializer=tf.random_normal_initializer(stddev=1e-1)) b1 = tf.get_variable('b1', shape=[1], initializer=tf.constant_initializer(0.1)) W2 = tf.get_variable('W2', shape=[10, 1], initializer=tf.random_normal_initializer(stddev=1e-1)) b2 = tf.get_variable('b2', shape=[1], initializer=tf.constant_initializer(0.1)) a = tf.nn.relu(tf.matmul(inputs_placeholder, W1) + b1) a2 = tf.nn.relu(tf.matmul(inputs_placeholder, W2) + b2) y = tf.div(tf.add(a, a2), 2)with tf.variable_scope('Loss'): loss = tf.reduce_sum(tf.square(y - labels_placeholder) / 2)with tf.variable_scope('Accuracy'): predictions = tf.greater(y, 0.5, name="predictions") correct_predictions = tf.equal(predictions, tf.cast(labels_placeholder, tf.bool), name="correct_predictions") accuracy = tf.reduce_mean(tf.cast(correct_predictions, tf.float32))adam = tf.train.AdamOptimizer(learning_rate=1e-3)train_op = adam.minimize(loss)# generate_datainputs = np.random.choice(10, size=[10000, 10])labels = (np.sum(inputs, axis=1) > 45).reshape(-1, 1).astype(np.float32)print('inputs.shape:', inputs.shape)print('labels.shape:', labels.shape)test_inputs = np.random.choice(10, size=[100, 10])test_labels = (np.sum(test_inputs, axis=1) > 45).reshape(-1, 1).astype(np.float32)print('test_inputs.shape:', test_inputs.shape)print('test_labels.shape:', test_labels.shape)batch_size = 32epochs = 10batches = []print("%d items in batch of %d gives us %d full batches and %d batches of %d items" % ( len(inputs), batch_size, len(inputs) // batch_size, batch_size - len(inputs) // batch_size, len(inputs) - (len(inputs) // batch_size) * 32))for i in range(len(inputs) // batch_size): batch = [ inputs[batch_size*i:batch_size*i+batch_size], labels[batch_size*i:batch_size*i+batch_size] ] batches.append(list(batch))if (i + 1) * batch_size < len(inputs): batch = [ inputs[batch_size*(i + 1):],labels[batch_size*(i + 1):] ] batches.append(list(batch))print("Number of batches: %d" % len(batches))print("Size of full batch: %d" % len(batches[0]))print("Size if final batch: %d" % len(batches[-1]))global_count = 0#with tf.Session() as sess:sv = tf.train.Supervisor()with sv.managed_session() as sess: #sess.run(tf.initialize_all_variables()) for i in range(epochs): for batch in batches: # print(batch[0].shape, batch[1].shape) train_loss , _= sess.run([loss, train_op], feed_dict={ inputs_placeholder: batch[0], labels_placeholder: batch[1] }) # print('train_loss: %d' % train_loss) if global_count % 100 == 0: acc = sess.run(accuracy, feed_dict={ inputs_placeholder: test_inputs, labels_placeholder: test_labels }) print('accuracy: %f' % acc) global_count += 1 acc = sess.run(accuracy, feed_dict={ inputs_placeholder: test_inputs, labels_placeholder: test_labels }) print("final accuracy: %f" % acc) #在session当中就要将模型进行保存 #saver = tf.train.Saver() #last_chkp = saver.save(sess, 'results/graph.chkp') sv.saver.save(sess, 'results/graph.chkp')for op in tf.get_default_graph().get_operations(): print(op.name)
注意:使用了sv = tf.train.Supervisor(),就不需要再初始化了,将sess.run(tf.initialize_all_variables())注释掉,否则会报错.
0 0
- tensorflow将训练好的模型freeze,即将权重固化到图里面,并使用该模型进行预测
- tensorflow将训练好的模型freeze,即将权重固化到图里面,并使用该模型进行预测
- tensorflow将训练好的模型freeze,即将权重固化到图里面,并使用该模型进行预测
- tensorflow将训练好的模型freeze,即将权重固化到图里面,并使用该模型进行预测
- tensorflow将训练好的模型freeze,即将权重固化到图里面,并使用该模型进行预测(tf.graph_util.convert_variables_to_constants函数)
- 将tf训练的权重保存为CKPT,PB ,CKPT 转换成 PB格式。并将权重固化到图里面,并使用该模型进行预测
- 将tensorflow训练好的模型部署成sercice服务,并做预测
- Tensorflow保存模型,恢复模型,使用训练好的模型进行预测和提取中间输出(特征)
- Tensorflow保存模型,恢复模型,使用训练好的模型进行预测和提取中间输出(特征)【转】
- 将tensorflow训练好的模型移植到android
- 将tensorflow训练好的模型移植到android
- 将tensorflow训练好的模型移植到android
- 将tensorflow训练好的模型移植到android
- 将tensorflow训练好的模型移植到android
- tensorflow将训练好的模型
- tensorflow从已经训练好的模型中,恢复(指定)权重(构建新变量、网络)并继续训练(finetuning)
- 将caffe训练好的模型转换为tensorflow模型
- tensorflow,使用freeze_graph.py将模型文件和权重数据整合在一起并去除无关的Op
- android bluetooth stack-init
- 封装
- 微信接入探秘(一)——从零认识微信接口
- windows:创建系统服务
- 网络利器NMAP系列(三)| NMAP使用介绍
- tensorflow将训练好的模型freeze,即将权重固化到图里面,并使用该模型进行预测
- java基本知识归集
- python进行KMeans聚类算法raise ImportError('[joblib] Attempting to do parallel computing ' ImportError: [jo
- 重拾python 十九
- 本地计算机 上的 MySQL 服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。
- html 资料学习
- JAVA中数组排序函数
- Leetcode350. Intersection of Two Arrays II
- android shape的使用