深度学习(13)TensorFlow高阶操作二: 数据统计


Outline

  • tf.norm(范数)
  • tf.reduce_min/max(最大值/最小值)
  • tf.argmax/argmin(最大值/最小值的位置)
  • tf.equal(两个张量的比较)
  • tf.unique(独特值)

一. tf.norm

1. 范数定义

Vector Norm
E u k l . N o r m ∥ x ∥ 2 = [ ∑ k x k 2 ] 1 / 2 Eukl.Norm\quad \Vert x\Vert_2=[∑_kx_k^2 ]^{1/2} Eukl.Normx2=[kxk2]1/2
M a x . N o r m ∥ x ∥ ∞ = m a x k ∣ x k ∣ Max.Norm\quad \Vert x\Vert_∞=max_k |x_k | Max.Normx=maxkxk
L 1 − N o r m ∥ x ∥ 1 = ∑ k ∣ x k ∣ L_1-Norm \quad \Vert x\Vert_1=∑_k|x_k | L1Normx1=kxk

2. tf.norm(二范数)

如果不指定tf.norm()中的参数ord,那么默认为求二范数
E u k l . N o r m ∥ x ∥ 2 = [ ∑ k x k 2 ] 1 / 2 Eukl.Norm\quad \Vert x\Vert_2=[∑_kx_k^2 ]^{1/2} Eukl.Normx2=[kxk2]1/2

  • Here talks about Vector Norm

注: 这里只讨论向量的范数,不讨论矩阵的范数。
在这里插入图片描述

(1) a = tf.ones([2, 2]): 创建一个2×2元素值都为1的Tensor;
(2) tf.norm(a) :求解a的二范数,即:
( 1 2 + 1 2 + 1 2 + 1 2 ) = 4 = 2 \sqrt{(1^2+1^2+1^2+1^2 )}=\sqrt4=2 (12+12+12+12) =4 =2
(3) tf.squrt(tf.reduce_sum(tf.square(a))): 验证tf.norm(a)的正确性,其作用与tf.norm(a)一样;

3. L1 Norm(一范数)

L 1 − N o r m ∥ x ∥ 1 = ∑ k ∣ x k ∣ L_1-Norm \quad \Vert x\Vert_1=∑_k|x_k | L1Normx1=kxk
在这里插入图片描述

(1) tf.norm(b): 求b的二范数,即:
1 2 + 1 2 + 1 2 + 1 2 = 4 = 2 \sqrt{1^2+1^2+1^2+1^2}=\sqrt4=2 12+12+12+12 =4 =2
(2) tf.norm(b, ord=2, axis=1): ord=2表示求b的二范数,axis=1表示求b中第2个维度的二范数,即:
1 2 + 1 2 = 2 ≈ 1.4142135 \sqrt{1^2+1^2}=\sqrt2≈1.4142135 12+12 =2 1.4142135
共有2个这样的维度,所以得到一个Tensor(Vector)为: [ 1 , 4142135 , 1.4142135 ] [1,4142135, 1.4142135] [1,4142135,1.4142135];
(3) tf.norm(b, ord=1): ord=1表示求b的一范数,即:
∣ 1 ∣ + ∣ 1 ∣ + ∣ 1 ∣ + ∣ 1 ∣ = 4 |1|+|1|+|1|+|1|=4 1+1+1+1=4
(4) tf.norm(b, ord=1, axis=0): ord=1表示求b的一范数,axis=0表示求b中第1个维度的二范数,即:
∣ 1 ∣ + ∣ 1 ∣ = 2 |1|+|1|=2 1+1=2
共有2个这样的维度,所以得到一个Tensor(Vector)为: [2., 2.];
(5) tf.norm(b, ord=1, axis=1): ord=1表示求b的一范数,axis=1表示求b中第2个维度的二范数,即:
∣ 1 ∣ + ∣ 1 ∣ = 2 |1|+|1|=2 1+1=2
共有2个这样的维度,所以得到一个Tensor(Vector)为: [2., 2.];

二. reduce_min/max/mean

例如:
[ 1 2 3 4 ] \begin{bmatrix}1&2\\3&4\end{bmatrix} [1324]
reduce_min()操作就是选取第1行中的最小值1,再选取第2行中的最小值3,就变为:
[ 1 3 ] \begin{bmatrix}1\\3\end{bmatrix} [13]
reduce_max()reduce_mean()操作同理。可以看到reduce操作是一个减维的过程,shape由[2, 2]变为了[2];
在这里插入图片描述

(1) 不指定axis参数,默认求解整个a的reduce_min/max/mean;
(2) 指定axis参数,则求解该维度下的reduce_min/max/mean;

三. argmax/argmin

例如,有矩阵:
[ 1 3 5 2 ] \begin{bmatrix}1&3&5&2\end{bmatrix} [1352]
tf.argmax()就是取最大值5所在的位置,也就是2,所以argmax=[2]; tf.argmax().shape=[1];
如果有矩阵:
[ 1 3 5 2 4 3 7 0 ] \begin{bmatrix}1&3&5&2\\4&3&7&0\end{bmatrix} [14335720]
tf.argmax()就是取第一行最大值5所在的位置,也就是2; 再取第一行最大值7所在的位置,也就是2; 所以argmax=[2, 2]; tf.argmax().shape=[2];
tf.argmin()同理。
在这里插入图片描述

(1) tf.argmax(a).shape: 如果没有指定axis,那么默认取第1个维度,共有10个4行,也就是说,取这10个4行中每一行的最大值的所在位置,所以其shape=[10];
(2) tf.argmax(a): 取这10个4行中每一行的最大值的所在位置
(3) tf.argmin(a): 取这10个4行中每一行的最小值的所在位置,所以其shape=[10];
注: argmax/argmin返回的是一个index,所以其数据类型为int64。

四. tf.equal

1. tf.equal定义及用法

在这里插入图片描述

(1) tf.equal(a, b): 将a和b的元素值作比较,一样就为True,不一样就为False。所以tf.equal(a, b)=[False, False, False, False, False];
(2) tf.reduce_sum(tf.cast(res, dtype=tf.int32)): cast(res, dtype=tf.int32)表示先将res中的数据类型转换为tf.int32,也就是说,Ture转换为1,False转换为0,即得到一个 [0, 0, 0, 0, 0] 的Tensor; 再利用tf.reduce_sum()函数计算累加和,即 0 + 0 + 0 + 0 + 0 = 0 0 + 0 + 0 + 0 + 0 = 0 0+0+0+0+0=0; 这个值代表了a和b之间相同元素值的个数,通常用于求解正确率,例如pred(预测值)和label(标签值)之间相同元素的个数,再除以总数据量,就为正确率。

2. 求解正确率实例

Accuracy
在这里插入图片描述

(1) a = [[0.1, 0.2, 0.7], [0.9, 0.05, 0.05]]: 可以理解为第1个数字为“0”的概率为0.1,为“1”的概率为0.2,为“2”的概率为0.7; 第2个数字为“0”的概率为0.9,为“1”的概率为0.05,为“2”的概率为0.05;
(2) pred = tf.cast(tf.argmax(a, axis=1), dtype=tf.int32): tf.argmax(a, axis=1)表示求出a中第2个维度,即一共有2个3列,求每个3列的最大值的所在位置,得到一个index,第1个3列最大值0.7的所在位置是2,第2个3列最大值0.9的所在位置是0,所以index=[2, 0],数据类型为in64; 再利用tf.cast()函数将这个index转换为tf.int32的数据类型;
(3) y为每个元素的label值,y=[2, 1]代表第1个数字的标签值为2,第2个数字的标签值为1;
(4) tf.equal(y, pred): 利用equal()函数计算标签值y与预测值pred之间的不同的元素,得到一个Tensor: [True, False];
(5) correct = tf.reduce_sum(tf.cast(tf.equal(y, pred), dtype=tf.int32)): tf.cast(tf.equal(y, pred), dtype=tf.int32)表示将[True, False]转换为[1, 0]; 再利用tf.reduce_sum()函数计算pred(预测值)和label(标签值)之间相同元素的个数,correct=1表示只有1个元素是相同的,也就是说pred(预测值)和label(标签值)之间只有1个数字对上号了;
(6) correct/2: correct除以数据总量2为计算正确率,correct/2=0.5表示正确率为50%。

五. tf.unique

tf.unique()的作用是去除重复的元素。
在这里插入图片描述

(1) a = [0, 1, 2, 3, 4]
tf.unique(a): 可以理解为首先建立一张没有重复元素的表单[0, 1, 2, 3, 4],然后建立对应的索引[0, 1, 2, 3, 4],最后将a中的元素按照新建表单(即没有重复元素的表单)的索引排列,即为[0, 1, 2, 3, 4];
(2) a = [4, 2, 2, 4, 3]
tf.unique(a): 可以理解为首先建立一张没有重复元素的表单[4, 2, 3],然后建立对应的索引[0, 1, 2],最后将a中的元素按照新建表单(即没有重复元素的表单)的索引排列,即为[0, 1, 1, 0, 2];

注: 这个操作是可以还原的,通过tf.gather(unique, idx)来返回原来的Tensor,其中unique为[4, 2, 3],idx为[0, 1, 1, 0, 2],最终得到[4, 2, 2, 4, 3]。

参考文献:
[1] 龙良曲:《深度学习与TensorFlow2入门实战》

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值