写在前面
最近学习的时候,经常会遇到函数里面的参数附带轴参数(axis),一直分不清axis=0和axis=1,如果再出现一个3维的张量,出现了axis=2,那就更看不懂了,为此就查询了相关的资料,重新理解了轴的相关概念。
二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸。换句话说,第0轴是纵轴,代表往跨行(down),而第1轴是横轴,代表跨列(across)。我们也可以理解为,axis=0表示从上往下这个方向,axis=1表示从左到右这个方向
举例一个简单的2维张量(数组):
tensor = [[4 2 3] [1 6 5]]
或者这样表示
tensor = [[4 2 3]
[1 6 5]]
下面的函数对于轴的用法基本相同,我们以取最大值为例
-
axis为默认值时,即在整个数组中取值最大值,一眼就能看出结果为6.
-
axis为0时,形状为[2, 3]的张量,忽略0轴(将每列看成整体),相当于求每一列取最大值,结果为[4, 6, 5]
-
axis为1时,形状为[2, 3]的张量,忽略1轴(将每行看成整体),相当于求每一行取最大值,结果为[4, 6]
参考了这两篇博客解释,详细解释可以跳转查看:
https://blog.csdn.net/weixin_42133216/article/details/109125110
https://www.jianshu.com/p/de214abd6ee9
写在中间
一、范数
( 1 )简单介绍
什么是范数?范数有哪些分类呢?
范数(norm)是数学中一个重要的概念,用于度量向量、矩阵的大小或长度。通俗的说,向量的范数表示一个向量有多大(大小概念不涉及维度,而是分量的大小)
-
向量的1范数( L 1 L_1 L1):向量各个元素绝对值的和
-
向量的2范数( L 2 L_2 L2):向量各个元素平方和再开根号
( 2 )简单使用
tf.norm(tenosr, ord=2, axis)
-
tensor
: 一个 TensorFlow 张量,可以是一维、二维、三维等高维张量。 -
ord
: 指定计算范数的类型。默认值为ord=2
,表示2范数。可用的选项包括:ord=1
:计算 1范数。ord=2
(默认) -
axis
: 指定沿着哪个轴计算范数。默认值为axis=None
,不是0,表示在所有元素上计算范数。
# 使用 TensorFlow 计算张量的范数
import tensorflow as tf
# 创建一个 2x2 的单位张量
tensor = tf.ones([2, 2])
# 计算张量的 L2 范数
a = tf.norm(tensor)
# 打印 L2 范数
print(a) # 输出:2
tensor = tf.constant([[1, 2], [3, 4]])
# 在第一个维度上计算1范数,上下两行对应元素绝对值相加
a = tf.norm(tensor, ord=1, axis=0)
print(a) # 输出:[4, 6]
# 在第二个维度上计算1范数
a = tf.norm(tensor, ord=1, axis=1)
print(a) # 输出:[3, 7]
二、最值、均值
( 1 )简单介绍
tf.reduce_min()
、tf.reduce_max()
、tf.reduce_mean()
这三个函数为什么都有附带reduce这样的前缀呢,原因就是这些函数在作用过程中会对张量进行降维操作。这三个函数的参数用例基本相同,所以就不再重复叙述。
tf.reduce_min()
是 TensorFlow 中一个用于计算张量中元素最小值的函数。这个函数的参数和作用如下:
-
tensor
: 一个 TensorFlow 张量。这个张量可以是一维、二维或多维的,表示需要计算最小值的张量。 -
axis
: 表示需要在哪个轴上计算最小值。如果不提供此参数,函数将在整个输入张量上计算最小值。
( 2 )代码示例
- 不指定轴的情况
import tensorflow as tf
tensor = tf.random.uniform([3, 3], minval=0, maxval=10, dtype=tf.int32)
print(tensor)
# 输出:
# [[5 9 9]
# [5 1 6]
# [6 6 4]]
a = tf.reduce_min(tensor) # 求整个tensor的最小值,降为0维
print(a) # 输出:1
a = tf.reduce_max(tensor)
print(a) # 输出:9
a = tf.reduce_mean(tensor)
print(a) # 输出:5
- 指定轴的情况
import tensorflow as tf
# 指定轴
tensor = tf.random.uniform([3, 3], minval=0, maxval=10, dtype=tf.int32)
print(tensor)
# 输出:
# [[6 5 5]
# [5 4 4]
# [7 9 7]]
# 在第一个维度上计算,即在[6 5 5], [5 4 4], [7 9 7]中寻找最小值
a = tf.reduce_min(tensor, axis=0)
print(a) # 输出:[5 4 4]
# 求值最大的一行
a = tf.reduce_max(tensor, axis=0)
print(a) # 输出:[7 9 7]
# 求每列中值最小的数字,即在[6 5 5]中求平均值,在[5 4 4]求平均值,在[7 9 7]求平均值,并取整
a = tf.reduce_mean(tensor, axis=1)
print(a) # 输出:[5 4 7]
三、最大值与最小值索引
( 1 )简单介绍
tf.argmax()
和tf.argmin()
,这两个函数的参数用法基本一致,所以我们不再重复列举。
tf.argmax(tensor, axis=None, name=None, output_type=tf.int64)
:
-
tensor
:一个Tensor,可以是一维或多维的张量。 -
axis
:一个整数或一个一维整数张量,表示在哪个轴上寻找最大值。如果为None,则在所有轴上寻找最大值。默认值为None。
( 2 )代码示例
# 3行5列的每个元素在0-20中随机选取,元素是整型
tensor = tf.random.uniform([3, 5], minval=0, maxval=20, dtype=tf.int32)
print(tensor)
# 输出:
# [[18 2 10 6 17]
# [ 7 4 15 3 11]
# [ 7 2 1 18 19]]
# 最大值位置
a = tf.argmax(tensor, axis=0)
print(a) # 输出:[0 1 1 2 2]
# 最小值位置
a = tf.argmin(tensor, axis=1)
print(a) # 输出:[1 3 2]
( 3 )代码解释
对于形状为[3, 5]的张量,tf.argmax(tensor, axis=0)
,即在第一个维度上求最大值,为什么最大值是[18, 4, 15, 18, 19],可以再看看文章开头的解释,代码输出的是每个元素是最大值所在的列索引,即 [0 1 1 2 2]。
对于形状为[3, 5]的张量,tf.argmin(tensor, axis=1)
,即在第二个维度上求最小值,最小值为[2, 3, 1],
上面代码输出的是最小值所在的行索引,即[1 3 2]。
四、求唯一值
( 1 )简单介绍
tf.unique(tensor, axis)
用于从输入张量中找到唯一的元素。
我们着重来学习它的返回值,用低维度的张量更容易理解该函数的用法,先举实例,假设一个一维tensor如下
tensor = [1, 1, 2, 4, 4, 4, 5, 6]
如果我们使用 tf.unique()
函数,并指定 axis = 0
,那么将得到以下输出:
import tensorflow as tf
tensor = tf.constant([7, 1, 2, 1, 4, 4, 4, 5, 6])
unique_elements, unique_indices = tf.unique(tensor)
print(unique_elements) # 输出:[7 1 2 4 5 6]
print(unique_indices) # 输出:[0 1 2 1 3 3 3 4 5]
解释一下这两个返回值是什么意思?
第一个返回值是原张量去除重复数据后所形成的列表,第二个返回值是原张量在新列表中的下标值。
写在最后
👍🏻点赞,你的认可是我创作的动力!
⭐收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!