⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/
TensorFlow进阶一(张量的范数、最值、均值、和函数、张量的比较)
- TensorFlow进阶一
- 一、任务需求
- 二、任务目标
- 1、掌握张量的合并
- 2、掌握张量的分割
- 3、掌握张量的最值、均值、和函数
- 4、掌握张量的比较
- 三、任务环境
- 1、python3.6
- 2、tensorflow2.4
- 3、jupyter
- 四、任务实施过程
- (三)、向量范数
- (四)、最值、均值、和
- (五)、张量比较
- 五、任务小结
TensorFlow进阶一
一、任务需求
在介绍完张量的基本操作后,我们来进一步学习张量的进阶操作,如张量的合并与分割、范数统计、张量填充、张量限幅等,本节需要完成张量的合并(包括拼接和堆叠),张量的分割、向量范数、最值、均值、和,张量的比较等功能。
二、任务目标
1、掌握张量的合并
2、掌握张量的分割
3、掌握张量的最值、均值、和函数
4、掌握张量的比较
三、任务环境
1、python3.6
2、tensorflow2.4
3、jupyter
四、任务实施过程
(三)、向量范数
12、在 TensorFlow 中,可以通过 tf.norm(x, ord)求解张量的 L1、L2、∞等范数,其中参数ord 指定为 1、2 时计算 L1、L2 范数,指定为 np.inf 时计算∞ −范数
x = tf.ones([2,2])
tf.norm(x,ord=1) #计算L1范数
tf.norm(x,ord=2) #计算L2范数
<tf.Tensor: shape=(), dtype=float32, numpy=2.0>
import numpy as np
tf.norm(x,ord=np.inf) # 计算∞范数
(四)、最值、均值、和
13、考虑 shape 为[4,10]的张量,其中,第一个维度代表样本数量,第二个维度代表了当前样本分别属于10个类别的概率,需要求出每个样本的概率最大值,可以通过tf.reduce_max 函数实现
x = tf.random.normal([4,10]) # 模型生成概率
tf.reduce_max(x,axis=1) # 统计概率维度上的最大值
<tf.Tensor: shape=(4,), dtype=float32, numpy=array([1.8075018, 1.8042752, 1.0641811, 1.9087783], dtype=float32)>
14、返回长度为 4 的向量,分别代表了每个样本的最大概率值。同样求出每个样本概率的最小值
tf.reduce_min(x,axis=1)
<tf.Tensor: shape=(4,), dtype=float32, numpy=array([-0.4287228, -0.5215661, -1.9173664, -1.5540869], dtype=float32)>
15、求出每个样本的概率的均值
tf.reduce_mean(x,axis=1)
<tf.Tensor: shape=(4,), dtype=float32, numpy=array([ 0.4275422 , 0.2606017 , -0.19171332, 0.38828874], dtype=float32)>
16、当不指定 axis 参数时,tf.reduce_*函数会求解出全局元素的最大、最小、均值、和等数据。
x = tf.random.normal([4,10])
tf.reduce_max(x),tf.reduce_min(x),tf.reduce_mean(x)
17、在求解误差函数时,通过 TensorFlow 的 MSE 误差函数可以求得每个样本的误差,需要计算样本的平均误差,此时可以通过 tf.reduce_mean 在样本数维度上计算均值
out = tf.random.normal([4,10]) # 模拟网络预测输出
y = tf.constant([1,2,2,0]) # 模拟真实标签
y = tf.one_hot(y,depth=10) # one-hot 编码
loss = tf.keras.losses.mse(y,out) # 计算每个样本的误差
loss = tf.reduce_mean(loss) # 平均误差,在样本数维度上取均值
loss # 误差标量
18、与均值函数相似的是求和函数 tf.reduce_sum(x, axis),它可以求解张量在 axis 轴上所有特征的和:
out = tf.random.normal([4,10])
tf.reduce_sum(out,axis=-1) # 求最后一个维度的和
<tf.Tensor: shape=(4,), dtype=float32, numpy=array([ 1.0680336, 1.31221 , 4.050804 , -1.6357648], dtype=float32)>
19、除了希望获取张量的最值信息,还希望获得最值所在的位置索引号,例如分类任务的标签预测,就需要知道概率最大值所在的位置索引号,一般把这个位置索引号作为预测类别。考虑 10 分类问题,我们得到神经网络的输出张量 out,shape 为[2,10],代表了 2 个样本属于 10 个类别的概率,由于元素的位置索引代表了当前样本属于此类别的概率,预测时往往会选择概率值最大的元素所在的索引号作为样本类别的预测值。
out = tf.random.normal([2,10])
out = tf.nn.softmax(out, axis=1) # 通过 softmax 函数转换为概率值
out
以第一个样本为例,可以看到,它概率最大的索引为𝑖 = 0,最大概率值为 0.1877。由于每个索引号上的概率值代表了样本属于此索引号的类别的概率,因此第一个样本属于 0 类的概率最大,在预测时考虑第一个样本应该最有可能属于类别 0。这就是需要求解最大值的索引号的一个典型应用
20、通过 tf.argmax(x, axis)和 tf.argmin(x, axis)可以求解在 axis 轴上,x 的最大值、最小值所在的索引号
pred = tf.argmax(out, axis=1) # 选取概率最大的位置
<tf.Tensor: shape=(2,), dtype=int64, numpy=array([0, 7])>
可以看到,这 2 个样本概率最大值都出现在索引 0 上,因此最有可能都是类别 0,我们可以将类别 0 作为这 2 个样本的预测类别。
(五)、张量比较
21、为了计算分类任务的准确率等指标,一般需要将预测结果和真实标签比较,统计比较结果中正确的数量来计算准确率。考虑 100 个样本的预测结果,通过 tf.argmax 获取预测类别
out = tf.random.normal([100,10])
out = tf.nn.softmax(out, axis=1) # 输出转换为概率
pred = tf.argmax(out, axis=1) # 计算预测值
pred
22、变量 pred 保存了这 100 个样本的预测类别值,我们与这 100 样本的真实标签比较
y = tf.random.uniform([100],dtype=tf.int64,maxval=10)
y
<tf.Tensor: shape=(100,), dtype=int64, numpy=
array([1, 3, 7, 0, 0, 2, 9, 6, 0, 3, 3, 4, 7, 8, 8, 3, 2, 9, 6, 0, 1, 6,
8, 6, 1, 1, 2, 4, 7, 4, 9, 9, 7, 5, 6, 5, 4, 9, 2, 6, 0, 4, 3, 2,
9, 0, 5, 8, 3, 3, 4, 4, 0, 3, 0, 4, 8, 4, 7, 9, 3, 6, 1, 4, 2, 5,
1, 9, 9, 1, 1, 2, 7, 8, 9, 0, 7, 6, 1, 1, 2, 8, 1, 2, 6, 0, 8, 2,
6, 1, 5, 8, 3, 0, 9, 0, 2, 3, 3, 5])>
23、即可获得代表每个样本是否预测正确的布尔类型张量。通过 tf.equal(a, b)(或 tf.math.equal(a,b),两者等价)函数可以比较这 2 个张量是否相等
out = tf.equal(pred,y) # 预测值与真实值比较,返回布尔类型的张量
out
<tf.Tensor: shape=(100,), dtype=bool, numpy=
array([False, False, False, True, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, True, False, False, False, False, False,
False, False, False, True, False, False, False, False, False,
False, False, False, False, False, True, True, False, False,
True, False, False, False, False, False, False, False, True,
False, False, False, False, False, True, False, False, False,
False, False, False, False, False, False, False, False, True,
False, False, False, False, False, False, False, False, False,
False, False, False, False, True, False, False, False, False,
False])>
24、tf.equal()函数返回布尔类型的张量比较结果,只需要统计张量中 True 元素的个数,即可知道预测正确的个数。为了达到这个目的,我们先将布尔类型转换为整形张量,即 True 对应
为 1,False 对应为 0,再求和其中 1 的个数,就可以得到比较结果中 True 元素的个数
out = tf.cast(out, dtype=tf.float32) # 布尔型转 int 型
correct = tf.reduce_sum(out) # 统计 True 的个数
correct
五、任务小结
本节主要介绍了将多个张量在某个维度上合并为一个张量,张量的合并可以使用拼接(Concatenate)和堆叠(Stack)操作实现,拼接操作并不会产生新的维度,仅在现有的维度上合并,而堆叠会创建新维度。选择使用拼接还是堆叠操作来合并张量,取决于具体的场景是否需要创建新维度。合并操作的逆过程就是分割,将一个张量分拆为多个张量。在神经网络的计算过程中,经常需要统计数据的各种属性,如最值、最值位置、均值、范数等信息。由于张量通常较大,直接观察数据很难获得有用信息,通过获取这些张量的统计信息可以较轻松地推测张量数值的分布。为了计算分类任务的准确率等指标,一般需要将预测结果和真实标签比较,统计比较结果中正确的数量来计算准确率。通过本节需要掌握以下知识:
- 掌握张量的合并
- 掌握张量的分割
- 掌握张量的最值、均值、和函数
- 掌握张量的比较
–end–