![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=1739679061-BZJstoldJ8SXPJw4kSjc6WH6wUDOJvDP-0-e098ce90acdc5fb8090acdf76ca9fd00)
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=1739679061-qpTnrFBWfc4IQlulBuYOCZ8p7MJoKMkq-0-6387c14f28c8a8e802b7e1906dca2cb6)
【例2-11】 产生大小为2×3的全1矩阵与全0矩阵。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_52_04.jpg?sign=1739679061-HzOTMaEuD5Rd2t8m5PsV3Zh44rOVw6n0-0-381d7aab129a07550197d8b9afd100a5)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_53_01.jpg?sign=1739679061-o97Wlle524ZBI4t7O8YnuBFLCAsKB1Lx-0-2ee2833ad6e689e139af4a33846aaa34)
(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=1739679061-jvK5FJ3lQrzkHQ2eBgqdQPbqcEuFDp48-0-bbff9ad9e4e4039760e0143ace359a4a)
【例2-12】 利用ones_like函数新建一个类型大小与给定张量一致的全1矩阵。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_53_03.jpg?sign=1739679061-SFDK8lw9LNgsBZ3zyjWDRKqUUQR01hB0-0-904cb694e9277617fb1f53c91b765d2b)
(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=1739679061-nxwoMPxktgjbjEc7jvO6mldLr7Vs40GN-0-7abe763eae71f31788b424e4dcc32ca3)
(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=1739679061-z2KIjveuxxGg6a7106MYe1bXH670D2xx-0-0b90ff6af3766e5133dbc2b1a99d2847)
(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=1739679061-reudnf4BVzSox4IDzejik7KA5NXEV1aa-0-12b3b81376127f629eb1ba2f49404663)
【例2-15】 利用random_normal函数生成随机矩阵。
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_55_02.jpg?sign=1739679061-I0kaeUgWeXPUEV6QBP70nmqVLnmZjeUs-0-191e67197adff5d5b74d71ceb5c1b403)
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=1739679061-sOoHPAOt8jsJd0LrjxTR4LsI2e1GOzZQ-0-e8e8e84d81fb32eda9b07f3de3ffce8e)
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_56_01.jpg?sign=1739679061-3qr9AXNPSWPoa8cmcV4KdFyw5URquOWi-0-c1e91840211879df950cd7c7cef54d83)
(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=1739679061-xBLwXuAWTjojUyZ3481RXuDFgBGClmVf-0-c44d2ea69d344b636072cded88b2a298)
(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=1739679061-NrIfm1kyseTjpc4XjxQhcCtQewLCSgBu-0-240a2a02d78ae577bd51e00319be5ec8)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_57_01.jpg?sign=1739679061-rOiSJwHuqUFsmwu62owFs37LJkP0x5AE-0-ce45f288ae319f8e6ae184f63d924dfa)
(4)tf.sparse_to_dense
该函数将稀疏矩阵转为密集矩阵。其定义为:
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_57_02.jpg?sign=1739679061-f5v7D3OWiailURQcQwDmIyJ2ik3YqswY-0-554a0c5c154f7b26cbea2b1eef93b6aa)
其中,各参数含义为:
● 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=1739679061-qzkcpl12PbBV6jSQ7va8zEBKfGL6ODfC-0-8c7151adf87f96d15e55e59df68441d3)
(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=1739679061-Pu5BDmE8i2NdkX4x3XcbXHsEYDuwbVzM-0-b4780dd4329f542cadc66e5aec55e423)
(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=1739679061-UnRAk8XxZZ8lfsmXQHKeAYXLzQmJ3Bjw-0-6de8f77f5921209c357ec8b82952e9d5)
(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=1739679061-w1vq6v7vMr7RxG8L2qKYkhDhZKrMVhAW-0-6687094e957d8775c2f89596ac9064b9)
可以看到,上面还提供了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=1739679061-MGKXSAuwU6RBdvLkYiy4NrRbnwcTFE1y-0-66aaa955ad15b2d6858c702968944877)
(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=1739679061-jCfNwemLE6bwgCWT5Rf45hJ9FuDMkDa3-0-ffa1b62b04453b01170fc4ff589827dc)
![](https://epubservercos.yuewen.com/C16494/19573973401151406/epubprivate/OEBPS/Images/978-7-111-65263-2_60_01.jpg?sign=1739679061-U5RpNeK42ftjATwwjfCvuBFRt7zlBD9m-0-b5b2150df9f5e20b9aa183d1edcb2556)