标量
标量由只有一个元素的张量表示。 下面的代码将实例化两个标量,并执行一些熟悉的算术运算,即加法、乘法、除法和指数。
import tensorflow as tf
x = tf.constant(3.0)
y = tf.constant(2.0)
print(x + y)
print(x * y)
print(x / y)
print(x ** y)
"""
tf.Tensor(5.0, shape=(), dtype=float32)
tf.Tensor(6.0, shape=(), dtype=float32)
tf.Tensor(1.5, shape=(), dtype=float32)
tf.Tensor(9.0, shape=(), dtype=float32)
"""
向量
向量可以被视为标量值组成的列表。 这些标量值被称为向量的元素(element)或分量(component)。 当向量表示数据集中的样本时,它们的值具有一定的现实意义。
import tensorflow as tf
x = tf.range(4)
print(x)
"""
tf.Tensor([0 1 2 3], shape=(4,), dtype=int32)
"""
# 可以通过下标引用向量的任一元素
x[n]
长度、维度和形状
向量只是一个数字数组,就像每个数组都有一个长度一样,每个向量也是如此。
形状(shape)是一个元素组,列出了张量沿每个轴的长度(维数)。 对于只有一个轴的张量,形状只有一个元素。
维度(dimension)这个词在不同上下文时往往会有不同的含义,这经常会使人感到困惑。 为了清楚起见,我们在此明确一下: 向量或轴的维度被用来表示向量或轴的长度,即向量或轴的元素数量。 然而,张量的维度用来表示张量具有的轴数。 在这个意义上,张量的某个轴的维数就是这个轴的长度。
import tensorflow as tf
x = tf.range(4)
print(len(x))
print(x.shape)
"""
4
(4,)
"""
矩阵
正如向量将标量从零阶推广到一阶,矩阵将向量从一阶推广到二阶。 矩阵,我们通常用粗体、大写字母来表示 (例如,X、Y和Z), 在代码中表示为具有两个轴的张量。
import tensorflow as tf
A = tf.reshape(tf.range(20), (5, 4))
print(A)
"""
tf.Tensor(
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]], shape=(5, 4), dtype=int32)
"""
#可以通过下班获取矩阵中的元素
print(A[1][2])
"""
tf.Tensor(6, shape=(), dtype=int32)
"""
# 可以使用transpose进行矩阵转置,改变矩阵的行和列
print(tf.transpose(A))
"""
tf.Tensor(
[[ 0 4 8 12 16]
[ 1 5 9 13 17]
[ 2 6 10 14 18]
[ 3 7 11 15 19]], shape=(4, 5), dtype=int32)
"""
张量
就像向量是标量的推广,矩阵是向量的推广一样,我们可以构建具有更多轴的数据结构。 张量(张量”指代数对象)是描述具有任意数量轴的n维数组的通用方法。
import tensorflow as tf
X = tf.reshape(tf.range(24), (2, 3, 4))
print(X)
"""
tf.Tensor(
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]], shape=(2, 3, 4), dtype=int32)
"""
将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。
import tensorflow as tf
a = 2
X = tf.reshape(tf.range(24), (2, 3, 4))
print(a + X)
print((a * X))
"""
tf.Tensor(
[[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
[[14 15 16 17]
[18 19 20 21]
[22 23 24 25]]], shape=(2, 3, 4), dtype=int32)
tf.Tensor(
[[[ 0 2 4 6]
[ 8 10 12 14]
[16 18 20 22]]
[[24 26 28 30]
[32 34 36 38]
[40 42 44 46]]], shape=(2, 3, 4), dtype=int32)
"""
降维
我们可以对任意张量进行的一个有用的操作是计算其元素的和。
import tensorflow as tf
x = tf.range(4, dtype=tf.float32)
print(x)
print(tf.reduce_sum(x))
"""
tf.Tensor([0. 1. 2. 3.], shape=(4,), dtype=float32)
tf.Tensor(6.0, shape=(), dtype=float32)
"""
默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。 我们还可以指定张量沿哪一个轴来通过求和降低维度。
指定axis=0。 由于输入矩阵沿0轴降维以生成输出向量,因此输入轴0的维数在输出形状中消失。
import tensorflow as tf
A = tf.reshape(tf.range(20, dtype=tf.float32), (5, 4))
A_sum_axis0 = tf.reduce_sum(A, axis=0)
print(A)
print(A_sum_axis0)
print(A_sum_axis0.shape)
"""
tf.Tensor(
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]
[12. 13. 14. 15.]
[16. 17. 18. 19.]], shape=(5, 4), dtype=float32)
tf.Tensor([40. 45. 50. 55.], shape=(4,), dtype=float32)
(4,)
"""
指定axis=1将通过汇总所有列的元素降维(轴1)。因此,输入轴1的维数在输出形状中消失。
import tensorflow as tf
A = tf.reshape(tf.range(20, dtype=tf.float32), (5, 4))
A_sum_axis0 = tf.reduce_sum(A, axis=1)
print(A)
print(A_sum_axis0)
print(A_sum_axis0.shape)
"""
tf.Tensor(
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]
[12. 13. 14. 15.]
[16. 17. 18. 19.]], shape=(5, 4), dtype=float32)
tf.Tensor([ 6. 22. 38. 54. 70.], shape=(5,), dtype=float32)
(5,)
"""
沿着行和列对矩阵求和,等价于对矩阵的所有元素进行求和。
import tensorflow as tf
A = tf.reshape(tf.range(20, dtype=tf.float32), (5, 4))
A_sum_axis = tf.reduce_sum(A, axis=[0, 1]) # 结果和tf.reduce_sum(A)相同
A_sum = tf.reduce_sum(A)
print(A_sum_axis)
print(A_sum)
"""
tf.Tensor(190.0, shape=(), dtype=float32)
"""
非降维求和
在使用函数计算总和时需要保持轴数不变。
import tensorflow as tf
A = tf.reshape(tf.range(20, dtype=tf.float32), (5, 4))
sum_A = tf.reduce_sum(A, axis=1, keepdims=True)
print(A)
print(sum_A)
"""
tf.Tensor(
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]
[12. 13. 14. 15.]
[16. 17. 18. 19.]], shape=(5, 4), dtype=float32)
tf.Tensor(
[[ 6.]
[22.]
[38.]
[54.]
[70.]], shape=(5, 1), dtype=float32)
"""
如果我们想沿某个轴计算A元素的累积总和, 比如axis=0(按行计算),可以调用cumsum函数。 此函数不会沿任何轴降低输入张量的维度。
import tensorflow as tf
A = tf.reshape(tf.range(20, dtype=tf.float32), (5, 4))
print(A)
print(tf.cumsum(A, axis=0))
"""
tf.Tensor(
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]
[12. 13. 14. 15.]
[16. 17. 18. 19.]], shape=(5, 4), dtype=float32)
tf.Tensor(
[[ 0. 1. 2. 3.]
[ 4. 6. 8. 10.]
[12. 15. 18. 21.]
[24. 28. 32. 36.]
[40. 45. 50. 55.]], shape=(5, 4), dtype=float32)
"""