2.5 矩阵的操作

理解TensorFlow如何计算(操作)矩阵,对于理解计算图中数据的流动来说非常重要。

许多机器学习算法依赖矩阵操作。在TensorFlow中,矩阵计算是相当容易的。在下面的所有例子中,我们都会创建一个图会话,代码为:

2.5.1 矩阵的生成

这部分主要讲如何生成矩阵,包括全0矩阵、全1矩阵、随机数矩阵和常数矩阵等。

(1)tf.ones|tf.zeros

这两个函数的用法类似,都是产生尺寸为shape的张量,语法格式为:

【例2-11】 产生大小为2×3的全1矩阵与全0矩阵。

运行程序,输出如下:

(2)tf.ones_like|tf.zeros_like

这两个函数用于新建一个与给定的张量类型大小一致的张量,其所有元素为1和 0。语法格式为:

【例2-12】 利用ones_like函数新建一个类型大小与给定张量一致的全1矩阵。

(3)tf.fill

该函数用于创建一个形状大小为shape的张量,其初始值为value。语法格式为:

tf.fill(shape,value,name=None)

【例2-13】 利用fill函数创建一个形状为shape的矩阵。

(4)tf.constant

该函数用于创建一个常量张量,按照给出value来赋值,可以用shape来指定其形状。value可以是一个数,也可以是一个list。

如果是一个数,那么这个常量中的所有值按该数来赋值;如果是 list,那么 len(value)一定要小于等于shape展开后的长度。赋值时,先将value中的值逐个存入。不够的部分全部存入value的最后一个值。

函数的语法格式为:

tf.constant(value,dtype=None,shape=None,name='Const')

【例2-14】 利用constant函数创建常数矩阵。

(5)tf.random_normal|tf.truncated_normal|tf.random_uniform

这几个都是用于生成随机数张量的,尺寸是shape。

● random_normal:正太分布随机数、均值mean、标准差stddev。

● truncated_normal:截断正态分布随机数、均值 mean、标准差 stddev,不过只保留[mean-2*stddev,mean+2*stddev]范围内的随机数。

● random_uniform:均匀分布随机数,范围为[minval,maxval]。它们的语法格式为:

【例2-15】 利用random_normal函数生成随机矩阵。

2.5.2 矩阵的变换

TensorFlow中也提供了相关函数用于实现矩阵的变换,下面分别给予介绍。

(1)tf.shape

该函数用于返回张量的形状。但要注意,tf.shape 函数本身也是返回一个张量。而在TensorFlow中,张量是需要用sess.run(Tensor)来得到具体的值的。语法格式为:

tf.shape(Tensor)

【例2-16】 用shape函数返回矩阵的形状。

(2)tf.expand_dims

该函数用于为张量增加一维。语法格式为:

tf.expand_dims(Tensor,dim)

【例2-17】 用expand_dims函数为给定矩阵增加一维。

(3)tf.concat

该函数将张量沿着指定维数拼接起来。语法格式为:

tf.concat(concat_dim,values,name="concat")

【例2-18】 利用concat函数将给定的矩阵进行拼接。

运行程序,输出如下:

(4)tf.sparse_to_dense

该函数将稀疏矩阵转为密集矩阵。其定义为:

其中,各参数含义为:

● sparse_indices:元素的坐标[[0,0],[1,2]]表示(0,0)和(1,2)处有值。

● output_shape:得到的密集矩阵的shape。

● sparse_values:sparse_indices坐标表示的点的值,可以是0D或者1D张量。若是0D,则所有稀疏值都一样。若是1D,则len(sparse_values)应该等于len(sparse_indices)。

● default_values:默认点的默认值。

(5)tf.random_shuffle

该函数将沿着value的第一维进行随机重新排列。语法格式为:

tf.random_shuffle(value,seed=None,name=None)

【例2-19】 利用random_shuffle函数对给定的矩阵进行重新排列。

(6)tf.argmax|tf.argmin

该函数找到给定的张量,并在其中指定轴axis上的最大值/最小值的位置。语法格式为:

tf.argmax(input=tensor,dimention=axis)

【例2-20】 利用argmax函数,寻找给定矩阵在指定轴axis的最大值。

(7)tf.equal

该函数用于判断两个张量是否每个元素都相等。返回一个格式为bool的张量。语法格式为:

tf.equal(x,y,name=None):

(8)tf.cast

该函数将x的数据格式转化成dtype。例如,原来x的数据格式是bool,那么将其转化成float以后,就能够将其转化成0和1的序列,反之也可以。语法格式为:

cast(x,dtype,name=None)

【例2-21】 将给定的float数值转化为Bool类型。

(9)tf.matmul

该函数用来做矩阵乘法。若a为l×m的矩阵,bm×n的矩阵,那么通过tf.matmul(a,b)结果就会得到一个l×n的矩阵。不过这个函数还提供了很多额外的功能。我们来看函数的定义:

可以看到,上面还提供了transpose和is_sparse的选项。

如果对应的transpose项为True,如transpose_a=True,那么a在参与运算之前就会先转置一下。而如果a_is_sparse=True,那么a会被当作稀疏矩阵来参与运算。

【例2-22】 对两矩阵进行相乘操作。

(10)tf.reshape

意为就是将张量按照新的shape重新排列。一般来说,shape有3种用法:

● 如果shape=[-1],表示要将张量展开成一个list。

● 如果shape=[a,b,c,…],其中每个a,b,c,…均>0,那么就是常规用法。

● 如果shape=[a,-1,c,…],此时b=-1,a,c,…依然>0。这表示TensorFlow会根据张量的原尺寸自动计算b的值。

函数的语法格式为:

reshape(tensor,shape,name=None)

【例2-23】 利用reshape函数对矩阵进行新的形状重新排列。