tf.metrics.sparse_average_precision_at_k 和 tf.metrics.precision_at_k的自己理解
tensorflow最大的问题就是大家都讲算法,不讲解用法,API文档又全是英文的,看起来好吃力,理解又不到位。当然给数学博士看的话,就没问题的。
最近看了一系列非常不错的文章,做一下记录:
https://www.zhihu.com/people/hong-lan-99/activities
https://blog.csdn.net/qq_37747262
https://blog.csdn.net/qq_37747262/article/details/82223155
特别是关于他的填坑记系列的。我发现我看不懂 tf.metrics.precision_at_k这个代码,在知乎上也找到了他解释的文档。奈何解释的我看不太懂。
以下是他在知乎上插入的代码
作者:洪澜
链接:https://www.zhihu.com/question/277184041/answer/480219663
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 import tensorflow as tf
import numpy as np y_true = np.array([[2], [1], [0], [3], [0], [1]]).astype(np.int64)
y_true = tf.identity(y_true) y_pred = np.array([[0.1, 0.2, 0.6, 0.1],
[0.8, 0.05, 0.1, 0.05],
[0.3, 0.4, 0.1, 0.2],
[0.6, 0.25, 0.1, 0.05],
[0.1, 0.2, 0.6, 0.1],
[0.9, 0.0, 0.03, 0.07]]).astype(np.float32)
y_pred = tf.identity(y_pred) _, m_ap = tf.metrics.sparse_average_precision_at_k(y_true, y_pred, 2) sess = tf.Session()
sess.run(tf.local_variables_initializer()) stream_vars = [i for i in tf.local_variables()]
print((sess.run(stream_vars))) tf_map = sess.run(m_ap)
print(tf_map) tmp_rank = tf.nn.top_k(y_pred,4)
print(sess.run(tmp_rank))
以下是他的解释
链接:https://www.zhihu.com/question/277184041/answer/480219663
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 简单解释一下,首先
y_true代表标签值(未经过one-hot),shape:(batch_size, num_labels),y_pred代表预测值(logit值) ,shape:(batch_size, num_classes) - 其次,要注意的是
tf.metrics.sparse_average_precision_at_k中会采用top_k根据不同的k值对y_pred进行排序操作 ,所以tmp_rank是为了帮助大噶理解究竟y_pred在函数中进行了怎样的转换。 - 然后,
stream_vars = [i for i in tf.local_variables()]这一行是为了帮助大噶理解tf.metrics.sparse_average_precision_at_k创建的tf.local_varibles实际输出值,进而可以更好地理解这个函数的用法。 - 具体看这个例子,当
k=1时,只有第一个batch的预测输出是和标签匹配的 ,所以最终输出为:1/6 = 0.166666;当k=2时,除了第一个batch的预测输出,第三个batch的预测输出也是和标签匹配的,所以最终输出为:(1+(1/2))/6 = 0.25。
#调用以下代码
tmp_rank = tf.nn.top_k(y_pred,4)
print(sess.run(tmp_rank))
'''
就会得到类似的东西
TopKV2(values=array([[0.6 , 0.2 , 0.1 , 0.1 ],
[0.8 , 0.1 , 0.05, 0.05],
[0.4 , 0.3 , 0.2 , 0.1 ],
[0.6 , 0.25, 0.1 , 0.05],
[0.6 , 0.2 , 0.1 , 0.1 ],
[0.9 , 0.07, 0.03, 0. ]], dtype=float32), indices=array([[2, 1, 0, 3],
[0, 2, 1, 3],
[1, 0, 3, 2],
[0, 1, 2, 3],
[2, 1, 0, 3],
[0, 3, 2, 1]]))
'''
通过对tf.nn.top_k的调用以及返回的结果,可以明白函数大概有几个作用
1. 把y_pred中的数值进行了从大到小的重新排列
2. 计算得到现在位置上的数据原来所在的位置
K值的作用是指定只计算多少个。作者的解释
- 具体看这个例子,当
k=1时,只有第一个batch的预测输出是和标签匹配的 ,所以最终输出为:1/6 = 0.166666;当k=2时,除了第一个batch的预测输出,第三个batch的预测输出也是和标签匹配的,所以最终输出为:(1+(1/2))/6 = 0.25。
就比较容易解释了。简单的理解,就是后面输出的原来的位置和y_true进行比较,如果匹配就增加一,以前是一列数据去比较,现在成了K列,然后得到的数字/K。那么这个函数这样做的目的和意义在哪里呢?
我个人的理解,如果K=1的时候,是预测概率最大的和标签匹配的概率是多少,K=2的时候,计算的是概率最大的列和其次的最大概率恰好与标签匹配的概率的平均准确度有多少。
tf.metrics.sparse_average_precision_at_k 和 tf.metrics.precision_at_k的自己理解的更多相关文章
- tf.nn.conv2d 和 tf.nn.max_pool 中 padding 分别为 'VALID' 和 'SAME' 的直觉上的经验和测试代码
这个地方一开始是迷糊的,写代码做比较分析,总结出直觉上的经验. 某人若想看精准的解释,移步这个网址(http://blog.csdn.net/fireflychh/article/details/73 ...
- 深度学习原理与框架-图像补全(原理与代码) 1.tf.nn.moments(求平均值和标准差) 2.tf.control_dependencies(先执行内部操作) 3.tf.cond(判别执行前或后函数) 4.tf.nn.atrous_conv2d 5.tf.nn.conv2d_transpose(反卷积) 7.tf.train.get_checkpoint_state(判断sess是否存在
1. tf.nn.moments(x, axes=[0, 1, 2]) # 对前三个维度求平均值和标准差,结果为最后一个维度,即对每个feature_map求平均值和标准差 参数说明:x为输入的fe ...
- TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable—Jason niu
# tensorflow中的两种定义scope(命名变量)的方式tf.get_variable和tf.Variable.Tensorflow当中有两种途径生成变量 variable import te ...
- 深度学习原理与框架-Tensorflow基本操作-变量常用操作 1.tf.random_normal(生成正态分布随机数) 2.tf.random_shuffle(进行洗牌操作) 3. tf.assign(赋值操作) 4.tf.convert_to_tensor(转换为tensor类型) 5.tf.add(相加操作) tf.divide(相乘操作) 6.tf.placeholder(输入数据占位
1. 使用tf.random_normal([2, 3], mean=-1, stddev=4) 创建一个正态分布的随机数 参数说明:[2, 3]表示随机数的维度,mean表示平均值,stddev表示 ...
- tensorflow中 tf.train.slice_input_producer 和 tf.train.batch 函数(转)
tensorflow数据读取机制 tensorflow中为了充分利用GPU,减少GPU等待数据的空闲时间,使用了两个线程分别执行数据读入和数据计算. 具体来说就是使用一个线程源源不断的将硬盘中的图片数 ...
- TensorFlow 辨异 —— tf.add(a, b) 与 a+b(tf.assign 与 =)、tf.nn.bias_add 与 tf.add(转)
1. tf.add(a, b) 与 a+b 在神经网络前向传播的过程中,经常可见如下两种形式的代码: tf.add(tf.matmul(x, w), b) tf.matmul(x, w) + b 简而 ...
- tensorflow中共享变量 tf.get_variable 和命名空间 tf.variable_scope
tensorflow中有很多需要变量共享的场合,比如在多个GPU上训练网络时网络参数和训练数据就需要共享. tf通过 tf.get_variable() 可以建立或者获取一个共享的变量. tf.get ...
- tensorflow中 tf.train.slice_input_producer 和 tf.train.batch 函数
tensorflow数据读取机制 tensorflow中为了充分利用GPU,减少GPU等待数据的空闲时间,使用了两个线程分别执行数据读入和数据计算. 具体来说就是使用一个线程源源不断的将硬盘中的图片数 ...
- tensorflow 基本函数(1.tf.split, 2.tf.concat,3.tf.squeeze, 4.tf.less_equal, 5.tf.where, 6.tf.gather, 7.tf.cast, 8.tf.expand_dims, 9.tf.argmax, 10.tf.reshape, 11.tf.stack, 12tf.less, 13.tf.boolean_mask
1. tf.split(3, group, input) # 拆分函数 3 表示的是在第三个维度上, group表示拆分的次数, input 表示输入的值 import tensorflow ...
随机推荐
- Modbus教程| Modbus协议,ASCII和RTU帧,Modbus工作
转载自:https://www.rfwireless-world.com/Tutorials/Modbus-Protocol-tutorial.html 这个Modbus教程涵盖了modbus协议基础 ...
- python 3列表推导式的的一点理解!
python 3列表推导式的的一点理解! Python的列表推导式对于新手来说一般都难以理解,简单看个例子: [x * x for x in range(1,100)] 上面是一个很简单的列表推导式, ...
- 我理解的windows中断管理
只谈外部中断的windows内核管理,异常和trap不在此文的讨论之列. 1. windows中断总貌 在windows中,物理上的中断源被抽象为KINTERRUPT结构.一个中断源在windows中 ...
- Mybatis源码学习之整体架构(一)
简述 关于ORM的定义,我们引用了一下百度百科给出的定义,总体来说ORM就是提供给开发人员API,方便操作关系型数据库的,封装了对数据库操作的过程,同时提供对象与数据之间的映射功能,解放了开发人员对访 ...
- centernet 相关
1.下代码 git clone https://github.com/Duankaiwen/CenterNet.git 2.
- mitmproxy修改二级代理
第一步 mitmweb --mode upstream:http://114.240.101.242:5672 -s server.py 第二步 def request(self, flow: mit ...
- python练习-(秒转时分秒,时分秒转秒)-对比linux中文件的上次更改时间跟当前时间相差多久。
具体代码如下> import paramiko,re,datetime,time ssh=paramiko.SSHClient() ssh.set_missing_host_key_policy ...
- 【Webscraper】不懂编程也能爬虫
一.配置环境 在浏览器中安装web scraper插件. 所有安装包下载链接: https://pan.baidu.com/s/1CfAWf0wMO6WqicoUgdYgkg 提取码: nn2e 安装 ...
- RCAN——Image Super-Resolution Using Very Deep Residual Channel Attention Networks
1. 摘要 在图像超分辨领域,卷积神经网络的深度非常重要,但过深的网络却难以训练.低分辨率的输入以及特征包含丰富的低频信息,但却在通道间被平等对待,因此阻碍了网络的表示能力. 为了解决上述问题,作者提 ...
- 【8583】ISO8583各域段的说明
[ISO8583各域段的说明] 1,信息类型(message type)定义位图位置:-格式:定长类型:N4描述:数据包的第一部分,定义数据包的类型.数据类型由数据包的发起者设定,应遵循以下要求:数据 ...