tensorflow之tf.nn.moments()函数解析

2023-10-14 01:20

本文主要是介绍tensorflow之tf.nn.moments()函数解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这两天在看batch normalization的代码时碰到了这个tf.nn.moments()函数,特此记录。

tf.nn.moments()函数用于计算均值和方差。
# 用于在指定维度计算均值与方差
tf.nn.moments(x,axes,shift=None,	# pylint: disable=unused-argumentname=None,keep_dims=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

参数:

  • x:一个Tensor,可以理解为我们输出的数据,形如 [batchsize, height, width, kernels]。

  • axes:整数数组,用于指定计算均值和方差的轴。如果x是1-D向量且axes=[0] 那么该函数就是计算整个向量的均值与方差。

  • shift:未在当前实现中使用。

  • name:用于计算moment的操作范围的名称。

  • keep_dims:产生与输入具有相同维度的moment,通俗点说就是是否保持维度。

返回:

Two Tensor objects: mean and variance.

两个Tensor对象:mean和variance.

解释如下:

  • mean 就是均值
  • variance 就是方差
例子1:

计算3 * 3维向量的mean和variance,程序如下:

import tensorflow as tf

img = tf.Variable(tf.random_normal([3, 3]))
axis = list(range(len(img.get_shape()) - 1))
mean, variance = tf.nn.moments(img, axis)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(img))
print(axis)
resultMean = sess.run(mean)
print(‘resultMean’,resultMean)
resultVar = sess.run(variance)
print(‘resultVar’,resultVar)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
> [[ 0.9398157   1.1222504  -0.6046098 ][ 1.4187386  -0.298682    1.033441  ][ 0.64805275  0.40496045  1.4371132 ]]
> [0]
> resultMean [1.0022024  0.40950966 0.62198144]
> resultVar [0.10093883 0.33651853 0.77942157]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

根据上面的代码,很容易可以看出axis=[0],那么tf.moments()函数就是在 [0] 维度上求了个均值和方差。

而针对3 * 3的矩阵,其实可以这么理解,当axis=[0]时,那么我们3 * 3的矩阵就可以看成三个长度为3的一维向量,然后就是三个向量的均值和方差计算,也就是对应三个向量的对应第一个数进行一次计算,对应第二个数进行一次计算,对应第三个数进行一次计算,这么说的就非常的通俗了。这是一个非常简单的例子,如果换做形如

例子2:

计算卷积神经网络某层的的mean和variance,程序如下:

import tensorflow as tf

img = tf.Variable(tf.random_normal([128, 32, 32, 64]))
axis = list(range(len(img.get_shape()) - 1))
mean, variance = tf.nn.moments(img, axis)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
# print(sess.run(img))
print(axis)
resultMean = sess.run(mean)
print(‘resultMean’,resultMean)
resultVar = sess.run(variance)
print(‘resultVar’,resultVar)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

形如[128, 32, 32, 64]的数据在CNN的中间层非常常见,为了给出一个直观的认识,函数的输出结果如下,可能输出的数字比较多。

> [0, 1, 2]
> resultMean [ 2.6853075e-03 -3.0257576e-03  2.3035323e-03 -2.6062224e-03-3.2305701e-03  2.1037455e-03  6.7329779e-03 -2.2388114e-042.6253066e-03 -6.7248638e-03  2.3191441e-04 -5.8187090e-04-9.0473756e-04 -1.6551851e-03 -1.1362392e-03 -1.9381186e-03-1.2468656e-03 -3.5813404e-03  7.0505054e-04  5.0926261e-04-3.4001360e-03 -2.2198933e-03 -1.8291552e-04 -2.9487342e-032.8003550e-03  2.0361040e-03  7.5038348e-04  1.1216532e-031.1721103e-03  4.0136781e-03 -1.3581098e-03 -1.9081675e-03-5.7506924e-03  1.4085017e-04  9.2261989e-04  3.6248637e-03-3.4064866e-04 -1.7123687e-03  2.8599303e-03  3.3247408e-03-3.0919732e-04 -2.5428729e-03 -1.8558424e-03  6.8022363e-04-2.3567205e-04  2.0230825e-03 -5.6563923e-03 -4.9449857e-03-1.5591505e-03  5.4281385e-04  3.4175792e-03  3.4342592e-03-2.2981209e-03 -1.1064336e-03 -2.4347606e-03 -8.7688277e-034.2153443e-03  1.8990067e-03 -1.7339690e-03 -4.1099632e-042.9905797e-05 -2.2589187e-03  1.3317640e-03 -1.0637580e-03]
> resultVar [0.99827653 0.99892205 1.0023996  1.0008711  1.0027382  1.00621831.0062574  0.9907291  1.0007423  1.0074934  0.9987777  0.997345860.99948376 0.9996146  0.9981512  0.9992911  1.0065222  0.99599120.99847895 0.9947184  1.0043     1.004565   0.9955365  1.00639280.9991787  0.99631685 1.0008278  1.0084031  1.0019135  1.00098971.0022242  1.0076597  1.0040829  0.9944737  1.0008909  0.99621671.002177   1.0043476  1.0003107  1.0018493  1.0021918  1.00386640.9958006  0.99403363 1.0066489  1.001033   0.9994988  0.99438080.9973529  0.9969688  1.0023019  1.004277   1.0000937  1.00093651.0067816  1.0005956  0.9942864  1.0030564  0.99745005 0.99089261.0037254  0.9974016  0.99849343 1.0066065 ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

对于 [128, 32, 32, 64] 这样的4维矩阵来说,一个batch里的128个图,经过一个64kernels卷积层处理,得到了128 * 64个图,再针对每一个kernel所对应的128个图,求它们所有像素的mean和variance,因为总共有64个kernels,输出的结果就是一个一维长度64的数组。
在这里插入图片描述

参考文章:

谈谈Tensorflow的Batch Normalization

                                </div><link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet"><div class="more-toolbox"><div class="left-toolbox"><ul class="toolbox-list"><li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true"><use xlink:href="#csdnc-thumbsup"></use></svg><span class="name">点赞</span><span class="count">14</span></a></li><li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-csdnc-Collection-G"></use></svg><span class="name">收藏</span></a></li><li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-csdnc-fenxiang"></use></svg>分享</a></li><!--打赏开始--><!--打赏结束--><li class="tool-item tool-more"><a><svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg></a><ul class="more-box"><li class="item"><a class="article-report">文章举报</a></li></ul></li></ul></div></div><div class="person-messagebox"><div class="left-message"><a href="https://blog.csdn.net/TeFuirnever"><img src="https://profile.csdnimg.cn/6/1/2/3_tefuirnever" class="avatar_pic" username="TeFuirnever"><img src="https://g.csdnimg.cn/static/user-reg-year/1x/1.png" class="user-years"></a></div><div class="middle-message"><div class="title"><span class="tit"><a href="https://blog.csdn.net/TeFuirnever" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">我是管小亮 :)</a></span><span class="flag expert"><a href="https://blog.csdn.net/home/help.html#classicfication" target="_blank"><svg class="icon" aria-hidden="true"><use xlink:href="#csdnc-blogexpert"></use></svg>博客专家</a></span></div><div class="text"><span>发布了192 篇原创文章</span> · <span>获赞 4116</span> · <span>访问量 44万+</span></div></div><div class="right-message"><a href="https://im.csdn.net/im/main.html?userName=TeFuirnever" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信</a><a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a></div></div></div>

这篇关于tensorflow之tf.nn.moments()函数解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/207142

相关文章

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认