目录
TensorFlow是一个强大的用于数值计算的库,特别适合大规模机器学习或者可以将其用于需要大量计算的任何其他场景。TensorFlow是由Google Brain团队开发,并未许多Google的大规模服务提供了支持,例如Google Cloud Speech、Google Photos和Google Search。它于2015年11月开源,现在是最受欢迎的深度学习库。
TensorFlow提供什么?
TensorFlow使用图(Graph)来表示计算任务,图中的节点(Node)称为op(“operation”的缩写)。一个op获得0个或者多个张量,执行计算,产生0个或者多个张量。每个张量是要给类型化的多维数组。一个TensorFlow图描述了计算的过程。为了进行计算,图必须在Session(会话)里被启动。会话将图的op分发到诸如CPU或GPU之类的设备上,同时提供执行op的方法。这些方法执行后,将所产生的张量返回。
一开始,我们需要导入tensorflow这个包,为了以后调用tensorflow包中的对象、成员变量和成员函数更加方便,我们import tensorflow后面加上了as tf,表示以后可以用tf这个简写来代表tensorflow的全名。
- #载入库
- import tensorflow as tf
-
- #显示版本
- print(tf.__version__) #注意是version前后都是两个下划线。
TensorFlow中Tensor意思是“张量”,Flow意思是“流或流动”。任意维度的数据可以称为“张量”,如一维数组、二维数组、N维数组。它最初想要表达的含义是保持计算节点不变,让数据在不同的计算设备上传输并计算。
张量中并没有真正存储数字,它存储的是如何得到这些数字的计算过程。TesorFlow中的张量和NumPy中的数组不同,TensorFlow的计算结果不是一个具体的数字,而是一个张量的结构。如:
- >>> a = tf.constant([1.0, 2.0], name="a")
- >>> a
2,), dtype=float32, numpy=array([1., 2.], dtype=float32)> - >>> print(a)
- tf.Tensor([1. 2.], shape=(2,), dtype=float32)
- >>> tf.Variable([[1., 2., 3.],[4., 5., 6]])#matirx
'Variable:0' shape=(2, 3) dtype=float32, numpy= - array([[1., 2., 3.],
- [4., 5., 6.]], dtype=float32)>
- >>> tf.constant([[1., 2., 3.],[4., 5., 6]]) #矩阵
2, 3), dtype=float32, numpy= - array([[1., 2., 3.],
- [4., 5., 6.]], dtype=float32)>
- >>> tf.constant(42) #标量
42>
约减这一概念的解释,可以通过以下两种方法来理解:
其中第一种理解方式简单且直观,但是仅限于2维以内的数组,当维数超过3时,我们很闹找到直观可以理解的方向。
tf.reduce_sum()功能时对张量中的所有元素进行求和,它的函数原型如下:
reduce_sum( input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)
- 第一个参数input_tensor时必需的
- 第二个参数axis,决定了约减的轴方向,
- 如果axis=0,则可以简单的将其理解为从垂直方向进行约减,也就是说,对按行进行处理;
- 如果axis=1,则可以简单的将其理解为从水平方向进行约减,也就是说,对按列进行处理;
- 对张量而言,约减可以有先后顺序的。因此,axis的值可以是一个向量,axis=[1,0]表示先水平方向约减,再垂直方向约减。反之,axis=[0,1]表示先垂直方向约减,再水平方向约减。
- 如果axis没有指定方向,那么将采用默认值None,表示所有维度的张量都会被依次约减。
- 个人感觉:有点像apply(x,1, function)的感觉。
- keep_dims为真True,则每个维度的张量被约减到长度为1,即保留了维度信息。
- 参数name是可选项,表示为这个操作取一个名字。
- 参数reduction_indices已经过时,它已经完全被axis取代,此处保留的目的仅为兼容旧代码。
- >>> x = tf.constant([[1, 2, 3],[4, 5, 6]])
- >>> x
2, 3), dtype=int32, numpy= - array([[1, 2, 3],
- [4, 5, 6]])>
- >>> tf.reduce_sum(x) #axis取默认值,即对两个维度都执行约减
21> - >>> tf.reduce_sum(x,0) #axis=0
3,), dtype=int32, numpy=array([5, 7, 9])> - >>> tf.reduce_sum(x,1) #axis=1
2,), dtype=int32, numpy=array([ 6, 15])>
由于第一种理解方式对三维以上数组的约减没办法找到直观可以理解的方向,因此,更加普适的解释应该是按张量括号层次的方式来理解。张量括号由外到内,对应从小到大的维数,最外面的括号为0,表示第0维度;倒数第二括号,记为1,表示第1维度;以此类推0,1,2,。。。
- >>> y=tf.constant([[[1, 1, 1],[2, 2, 2]],[[3, 3, 3],[4, 4, 4]]])
- >>> y
2, 2, 3), dtype=int32, numpy= - array([[[1, 1, 1],
- [2, 2, 2]],
-
- [[3, 3, 3],
- [4, 4, 4]]])>
- >>> tf.reduce_sum(y,0)
2, 3), dtype=int32, numpy= - array([[4, 4, 4],
- [6, 6, 6]])>
- >>> tf.reduce_sum(y,1)
2, 3), dtype=int32, numpy= - array([[3, 3, 3],
- [7, 7, 7]])>
- >>> tf.reduce_sum(y,2)
2, 2), dtype=int32, numpy= - array([[ 3, 6],
- [ 9, 12]])>
- >>> tf.reduce_sum(y,[0,1])
3,), dtype=int32, numpy=array([10, 10, 10])> - >>> tf.reduce_sum(y,[0,1,2])
30>
总结使用外层括号的进行约减的步骤:
《深度学习之美:AI时代的数据处理与最佳实践》(2018年6月出版,电子工业出版社)(这本书是我目前看到的介绍reduce(约减)最棒的书!把约减这个概念介绍的很清楚!其他书在介绍约减时很含糊,对于初学者不友好。)
《机器学习实战:基于Scikit-Learn、Keras和TensorFlow(原书第2版)》(2020年10月出版,机工社)
《Python深度学习:基于TensorFlow》(Python深度学习:基于TensorFlow)
《TensorFlow机器学习(原书第2版)》(2022年5月出版,机工社)