![TensorFlow深度学习从入门到进阶](https://wfqqreader-1252317822.image.myqcloud.com/cover/944/36922944/b_36922944.jpg)
2.5 矩阵的操作
理解TensorFlow如何计算(操作)矩阵,对于理解计算图中数据的流动来说非常重要。
许多机器学习算法依赖矩阵操作。在TensorFlow中,矩阵计算是相当容易的。在下面的所有例子中,我们都会创建一个图会话,代码为:
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_52_02.jpg?sign=1739278029-vEvxI9ddKUhSlqmSiM5PEB4tPMW1sv1L-0-738e8318881c16a970d66bc2fd8f9bc9)
2.5.1 矩阵的生成
这部分主要讲如何生成矩阵,包括全0矩阵、全1矩阵、随机数矩阵和常数矩阵等。
(1)tf.ones|tf.zeros
这两个函数的用法类似,都是产生尺寸为shape的张量,语法格式为:
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_52_03.jpg?sign=1739278029-s3iuBnLV7FVQH2BKktvJimzbxd3qamXM-0-87b29945733ba08559086b4943846b29)
【例2-11】 产生大小为2×3的全1矩阵与全0矩阵。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_52_04.jpg?sign=1739278029-4P0jyiMf2SKF209p1zKPkCyF3TmjJTJM-0-3f04590ac5d08e790a400e58727596ca)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_53_01.jpg?sign=1739278029-48OEOFHmf04jk8ZZH69QnTziP8bj7Gia-0-01c83b7b50249ed818957b35ef154bff)
(2)tf.ones_like|tf.zeros_like
这两个函数用于新建一个与给定的张量类型大小一致的张量,其所有元素为1和 0。语法格式为:
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_53_02.jpg?sign=1739278029-wQ0Ja2v54snFvFIKxMqk5b7zTimN8RDn-0-904ea323c83350facf1f7b23928ccaa9)
【例2-12】 利用ones_like函数新建一个类型大小与给定张量一致的全1矩阵。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_53_03.jpg?sign=1739278029-OK1LRlpRQHxCRI4B5XNF2vS53e5AABrk-0-c10e8ba3dc7d69c5da1ad6cba2350a70)
(3)tf.fill
该函数用于创建一个形状大小为shape的张量,其初始值为value。语法格式为:
tf.fill(shape,value,name=None)
【例2-13】 利用fill函数创建一个形状为shape的矩阵。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_54_01.jpg?sign=1739278029-A2gy897nB9TpbQFFORf563lupnJmR0mh-0-c421862a5dcec8f759ed54a5085cd2e2)
(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函数创建常数矩阵。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_54_02.jpg?sign=1739278029-ChFU8qwfFKewEeWuP1v6pNchLb9RADD0-0-a9aaa5da48e8b5082b925a08dd733329)
(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]。它们的语法格式为:
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_55_01.jpg?sign=1739278029-bURUgiZjVF8C6ZtYAbKkuwPdQW4uzEow-0-93f4d1cec42eb3433429e16373418e6f)
【例2-15】 利用random_normal函数生成随机矩阵。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_55_02.jpg?sign=1739278029-hvgpzkb1ndDcGWxI0Htn7TdivITLo0Ku-0-fec8f2f3b0317076bd8f0d5121207525)
2.5.2 矩阵的变换
TensorFlow中也提供了相关函数用于实现矩阵的变换,下面分别给予介绍。
(1)tf.shape
该函数用于返回张量的形状。但要注意,tf.shape 函数本身也是返回一个张量。而在TensorFlow中,张量是需要用sess.run(Tensor)来得到具体的值的。语法格式为:
tf.shape(Tensor)
【例2-16】 用shape函数返回矩阵的形状。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_55_03.jpg?sign=1739278029-bN50J3bIY5l0Sb9wu4PuTjJ4XXPVIQEQ-0-170e02f06356bc545b83d151f0d4b55e)
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_56_01.jpg?sign=1739278029-ZC0M32Mq6GCQWOb8NmeNmH1NF1ZZJmvz-0-9a7a765d27cbf64b7478dd2b7d6c0d0f)
(2)tf.expand_dims
该函数用于为张量增加一维。语法格式为:
tf.expand_dims(Tensor,dim)
【例2-17】 用expand_dims函数为给定矩阵增加一维。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_56_02.jpg?sign=1739278029-ljSsijFA8uDPfdzVkFFBxoeDFCyOlpp4-0-78a6c72ddeeba050d1b73ca5dd8fcd25)
(3)tf.concat
该函数将张量沿着指定维数拼接起来。语法格式为:
tf.concat(concat_dim,values,name="concat")
【例2-18】 利用concat函数将给定的矩阵进行拼接。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_56_03.jpg?sign=1739278029-NX1D6Rg73l34707Y214fwJbBfQfTqSDv-0-e30d2b83944fe4a4f34af66a3bfb4758)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_57_01.jpg?sign=1739278029-rMGGEu80Px8UtL8ewa7VgdGDJywpSxKJ-0-577d369a5c61bf3353efeda779c3e8df)
(4)tf.sparse_to_dense
该函数将稀疏矩阵转为密集矩阵。其定义为:
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_57_02.jpg?sign=1739278029-Rpk5Ggek0lw5ICFq9oegrtKSHbpHgy47-0-a4015256493e43f774294098dcb15537)
其中,各参数含义为:
● 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函数对给定的矩阵进行重新排列。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_57_03.jpg?sign=1739278029-B15NhO9X5TCgq1F8iDF3klxsE9ib7Spx-0-4d69c6e09afaf54aede82dfb80f22ea0)
(6)tf.argmax|tf.argmin
该函数找到给定的张量,并在其中指定轴axis上的最大值/最小值的位置。语法格式为:
tf.argmax(input=tensor,dimention=axis)
【例2-20】 利用argmax函数,寻找给定矩阵在指定轴axis的最大值。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_58_01.jpg?sign=1739278029-w5LR0qc0idw7NBf7XKHXtdbExqhqxwto-0-5fa6dbce19845b3e16cc480065c1979d)
(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类型。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_58_02.jpg?sign=1739278029-tTaNgzdt5aykAbsKld3toMIJ79L8eAOX-0-92a5c909c28d6a367d15c8df0e2686a7)
(9)tf.matmul
该函数用来做矩阵乘法。若a为l×m的矩阵,b为m×n的矩阵,那么通过tf.matmul(a,b)结果就会得到一个l×n的矩阵。不过这个函数还提供了很多额外的功能。我们来看函数的定义:
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_59_01.jpg?sign=1739278029-1IdcDaguRIoBycVYGo8IbWDz2ZaHeDFP-0-7ae753d7f66a59476fef032fe1de9b57)
可以看到,上面还提供了transpose和is_sparse的选项。
如果对应的transpose项为True,如transpose_a=True,那么a在参与运算之前就会先转置一下。而如果a_is_sparse=True,那么a会被当作稀疏矩阵来参与运算。
【例2-22】 对两矩阵进行相乘操作。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_59_02.jpg?sign=1739278029-n6QKivriAtALWZfc9FI7sWYlI4xy5GjB-0-fed1fe81ce9b8dff53dc2dec84b1c133)
(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函数对矩阵进行新的形状重新排列。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_59_03.jpg?sign=1739278029-Okxvo6H9QifoTrsZ31dbo7SBE7JVd70j-0-aeb0786bf630803915e02360fc89d332)
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_60_01.jpg?sign=1739278029-SQdmLFc1nFcyRg0e4xZKBr1epvcW45m3-0-08d16f6f38ea95c6945047582936630b)