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 ...
随机推荐
- mali gpu debugger
https://community.arm.com/developer/tools-software/graphics/b/blog/posts/accelerating-mali-gpu-analy ...
- BZOJ 3772: 精神污染 (dfs序+树状数组)
跟 BZOJ 4009: [HNOI2015]接水果一样- CODE #include <set> #include <queue> #include <cctype&g ...
- JDBC (Java DataBase Connectivity)数据库连接池原理解析与实现
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
- 几个不同的关键XPath概念
几个不同的关键XPath概念...... 绝对vs相对XPath(/vs .) / 引入绝对位置路径,从文档的根开始. . 从上下文节点开始引入相对位置路径. 命名元素vs任何元素(enamevs * ...
- B/S大文件分片上传
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...
- dijkstra之zkw线段树优化
其实特别好理解,我们只要写一个数据结构(线段树)支持一下操作: 1.插入一个数\(x\). 2.查询当前数据结构中最小的数的插入编号. 3.删除插入编号为\(x\)的数. 第一眼看成可持久化了 其实就 ...
- elasticsearch Delete (根据条件删除)
之前在 2.X版本里 这个Delete By Query功能被去掉了 因为官方认为会引发一些错误 如需使用 需要自己安装插件. bin/plugin install delete-by-query 需 ...
- 【VMWare】虚拟机启动遇到黑屏,在命令行窗口输入netsh winsock reset并不管用 重新启动客户机就好了
现象:虚拟机启动后是莫名其妙的黑屏,而且它上面安装的MySql也无法访问了. 处置:上网百度方案,看到大多数网文推荐:“以管理员身份打开cmd,输入netsh winsock reset,然后重启机器 ...
- easyUI之LinkButton(按钮)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- js 操作select和option常见用法
1.获取选中select的value和text,html <select id="mySelect"> <option value="1"&g ...