![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=1739628533-Z07ad9YjNDZmYZ4OFkzr9SwDu1FuPNFD-0-a35894f6ebcb40b4cf26b4d07eb762b9)
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=1739628533-SuIzMlE1YAlCmtvFnUOsVo2PaLJdAAud-0-4321a102760472788fd8e3c97c56d9b6)
【例2-11】 产生大小为2×3的全1矩阵与全0矩阵。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_52_04.jpg?sign=1739628533-DqoaXJ0cVfjhYEQbUhcZSh10GbvsDikf-0-456c25517b4970bed80e0daff74d76c2)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_53_01.jpg?sign=1739628533-Nrf3xtfXOo2JpweI7V5r3DmYAKBC2U9M-0-97bcc52a85e7550d216c9e050d5ae668)
(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=1739628533-KoAQyUGtOtTxPcHkq7dGSgCbbNERgIYJ-0-49b73786201ce8f5b9fa299a29f5ba48)
【例2-12】 利用ones_like函数新建一个类型大小与给定张量一致的全1矩阵。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_53_03.jpg?sign=1739628533-4og1aUAWSjZK6JkDbjDWEtRaP1bg7J8L-0-82f36f882289c15e847d9e80b69fe6ac)
(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=1739628533-7yyvyvY6jVofRvSbVX7wa3rk1U9QPD0M-0-821d6ac03044e4f8fa9b61880f507262)
(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=1739628533-Ljbr3DtqsogRAMFmUj7EoMfR4E2NApw1-0-fb5ba7ebdf70e098f9a5457c5ea896c5)
(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=1739628533-uOGZ0hdVQtDywBFBDX5LxqQti9qBwa0j-0-495f819ffaf0b942c28a762c71f94d54)
【例2-15】 利用random_normal函数生成随机矩阵。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_55_02.jpg?sign=1739628533-iT6zq1PPVV25Dv74Y4mFjI6AFBNB2QEr-0-54bda4cc267f765b838ed3836baa46be)
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=1739628533-zcFpuHTX2PG60I6SuK4YK4azzm5LVOHm-0-4e986cc925b23ae205114dcb3fe78295)
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_56_01.jpg?sign=1739628533-yW3mpBh9fFFFc3IlBcgeAqQ3fQdwqnyO-0-c7e0ef75d047a9a39995031db585bd0f)
(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=1739628533-V2nd1g7Buvt3a65k901CAaCD5lz2OC0w-0-2fa92c830f5251c57060f5944e26094d)
(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=1739628533-KrIKMoZIRZObhYP9hJXlaYV5hYavXoml-0-049d0290315f371ca6be09e58e8a2a6e)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_57_01.jpg?sign=1739628533-obH5kxRH2ZvkWJe62q647CF8tCIGdJJ7-0-9558d8c1e4cb378200a8d41b4070d7ca)
(4)tf.sparse_to_dense
该函数将稀疏矩阵转为密集矩阵。其定义为:
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_57_02.jpg?sign=1739628533-eZodBffqUBtSai5mCCoyig7G4Ims5VK5-0-c3613c39b1454b2f0ae03773a16a057e)
其中,各参数含义为:
● 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=1739628533-RxLVlsVKMS3Beyt6vF5p4nY5bPmM1gpr-0-0bbbb1987d19bde6004e6bc3e3cd0940)
(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=1739628533-55nSTadUoe37K1NvJF5uR7USoju5Dd15-0-d101ffd4b3f8e104c9ba932fb97ceb0b)
(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=1739628533-eHxSJJ8xVml6qRMizlubwr2YRR4RFHT2-0-69c5b86614650186fbd9b3681467b7e6)
(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=1739628533-Pg7RFRJwMWEKhx97jIP7Hz0HbcHjY78D-0-6360c38213857bbacf4ece6fed8ea33d)
可以看到,上面还提供了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=1739628533-nNWDtHenao5ZNtmAODDBKWX7twywKTpj-0-d46b2181167a8f0866832cd65a9b5938)
(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=1739628533-0GMc5fcHUh12nAPk0Apz8TUir2UQEoPu-0-59e18195d55a35a79f4feb1d6cb89310)
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_60_01.jpg?sign=1739628533-nGjvNRePPJe4oaeNXQMzARxOiUFdTMAZ-0-404683d4e89c51e19ff25939a48ff480)