Dive-into-DL-TensorFlow2.0(Tensorflow基本操作)

冯宏恺
2023-12-01

1.创建张量

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]])>)
 类似资料: