多gup训练模型、模型保存cpu预测

原创 2018年04月16日 14:32:32

周末折腾了一些,模型在多gpu上训练,在训练过程做checkpoint,然后restore保存为pb格式模型文件,后面把模型放cpu上预测,结果报错,报错原因大概上有些op在gpu上操作,但是预测在cpu上面,上午折腾了下原来保存模型时候要指定cpu和gpu,但是google的模型是把一些namescope名称给弄下来,写了个方法来保存,在cpu上和gpu上预测具有普适性,先看我实现的方法把。

首先是单卡多gpu上训练:

from  model import TextCNNMulFilterSize
from  configuration import TCNNConfig
from  data_utils import inputs,getvocablen
import time
import numpy as np
from  datetime  import  datetime
import tensorflow as tf
import os
from  datetime  import timedelta
#basepath="/Users/shuubiasahi/Documents/python"
basepath="/home/zhoumeixu"
data_path=basepath+"/credit-tftextclassify-poi/tensorflow/tf.records"
vocapath=basepath+"/credit-tftextclassify-poi/tensorflow/vocab.txt"
modelpath=basepath+"/credit-tftextclassify-poi/tensorflow/"

os.environ["TF_CPP_MIN_LOG_LEVEL"]='2'
print(modelpath,"poi识别model开始训练")

FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_string('train_dir', '/tmp/model/poi/',
                           """Directory where to write event logs """
                           """and checkpoint.""")
tf.app.flags.DEFINE_integer('max_steps', 30000,
                            """Number of batches to run.""")
tf.app.flags.DEFINE_integer('batch_size', 30,
                            """Number of batches to run.""")
tf.app.flags.DEFINE_integer('num_gpus', 1, """How many GPUs to use.""")
tf.app.flags.DEFINE_boolean('log_device_placement', False,
                            """Whether to log device placement.""")

vocablen=getvocablen(vocapath)
config = TCNNConfig()
config.vocab_size = vocablen

def tower_loss(scope):
    x_train, y_train = inputs(data_path,batch_size=FLAGS.batch_size,num_epochs=3)
    keep_prob = tf.constant(0.9, dtype=tf.float32)
    model = TextCNNMulFilterSize(config, x_train, y_train, keep_prob)
    _=model.loss
    losses = tf.get_collection('losses', scope)
    total_loss = tf.add_n(losses, name='total_loss')
    return total_loss
def average_gradients(tower_grads):
  average_grads = []
  for grad_and_vars in zip(*tower_grads):
    grads = []
    for g, _ in grad_and_vars:
      expanded_g = tf.expand_dims(g, 0)
      grads.append(expanded_g)
    grad = tf.concat(axis=0, values=grads)
    grad = tf.reduce_mean(grad, 0)
    v = grad_and_vars[0][1]
    grad_and_var = (grad, v)
    average_grads.append(grad_and_var)
  return average_grads

def train():
  with tf.Graph().as_default(), tf.device('/cpu:0'):
    global_step = tf.get_variable(
        'global_step', [],
        initializer=tf.constant_initializer(0), trainable=False)
    lr = tf.train.exponential_decay(0.1,
                                    global_step,
                                    100,
                                    0.9999,
                                    staircase=True)

    # Create an optimizer that performs gradient descent.
    opt = tf.train.GradientDescentOptimizer(lr)

    # Calculate the gradients for each model tower.
    tower_grads = []
    with tf.variable_scope(tf.get_variable_scope()):
      for i in range(FLAGS.num_gpus):
        with tf.device('/gpu:%d' % i):
          with tf.name_scope('%s_%d' % ("tower", i)) as scope:
            loss = tower_loss(scope)
            tf.get_variable_scope().reuse_variables()
            grads = opt.compute_gradients(loss)
            tower_grads.append(grads)
    grads = average_gradients(tower_grads)
    apply_gradient_op = opt.apply_gradients(grads, global_step=global_step)
    variable_averages = tf.train.ExponentialMovingAverage(
        0.9999, global_step)
    variables_averages_op = variable_averages.apply(tf.trainable_variables())
    train_op = tf.group(apply_gradient_op, variables_averages_op)
    saver = tf.train.Saver(tf.global_variables())
    init = tf.global_variables_initializer()
    sess = tf.Session(config=tf.ConfigProto(
        allow_soft_placement=True,
        log_device_placement=FLAGS.log_device_placement))
    sess.run(init)
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord, sess=sess)
    for step in range(FLAGS.max_steps):
      start_time = time.time()
      _, loss_value = sess.run([train_op, loss])
      duration = time.time() - start_time

      assert not np.isnan(loss_value), 'Model diverged with loss = NaN'

      if step % 10 == 0:
        num_examples_per_step = FLAGS.batch_size * FLAGS.num_gpus
        examples_per_sec = num_examples_per_step / duration
        sec_per_batch = duration / FLAGS.num_gpus

        format_str = ('%s: step %d, loss = %.2f (%.1f examples/sec; %.3f '
                      'sec/batch)')
        print (format_str % (datetime.now(), step, loss_value,
                             examples_per_sec, sec_per_batch))

      if step % 100 == 0 or (step + 1) == FLAGS.max_steps:
        checkpoint_path = os.path.join(FLAGS.train_dir, 'model.ckpt')
        saver.save(sess, checkpoint_path, global_step=step)
    coord.request_stop()
    coord.join(threads)
    sess.close()
def main(argv=None):
  if tf.gfile.Exists(FLAGS.train_dir):
    tf.gfile.DeleteRecursively(FLAGS.train_dir)
  tf.gfile.MakeDirs(FLAGS.train_dir)
  train()

if __name__ == '__main__':
     tf.app.run()


模型保存为pb格式,在cpu上预测:

from  model import TextCNNMulFilterSize
from  configuration import TCNNConfig
from  data_utils import inputs,getvocablen
import time
import numpy as np
from  datetime  import  datetime
import tensorflow as tf
import os
from  datetime  import timedelta
#basepath="/Users/shuubiasahi/Documents/python"
basepath="/home/zhoumeixu"
data_path=basepath+"/credit-tftextclassify-poi/tensorflow/tf.records"
vocapath=basepath+"/credit-tftextclassify-poi/tensorflow/vocab.txt"
modelpath=basepath+"/credit-tftextclassify-poi/tensorflow/"
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2'
FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_string('train_dir', '/tmp/model/poi/',
                           """Directory where to write event logs """
                           """and checkpoint.""")
tf.app.flags.DEFINE_integer('max_steps', 30000,
                            """Number of batches to run.""")
tf.app.flags.DEFINE_integer('batch_size', 30,
                            """Number of batches to run.""")
tf.app.flags.DEFINE_integer('num_gpus', 1, """How many GPUs to use.""")
tf.app.flags.DEFINE_boolean('log_device_placement', False,
                            """Whether to log device placement.""")

tf.app.flags.DEFINE_string('pathpb', "model/graph.model",
                            """最后导入pb模型的路径""")
vocablen=getvocablen(vocapath)
config = TCNNConfig()
config.vocab_size = vocablen
def export():
    with tf.Graph().as_default(), tf.device('/cpu:0'):
        global_step = tf.get_variable(
            'global_step', [],
            initializer=tf.constant_initializer(0), trainable=False)
        with tf.variable_scope(tf.get_variable_scope()):
            for i in range(FLAGS.num_gpus):
                with tf.device('/cpu:%d' % i):   #这里指定cpu,如果不指定预测会报错
                    with tf.name_scope('%s_%d' % ("tower", i)) as scope:
                        x_train = tf.placeholder(tf.int32, [None, None], name="input_x")
                        y_train = tf.placeholder(tf.float32, [None, None], name="input_y")
                        keep_prob = tf.constant(0.9, dtype=tf.float32,name="keep_prob")
                        model = TextCNNMulFilterSize(config, x_train, y_train, keep_prob)
                        output=model.pred_y
        saver = tf.train.Saver(tf.global_variables())
        init = tf.global_variables_initializer()
        sess = tf.Session(config=tf.ConfigProto(
            allow_soft_placement=True,
            log_device_placement=FLAGS.log_device_placement))
        sess.run(init)
        sess = tf.Session(config=tf.ConfigProto(
        allow_soft_placement=True,
        log_device_placement=FLAGS.log_device_placement))
        sess.run(tf.global_variables_initializer())
        latest_ckpt = tf.train.latest_checkpoint(FLAGS.train_dir)
        print(latest_ckpt)
        saver.restore(sess, latest_ckpt)
        print(x_train.op.name)
        print(keep_prob.op.name, output.op.name)
        output_graph_def = tf.graph_util. \
            convert_variables_to_constants(sess, sess.graph_def, [x_train.op.name, keep_prob.op.name, output.op.name])

        tf.train.write_graph(output_graph_def, '.', FLAGS.pathpb, as_text=False)
        print("导入成功")
def main(argv=None):
  if tf.gfile.Exists(FLAGS.pathpb):
    tf.gfile.DeleteRecursively(FLAGS.pathpb)
  export()
if __name__ == '__main__':
     tf.app.run()


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luoyexuge/article/details/79960206

Deeplearning4j例程(二) 加载本地模型预测未知图像

项目需要,先train好模型,存至本地。在项目中需要预测用户上传的图像是什么。此过程就应用到了加载本地模型,然后预测用户上传的图像,反馈会结果。    一、将模型存至本地: //sav...
  • qq_18293213
  • qq_18293213
  • 2017年03月20日 20:55
  • 1086

MXNet官方文档教程(7):训练和推断模型

训练和推断模型 我们在module(缩写mod)包中模块化了经常用到的训练和推断模型的代码。这个包提供了中层和高层接口来执行已定义好的网络。   基础用法 准备 在本部分教程中,我们将使用一...
  • Catalyst_ZX
  • Catalyst_ZX
  • 2017年03月08日 16:38
  • 4730

Tensorflow保存模型,恢复模型,使用训练好的模型进行预测和提取中间输出(特征)【转】

来自:http://blog.csdn.net/ying86615791/article/details/72731372 前言: tensorflow中有operation和tensor,前者表...
  • chenyefei
  • chenyefei
  • 2017年08月09日 12:25
  • 281

Tensorflow实现cnn模型的训练与使用

Tensorflow实现cnn模型的训练与使用本文仅为cnn基于tensorflow的代码部分笔记,主要内容各层的搭建与参数的的设置,cnn介绍:点我链接1.简介本文主要实现lenet5的在手写数字识...
  • shenhuaifeng
  • shenhuaifeng
  • 2017年09月21日 16:30
  • 3788

深度学习Caffe平台实例——CIFAR-10数据集在caffe平台上模型训练及实例使用模型进行预测

一、CIFAR-10数据模型训练 1.下载二进制的cifar文件   cd $CAFFE_ROOT ./data/cifar10/get_cifar10.sh     说明:该脚本会下载二进制的ci...
  • liuweizj12
  • liuweizj12
  • 2016年08月06日 20:17
  • 5370

Keras框架训练模型保存及载入继续训练

Keras框架训练模型保存及再载入 实验数据MNIST 初次训练模型并保存 import numpy as np from keras.datasets import mnist f...
  • jacke121
  • jacke121
  • 2018年01月13日 11:24
  • 654

keras中如何保存model的数据,以及如何重构模型进行数据预测

keras中首先是训练神经网络模型,在训练好一个不错神经网络模型之后如何对数据进行预测呢? 这里就需要先保存训练好的神经网络模型的结构与参数。接下来的代码展示了如何保存model的结构与训练好的参数,...
  • JohinieLi
  • JohinieLi
  • 2017年04月05日 22:47
  • 7700

TensorFlow 训练好模型参数的保存和恢复代码

TensorFlow 训练好模型参数的保存和恢复代码,之前就在想模型不应该每次要个结果都要重新训练一遍吧,应该训练一次就可以一直使用吧。 TensorFlow 提供了 Saver 类,可以进行保...
  • fendouaini
  • fendouaini
  • 2017年07月16日 19:38
  • 485

保存Keras训练的模型

保存Keras训练的模型 不推荐使用pickle或cPickle。 (1) 如果只保存模型结构,代码如下: [python] view plain copy ...
  • baoyan2015
  • baoyan2015
  • 2017年03月14日 11:58
  • 1411

Deeplearning4j模型保存至HDFS

Deeplearning4j模型保存至HDFS Deeplearning4j支持训练出来的网络模型存储在HDFS上: 上面示例图中的代码不是很全,这里进行简易补全 需要引入的HDFS的包...
  • u011669700
  • u011669700
  • 2018年01月20日 13:48
  • 181
收藏助手
不良信息举报
您举报文章:多gup训练模型、模型保存cpu预测
举报原因:
原因补充:

(最多只允许输入30个字)