博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tensorflow中一种融合多个模型的方法
阅读量:5110 次
发布时间:2019-06-13

本文共 3021 字,大约阅读时间需要 10 分钟。

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_var13         print w2_var14         print '=' * 3015     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_var13         print w3_var14         print '=' * 3015     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_var19     print w2_var20     print w3_var21     print '=' * 3022     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中保存的变量

转载于:https://www.cnblogs.com/hrlnw/p/10466145.html

你可能感兴趣的文章
Repeater + Resources 列表 [原创][分享]
查看>>
c# Resolve SQlite Concurrency Exception Problem (Using Read-Write Lock)
查看>>
dependency injection
查看>>
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
C#综合揭秘——细说多线程(下)
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>
Swift3.0服务端开发(三) Mustache页面模板与日志记录
查看>>
【转】 FPGA设计的四种常用思想与技巧
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
新手算法学习之路----二叉树(在一个二叉查找树中插入一个节点)
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
基于C#编程语言的Mysql常用操作
查看>>
s3c2440实验---定时器
查看>>
MyEclipse10安装SVN插件
查看>>
[转]: 视图和表的区别和联系
查看>>