关于多gpu测试的疑问

1.首先保存模型以及值:

import tensorflow as tf

input = tf.placeholder(tf.float32, [], 'input')
with tf.name_scope('hans'):

    weights = tf.get_variable('weights', [], tf.float32, tf.ones_initializer(tf.float32))#weights.name:weights:0
    
    ema = tf.train.ExponentialMovingAverage(0.5)
    
#     update = tf.assign(weights, 2)
    output = tf.add(input, weights)#output.name: hans/add:0 
    m_op = ema.apply([output])     #更新hans/add/ExponentialMovingAverage:0
    
    with tf.control_dependencies([m_op]):
        y = tf.identity(ema.average(output),'y')#y:0 是output的滑动平均值
        print(y.name)#hans/y:0

saver = tf.train.Saver()
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(ema.average(output)))#初值为0
    print(sess.run(y, {input: 19}))#此时output为9+1=10
    saver.save(sess, './checkpoint/model0.ckpt')#保存所有值

输出:

0.0
10.0

运行完以上代码后,output的值是不会被保存的,因为他依赖于一个placeholder,所以载入模型后直接sess.run(output)是会报错的;然而output的滑动变量是被保存下来的,可以直接通过ema.average(output)来调用。

2.然后加载模型,按照原代码进行加载

import tensorflow as tf
input = tf.placeholder(tf.float32, [], 'input')
with tf.name_scope('hans'):

    weights = tf.get_variable('weights', [], tf.float32, tf.ones_initializer(tf.float32))#weights.name:weights:0
    
    ema = tf.train.ExponentialMovingAverage(0.5)
    
#     update = tf.assign(weights, 2)
    output = tf.add(input, weights)#output.name: hans/add:0 
    m_op = ema.apply([output])     #更新hans/add/ExponentialMovingAverage:0
    
    with tf.control_dependencies([m_op]):
        y = tf.identity(ema.average(output),'y')#y:0 是output的滑动平均值
        print(y.name)#hans/y:0

saver = tf.train.Saver()
with tf.Session() as sess:
    saver.restore(sess, './checkpoint/model0.ckpt')
    print(sess.run(ema.average(output)))#值应为保存的值,及为10
    print(sess.run(y, {input: 100}))
    print(sess.run(ema.average(output)))#值已经更新

结果:

10.0
55.5
55.5

所以在模型的测试阶段,如果想用之前保存好的average值,就直接用ema.average调用,不要apply。

3.此外,name_scope也要注意如果在测试阶段将name_scope丢掉的话,由于之前保存的滑动平均值的名字是hans/add/ExponentialMovingAverage:0,丢到了name_scope('hans')的话,此时的output的滑动平均值的名字为add/ExponentialMovingAverage:0,那么在载入模型的时候,原来的值则找不到对应名字的变量,所以,如果这时候你直接载入值得话会报错,错误代码如下:

import tensorflow as tf
input = tf.placeholder(tf.float32, [], 'input')

weights = tf.get_variable('weights', [], tf.float32, tf.ones_initializer(tf.float32))#weights.name:weights:0
    
ema = tf.train.ExponentialMovingAverage(0.5)
    
#     update = tf.assign(weights, 2)
output = tf.add(input, weights)#output.name: hans/add:0 
m_op = ema.apply([output])     #更新hans/add/ExponentialMovingAverage:0
    
with tf.control_dependencies([m_op]):
    y = tf.identity(ema.average(output),'y')#y:0 是output的滑动平均值
    print(y.name)#hans/y:0

saver = tf.train.Saver()
with tf.Session() as sess:
    saver.restore(sess, './checkpoint/model0.ckpt')
    print(sess.run(ema.average(output)))#值应为保存的值,及为10
    print(sess.run(y, {input: 100}))
    print(sess.run(ema.average(output)))#值已经更新

报错信息:


修改代码的方法可以加上一开始的name_scope('hans'),也可以直接改变output的名字,则把相应代码修改为:

output = tf.add(input, weights,'hans/Add')

这样,载入的值就可以找到对应的变量。


4.总而言之,在多gpu训练后,测试网络时仍然需要重构网络,因为里面的滑动平均值会找不到对应的变量而报错,但是在多gpu训练是,各个tower上保存的用于batch_normalizaton的均值和方差的滑动变量各不相同,在测试时如何处理这些不同的滑动平均值呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过网上收集和对LINUX服务器性能的分析和体验,整理了几个比较实用,功能比较强大的性能测试工具供亲们下载,虽然网络上都对每个工具做了详细的功能介绍和文档说明,但分得很散,所以, 在此本人将各个比较实用的服务器性能测试工具集中起来,方便开发人员有针对性的测试和对比,在服务器性能方面起到很好的效果。 1、LTP--linux稳定性测试: LTP套件是由 Linux Test Project 所开发的一套系统测试套件。它基于系统资源的利用率统计开发了一个测试的组合,为系统提供足够的压力。通过压力测试来判断系统的稳定性和可靠性。 2、Linux性能测试工具Lmbench:Linux性能测试工具Lmbench是一套简易可移植的,符合ANSI/C标准为UNIX/POSIX而制定的微型测评工具。一般来说,它衡量两个关键特征:反应时间和带宽。Lmbench旨在使系统开发者深入了解关键操作的基础成本。其官方网站是:http://www.bitmover.com/lmbench/。 3、Linux下很全面的监控工具dstat:dstat是一个用来替换 vmstat,iostat netstat,nfsstat和ifstat这些命令的工具, 是一个全能系统信息统计工具. 与sysstat相比, dstat拥有一个彩色的界面, 在手动观察性能状况时, 数据比较显眼容易观察; 而且dstat支持即时刷新, 譬如输入dstat 3, 即每三秒收集一次, 但最新的数据都会每秒刷新显示. 和sysstat相同的是, dstat也可以收集指定的性能资源, 譬如 dstat -c 即显示CPU的使用情况. 下载安装文件dstat-0.6.7-1.el*.rf.noarch.rpm: http://dag.wieers.com/rpm/packages/dstat/ 3、网络流量监测图形分析工具 Cacti:Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具 4、Linux系统维护常用工具sysstat:sysstat这个工具,可以说是linux &Unix; 以及Freebsd最常用的工具。它的主要用途就是观察服务负载,比如CPU和内存的占用率、网络的使用率以及磁盘写入和读取速度等。 5、Apache ab 压力测试:ab的全称是ApacheBench,ab是Apache 附带的超文本传输协议(HTTP)的性能测试工具。 其设计意图是描绘当前所安装的Apache的执行性能,主要是显示你安装的Apache每秒可以处理多少个请求;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值