TensorFlow 的张量在概念上等同于多维数组,我们可以使用它来描述数学中的标量(0 维数组)、向量(1 维数组)、矩阵(2 维数组)等各种量,示例如下:
首先导入tensorflow
import tensorflow as tf
print(tf.__version__)
输出
2.3.0
定义一个随机数(标量)
random_float = tf.random.uniform(shape=())
random_float
<tf.Tensor: shape=(), dtype=float32, numpy=0.7054082>
定义一个有2个元素的零向量
zero_vector = tf.zeros(shape=(2))
zero_vector
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([0., 0.], dtype=float32)>
定义一个2×2的常量矩阵
A = tf.constant([[1., 2.], [3., 4.]])
A
<tf.Tensor: shape=(2, 2), dtype=float32, numpy=
array([[1., 2.],
[3., 4.]], dtype=float32)>
我们创建一个各元素为1,形状为(2, 3, 4)的张量
tf.ones((2,3,4))
<tf.Tensor: shape=(2, 3, 4), dtype=float32, numpy=
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]], dtype=float32)>
我们用arange函数创建一个行向量。
x = tf.constant(range(12))
print(x.shape)
(12,)
x
<tf.Tensor: id=0, shape=(12,), dtype=int32, numpy=array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])>
这时返回了一个tensor实例,其中包含了从0开始的12个连续整数。我们可以通过shape属性来获取tensor实列的形状
x.shape
TensorShape([12])
还可以通过len得到tensor实列中元素的总数
len(x)
12
我们可以通过reshape函数把行向量x的形状改为(3,4)。除了形状改变之外,x的元素保持不变。
X = tf.reshape(x,(3,4))
X
<tf.Tensor: shape=(3, 4), dtype=int32, numpy=
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])>
tensor支持大量的运算符(operator)。例如,我们可以对之两个形状为(3, 4)的tensor做按元素加法
X = tf.reshape(tf.constant(range(12)),(3,4))
X
<tf.Tensor: shape=(3, 4), dtype=int32, numpy=
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])>
Y = tf.constant([[2,1,4,3],[1,2,3,4],[4,3,2,1]])
Y
<tf.Tensor: shape=(3, 4), dtype=int32, numpy=
array([[2, 1, 4, 3],
[1, 2, 3, 4],
[4, 3, 2, 1]])>
X + Y
<tf.Tensor: shape=(3, 4), dtype=int32, numpy=
array([[ 2, 2, 6, 6],
[ 5, 7, 9, 11],
[12, 12, 12, 12]])>
按元素乘法
X * Y
<tf.Tensor: shape=(3, 4), dtype=int32, numpy=
array([[ 0, 1, 8, 9],
[ 4, 10, 18, 28],
[32, 27, 20, 11]])>
按元素除法
X / Y
<tf.Tensor: shape=(3, 4), dtype=float64, numpy=
array([[ 0. , 1. , 0.5 , 1. ],
[ 4. , 2.5 , 2. , 1.75],
[ 2. , 3. , 5. , 11. ]])>
指数运算
Y = tf.cast(Y, tf.float32) #将Y的数据类型转换为float32
tf.exp(Y)
<tf.Tensor: shape=(3, 4), dtype=float32, numpy=
array([[ 7.389056 , 2.7182817, 54.598152 , 20.085537 ],
[ 2.7182817, 7.389056 , 20.085537 , 54.598152 ],
[54.59815 , 20.085537 , 7.389056 , 2.7182817]], dtype=float32)>
除了按元素计算外,我们还可以使用matmul函数做矩阵乘法。下面将X与Y的转置做矩阵乘法。由于X是3行4列的矩阵,Y转置为4行3列的矩阵,因此两个矩阵相乘得到3行3列的矩阵。
Y = tf.cast(Y, tf.int32)
tf.matmul(X, tf.transpose(Y))
<tf.Tensor: shape=(3, 3), dtype=int32, numpy=
array([[ 18, 20, 10],
[ 58, 60, 50],
[ 98, 100, 90]])>
同时还可以将多个tensor进行连接 axis = 0代表在行方向上,axis = 1代表在列方向上
tf.concat([X,Y],axis=0),tf.concat([X,Y],axis=1)
(<tf.Tensor: shape=(6, 4), dtype=int32, numpy=
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[ 2, 1, 4, 3],
[ 1, 2, 3, 4],
[ 4, 3, 2, 1]])>,
<tf.Tensor: shape=(3, 8), dtype=int32, numpy=
array([[ 0, 1, 2, 3, 2, 1, 4, 3],
[ 4, 5, 6, 7, 1, 2, 3, 4],
[ 8, 9, 10, 11, 4, 3, 2, 1]])>)