淘先锋技术网

首页 1 2 3 4 5 6 7

写在前面

最近学习的时候,经常会遇到函数里面的参数附带轴参数(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 )代码示例

  1. 不指定轴的情况
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
  1. 指定轴的情况
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]

解释一下这两个返回值是什么意思?

第一个返回值是原张量去除重复数据后所形成的列表,第二个返回值是原张量在新列表中的下标值。


写在最后

👍🏻点赞,你的认可是我创作的动力!
⭐收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!