1.使用场景

假设我们有训练好的模型A,B,C,我们希望使用A,B,C中的部分或者全部变量,合成为一个模型D,用于初始化或其他目的,就需要融合多个模型的方法

2.如何实现

我们可以先声明模型D,再创建多个Saver实例,分别从模型A,B,C的保存文件(checkpoint文件)中读取所需的变量值,来达成这一目的,下面是示例代码:

首先创建一个只包含w1,w2两个变量的模型,初始化后保存:

  1. def train_model1():
  2. w1 = tf.get_variable("w1", shape=[3, 1], initializer=tf.truncated_normal_initializer(),trainable=True)
  3. w2 = tf.get_variable("w2", shape=[3, 1], initializer=tf.truncated_normal_initializer(), trainable=True)
  4. x = tf.placeholder(tf.float32, shape=[None, 3], name="x")
  5. a1 = tf.matmul(x, w1)
  6. input = np.random.rand(3200, 3)
  7. sess = tf.InteractiveSession()
  8. sess.run(tf.global_variables_initializer())
  9. saver1 = tf.train.Saver([w1,w2])
  10. for i in range(0, 1):
  11. w1_var,w2_var = sess.run([w1,w2], feed_dict={x: input[i * 32:(i + 1) * 32]})
  12. print w1_var
  13. print w2_var
  14. print '=' * 30
  15. saver1.save(sess, 'save1-exp')

然后再创建一个只包含w2,w3两个变量的模型,也是初始化后保存:

  1. def train_model2():
  2. w2 = tf.get_variable("w2", shape=[3, 1], initializer=tf.truncated_normal_initializer(),trainable=True)
  3. w3 = tf.get_variable("w3", shape=[3, 1], initializer=tf.truncated_normal_initializer(),trainable=True)
  4. x = tf.placeholder(tf.float32, shape=[None, 3], name="x")
  5. a2 = tf.matmul(x, w2 * w3)
  6. input = np.random.rand(3200, 3)
  7. sess = tf.InteractiveSession()
  8. sess.run(tf.global_variables_initializer())
  9. saver2 = tf.train.Saver([w2,w3])
  10. for i in range(0, 1):
  11. w2_var, w3_var = sess.run([w2, w3], feed_dict={x: input[i * 32:(i + 1) * 32]})
  12. print w2_var
  13. print w3_var
  14. print '=' * 30
  15. saver2.save(sess, 'save2-exp')

最后我们创建一个包含w1,w2,w3变量的模型,从上面两个保存的ckp文件中恢复:

  1. def restore_model():
  2. w1 = tf.get_variable("w1", shape=[3, 1], initializer=tf.truncated_normal_initializer(),trainable=True)
  3. w2 = tf.get_variable("w2", shape=[3, 1], initializer=tf.truncated_normal_initializer(),trainable=True)
  4. w3 = tf.get_variable("w3", shape=[3, 1], initializer=tf.truncated_normal_initializer(),trainable=True)
  5. x = tf.placeholder(tf.float32, shape=[None, 3], name="x")
  6. a1 = tf.matmul(x, w1)
  7. a2 = tf.matmul(x, w2 * w3)
  8. loss = tf.reduce_mean(tf.square(a1 - a2))
  9. sess = tf.InteractiveSession()
  10. sess.run(tf.global_variables_initializer())
  11. saver1 = tf.train.Saver([w1,w2])
  12. saver1.restore(sess, 'save1-exp')
  13. saver2 = tf.train.Saver([w2, w3])
  14. saver2.restore(sess, 'save2-exp')
  15. saver3 = tf.train.Saver(tf.trainable_variables())
  16. input = np.random.rand(3200, 3)
  17. w1_var, w2_var, w3_var = sess.run([w1, w2, w3], feed_dict={x: input[0:32]})
  18. print w1_var
  19. print w2_var
  20. print w3_var
  21. print '=' * 30
  22. saver3.save(sess, 'save3-exp')

然后保存,即完成了我们的目标

3.注意事项

3.1 取的模型中有同名变量

假设同名变量为a,这种情况下,从不同模型中恢复的a是按照读取顺序覆盖到a中的,如果希望只读取特定ckpt保存的变量值,在创建读取其他ckpt的saver时,不要把a加入到var_list中

3.2 模型D中有部分变量不在A,B,C中

这种情况,恢复时会报错,需要指定var_list,只恢复当前cpkt中保存的变量

tensorflow中一种融合多个模型的方法的更多相关文章

  1. Java中几种常用数据类型之间转换的方法

    Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...

  2. [转]分享php中四种webservice实现的简单架构方法及实例

    FROM : http://www.itokit.com/2012/0417/73615_2.html 本人所了解的webservice有以下几种:PHP本身的SOAP,开源的NUSOAP,商业版的P ...

  3. 分享php中四种webservice实现的简单架构方法及实例

    一:PHP本身的SOAP所有的webservice都包括服务端(server)和客户端(client).要使用php本身的soap首先要把该拓展安装好并且启用.下面看具体的code首先这是服务端实现: ...

  4. 在Linux中三种让crontab每秒执行任务的方法

    第一种方法: 1.创建脚本文件 cat phplog.sh 2.编辑脚本内容 #!/bin/bash while : ;do /home/scripts.sh 2>/dev/null & ...

  5. 分享php中四种webservice实现的简单架构方法及实例(转)

    本人所了解的webservice有以下几种:PHP本身的SOAP,开源的NUSOAP,商业版的PHPRPC,以及使用二进制传输数据流的 HessianPHP,那么一下就简单的介绍下这几种webserv ...

  6. 分享php中四种webservice实现的简单架构方法及实例[转载]

    [转载]http://www.itokit.com/2012/0417/73615.html 本人所了解的webservice有以下几种:PHP本身的SOAP,开源的NUSOAP,商业版的PHPRPC ...

  7. 比较C#中几种常见的复制字节数组方法的效率

    在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadBytes,Buffe ...

  8. JAVA中3种将byte转换为String的方法

    HttpClient 类库中GetMethod类的getResponseBody方法返回的是byte[]类型,要操作起来不方便,我想把它转化成String类型. 查了网上的资料,有说法认为用这种方法比 ...

  9. 比较C#中几种常见的复制字节数组方法的效率[转]

    [原文链接] 在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadByte ...

随机推荐

  1. 关于多线程之GCD的一些学习要点

    GCD是当前多线程使用最方便的,也是使用比较多的. 学习GCD主要集中在一下几点: 一.队列,同步,异步 1.主队列:dispatch_get_main_queue(); 2.串行队列:dispatc ...

  2. Linux之安装python

    # yum install zlib-devel -y # tar -xf Python-3.6.0 cd Python-3.6.0 # ./configure --prefix=/usr/local ...

  3. Git_git diff 与 git diff -- cached 区别

    1.首先,打开一个干净的工作区 2.对文件进行修改 3.使用 git diff  进行查看(这里的解释可能不是很准确,暂时这么理解!) 4. 执行 git add 将工作区中的内容add到stage, ...

  4. week 10 blog

    一.Iterations : 1.do...while : 创建执行指定语句的循环,直到测试条件评估为false.在执行语句后评估条件,导致指定语句至少执行一次. 例子:在以下示例中,do...而循环 ...

  5. 处理程序“AllowAccessJavaScripts”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    处理程序“AllowAccessJavaScripts”在其模块列表中有一个错误模块“ManagedPipelineHandler” 执行命令"cd C:\Windows\Microsoft ...

  6. Scala编程进阶

    跳出循环语句的3种方法... 2 多维数组... 3 Java数组与Scala数组缓冲的隐式转换... 3 Java Map与Scala Map的隐式转换... 3 Tuple拉链操作... 4 内部 ...

  7. oracle去掉字段全部空格进行模糊查询

    sql如下: select * from pwlp_law_person where replace(name,' ','') like replace('吕 刚',' ','');

  8. CVPR论文《100+ Times Faster Weighted Median Filter (WMF)》的实现和解析(附源代码)。

    四年前第一次看到<100+ Times FasterWeighted Median Filter (WMF)>一文时,因为他附带了源代码,而且还是CVPR论文,因此,当时也对代码进行了一定 ...

  9. [Python设计模式] 第15章 如何兼容各种DB——抽象工厂模式

    github地址:https://github.com/cheesezh/python_design_patterns 题目 如何让一个程序,可以灵活替换数据库? 基础版本 class User(): ...

  10. HashMap代码解析

    hashmap (jdk 1.7)使用 “数组-链表” 方式进行存储,图形化表示如下: 即,前面是一个数组,后面跟一个链表,那么数据结构这个对应到HashMap的代码里面是什么样子的呢? 在HashM ...