起因是看到了这么一个帖子:

http://www.cocoachina.com/cms/wap.php?action=article&id=86347

简短来说就是下面的代码   运行起来结果十分的怪异!!!

import tensorflow as tf

a = tf.constant(1.)
mean_a, mean_a_uop = tf.metrics.mean(a)
with tf.control_dependencies([mean_a_uop]):
mean_a = tf.identity(mean_a) sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
tf.local_variables_initializer().run() for _ in range(10):
print(sess.run(mean_a))

在CPU上运行:

第一次运行结果:

第二次运行结果:

第三次运行结果:

第四次运行结果:

第五次运行结果:

可以发现上述代码在CPU环境下运行每次结果均不太相同,而且离希望得到结果都不一样。

希望的结果为   1.0  1.0  1.0  1.0    1.0     1.0     1.0     1.0      1.0     1.0

在GPU上运行:

第一次结果:

第二次结果

第三次结果:

第四次结果:

第五次结果:

可以发现上述代码在GPU环境下运行每次结果均相同,但都不是希望的结果。

希望的结果为   1.0  1.0  1.0  1.0    1.0     1.0     1.0     1.0      1.0     1.0

以上则为所引帖子中所提问题。

==================================================================

由上面的问题做了写尝试:(以下测试均在GPU上执行)

1.

import tensorflow as tf

a = tf.constant([1.0,])
mean_a, mean_a_uop = tf.metrics.mean(a) sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
tf.local_variables_initializer().run() for _ in range(10):
print(sess.run([mean_a_uop, mean_a]))
print('result:--------------------')
print(sess.run(mean_a))

最终的均值  mean_a 为1.0, 结果正确。

过程中   mean_a_uop 为全局更新操作,结果一直为1.0,结果正确。

过程中   均值  mean_a   在浮动,不一直为1.0, 结果不正确。

2.

import tensorflow as tf
import numpy as np a = tf.constant([1.])
mean_a, mean_a_uop = tf.metrics.mean(a) with tf.control_dependencies([mean_a_uop]):
op=tf.no_op() sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
tf.local_variables_initializer().run() for _ in range(10):
print(sess.run([mean_a, op,mean_a_uop]))
print('result: --------------------')
print(sess.run(mean_a))

最终的均值  mean_a 为1.0, 结果正确。

过程中   mean_a_uop 为全局更新操作,结果一直为1.0,结果正确。

过程中   均值  mean_a   在浮动,不一直为1.0, 结果不正确。

3.

import tensorflow as tf

a = tf.constant([1.,])
mean_a, mean_a_uop = tf.metrics.mean(a) with tf.control_dependencies([mean_a_uop]):
mean_a2 = tf.identity(mean_a) sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
tf.local_variables_initializer().run() for _ in range(10):
print(sess.run([mean_a2, mean_a, mean_a_uop]))
print('result: ---------------')
print(sess.run(mean_a))

最终的均值  mean_a 为1.0, 结果正确。

过程中   mean_a_uop 为全局更新操作,结果一直为1.0,结果正确。

过程中   均值  mean_a, mean_a2相等  且在浮动,不一直为1.0, 结果不正确。

===============================================================

根据原帖子将原始代码中的tf.constant 换成 tf.Variable,效果如何呢?

import tensorflow as tf

a = tf.Variable(tf.constant(1.))
mean_a, mean_a_uop = tf.metrics.mean(a)
with tf.control_dependencies([mean_a_uop]):
mean_a = tf.identity(mean_a) sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
tf.local_variables_initializer().run() for _ in range(10):
print(sess.run(mean_a))

CPU上运行:

第一次运行结果:

第二次运行结果:

第三次运行结果:

在GPU上运行呢???

第一次运行:

第二次运行:

第三次运行:

===========================================================================

综上发现如果不规范的使用   tf.metrics     会引发不可预知的后果,主要使用不当如下:(虽然如下的做法也没理由出错,但是事实却是常出错,有问题)

mean_a, mean_a_uop = tf.metrics.mean(a)
with tf.control_dependencies([mean_a_uop]):
mean_a = tf.identity(mean_a)

for _ in range(10):
  print(sess.run(mean_a))

正确使用如下:

import tensorflow as tf

a = tf.Variable(tf.constant(1.))
mean_a, mean_a_uop = tf.metrics.mean(a)
#with tf.control_dependencies([mean_a_uop]):
# mean_a = tf.identity(mean_a) sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
tf.local_variables_initializer().run() for _ in range(10):
print(sess.run(mean_a_uop)) print('result:-------------')
print(sess.run(mean_a))

CPU上运行:

GPU上运行:

解决   tf.metrics  出错问题  的关键就是  不使用  依赖控制     tf.control_dependencies   。

mean_a, mean_a_uop = tf.metrics.mean   中的   均值mean_a  和  更新mean_a_uop 不在一个session执行中获得,  即
如下操作:
for _ in range(10):
print(sess.run(mean_a_uop)) print('result:-------------')
print(sess.run(mean_a))

而且在更新过程中,  mean_a_uop 的结果会一直保证正确,   mean_a只有在新的session执行中才保证正确。

至于为什么会有这么个结果也是无法解释的,不过这应该是既成事实,使用过程中注意就好,还有就是  依赖控制 慎用  tf.control_dependencies ,  不是必须使用的时候就不用。

 

tf.metrics 使用过程中发现的一些问题的更多相关文章

  1. 为Secure Store Service生成新密钥,解决“生成密钥过程中发现错误”的问题

    我们集成TFS和SharePoint Server以后,一个最常见的需求是通过SharePoint Server的Excel Service读取TFS报表中的信息,利用Excel Service的强大 ...

  2. 常见Code Review过程中发现的问题-续

    上一篇列举了一些比较常见的Code Review问题列表,文末有链接,可追溯查看.本篇为上篇的姊妹篇,继续列举一些上篇遗漏的或不易发现的问题清单,希望能整体性把一些常见的问题表述出来. 测试数据不具有 ...

  3. 调试过程中发现按f5无法走进jdk源码

    debug 模式 ,在fis=new FileInputStream(file); 行打断点 调试过程中发现按f5无法走进jdk源码 package com.lzl.spring.test; impo ...

  4. Hive通过查询语句向表中插入数据过程中发现的坑

    前言 近期在学习使用Hive(版本号0.13.1)的过程中,发现了一些坑,它们也许是Hive提倡的比关系数据库更加自由的体现(同一时候引来一些问题).也许是一些bug.总而言之,这些都须要使用Hive ...

  5. 常见Code Review过程中发现的问题

    软件环境:Spring MVC + MyBatis 主要体现在两个方面,一个是编码习惯问题,另一个是编码质量的问题.编码习惯主要有日志编写.代码注释以及编码风格的问题,而编码质量则与很多方面相关,比如 ...

  6. 在网站制作过程中发现的block和inline-block不同。

    inline-block,简单来说就是在CSS中通过display:inline-block对一个对象指定inline-block属性,可以将对象呈递为内联对象,但是对象的内容作为块对象呈递.有时既希 ...

  7. VS 2017开发ASP.NET Core Web应用过程中发现的一个重大Bug

    今天试着用VS 2017去开发一个.net core项目,想着看看.net core的开发和MVC5开发有什么区别,然后从中发现了一个VS2017的Bug. 首先,我们新建项目,ASP.NET Cor ...

  8. sqlserver2017安装及连接过程中发现的问题

    1.SSMS安装报错,如下图 根据搜索资料发现是防火墙的问题,关闭防火墙就行了. 2.连接用户时报错 这个是因为远程连接相关问题. 首先打开服务器远程连接: 其次点击: SqlServer配置管理器- ...

  9. vue生命周期updated的触发时机之debug过程中发现的firefox问题

    现象描述: 断点位置1 谷歌debug的过程: 火狐debug的过程: 只要在改变数据之后有断点停顿,就会先去执行updated函数 断点位置2 此时火狐和谷歌是一样的效果,但是执行顺序是不一致的 谷 ...

  10. Mysql: Connect/C++ 使用过程中发现返回 std::string 造成的内存泄露

    在使用 Connect/C++ ,测试时发现在调用 getString 出现了内存增长的情况. ConstructOutput(); //打印出当前内存 ;i<;++i) { prepareSt ...

随机推荐

  1. kettle从入门到精通 第三十五课 kettle 变量

    1.设置变量 a.可以通过转换中的"设置变量"步骤进行设置. b.手动通过kettle.properties文件或通过"编辑"菜单中的"设置环境变量& ...

  2. 不挑电脑安装 WIndows11 用 Rufus这个软件

    下 Rufus 找一个U盘先别动 然后去夸克网盘下载 windows11 24h2 iso 版本的安装文件,陶10块钱加速下载下来 然后安装Rufus 然后使用这个启动盘制作工具选择下载好的 iso原 ...

  3. 闪迪SSD PLUS 128G CDM CrystalDiskMark

    闪迪SSD PLUS 128G CDM CrystalDiskMark 4k 读取才11,大号U盘水平. -- 对比三星SATA SSD. ..

  4. C#.NET 国密SM4加密解密 CBC ECB 2种模式

    注意点: 1.加密时,明文转 byte[] 时,不要用 Encoding.Default,一定要指定编码,如:UTF-8. 解密时,解出的 byte[] 转 string 同样要指定相同的编码. 2. ...

  5. mongodb基于角色的访问控制

    https://www.mongodb.com/docs/v4.4/tutorial/enable-authentication/ https://www.mongodb.com/docs/manua ...

  6. 日志之log4j2和springboot

    log4j2比logback好用. 现在之所有以spring采用logback,根据我个人的理解应该是某种非常特殊的理由.否则log4j2的性能比logback更好,且异步性能极好! 异步日志是log ...

  7. ansible(1)---师傅领进门

    背景 在企业里,运维需要配合开发进行产品上架,说白了就是把写好的代码上服务器.那么,就会出现这样的问题:需要运维人员配置好系统,配置好环境,配置好网络,配置好程序,配置好所有所有的依赖环境.     ...

  8. Netty(三)Netty模型

    1. Netty模型 Netty主要基于主从Reactor多线程模型做了一定的改进,其中主从Reactor多线程模型有多个Reactor. 简版图: 说明: BossGroup线程维护Selector ...

  9. VUE中watch的详细使用教程

      1.watch是什么? watch:是vue中常用的侦听器(监听器),用来监听数据的变化 2.watch的使用方式如下 watch: { 这里写你在data中定义的变量名或别处方法名: { han ...

  10. python基础-列表list [ ]

    列表的定义和操作 列表的特性: 元素数量 支持多个 元素类型 任意 下标索引 支持 重复元素 支持 可修改性 支持 数据有序 是 使用场景 可修改.可重复的 一批数据记录场景 # 定义一个列表list ...