• TensorFlow(R与Python系列第四篇)


    目录

    一、TensorFlow介绍

    二、张量

    三、有用的TensorFlow运算符

    四、reduce系列函数实现约减

    1-第一种理解方式:引入轴概念后直观可理

    2-第二种理解方式:按张量括号层次的方式

    参考:

    一、TensorFlow介绍

    TensorFlow是一个强大的用于数值计算的库,特别适合大规模机器学习或者可以将其用于需要大量计算的任何其他场景。TensorFlow是由Google Brain团队开发,并未许多Google的大规模服务提供了支持,例如Google Cloud Speech、Google Photos和Google Search。它于2015年11月开源,现在是最受欢迎的深度学习库。

    TensorFlow提供什么?

    • TensorFlow核心与NumPy非常相似,但具有GPU支持;
    • TensorFlow支持分布式计算(跨多个设备和服务器);
    • TensorFlow包含一种即时(JIT)编译器,可使其针对速度和内存使用情况来优化计算,它的工作方式是从Python函数中提取计算图,然后进行优化(通过修剪未使用的节点),最后有效地运行它(通过自动并行运算相互独立的操作);
    • 计算图可以导出为可移植格式,因此那你可以在一个环境中(例如Linux上使用Python)训练TensorFlow模型,然后在另一个环境中(例如在Android设备上使用Java)运行TensorFlow模型;
    • TensorFlow实现了自动微分(autodiff),并提供了一些优秀的优化器,例如RMSProp和Nadam,因此你可以轻松地最小化各种损失函数。

    TensorFlow使用图(Graph)来表示计算任务,图中的节点(Node)称为op(“operation”的缩写)。一个op获得0个或者多个张量,执行计算,产生0个或者多个张量。每个张量是要给类型化的多维数组。一个TensorFlow图描述了计算的过程。为了进行计算,图必须在Session(会话)里被启动。会话将图的op分发到诸如CPU或GPU之类的设备上,同时提供执行op的方法。这些方法执行后,将所产生的张量返回。

    一开始,我们需要导入tensorflow这个包,为了以后调用tensorflow包中的对象、成员变量和成员函数更加方便,我们import tensorflow后面加上了as tf,表示以后可以用tf这个简写来代表tensorflow的全名。

    1. #载入库
    2. import tensorflow as tf
    3. #显示版本
    4. print(tf.__version__) #注意是version前后都是两个下划线。

    二、张量

    TensorFlow中Tensor意思是“张量”,Flow意思是“流或流动”。任意维度的数据可以称为“张量”,如一维数组、二维数组、N维数组。它最初想要表达的含义是保持计算节点不变,让数据在不同的计算设备上传输并计算。

    • 零阶张量表示标量,一个数;
    • 一阶张量表示一维向量;
    • 2阶张量表示矩阵;
    • n阶张量表示n维数组;

    张量中并没有真正存储数字,它存储的是如何得到这些数字的计算过程。TesorFlow中的张量和NumPy中的数组不同,TensorFlow的计算结果不是一个具体的数字,而是一个张量的结构。如:

    1. >>> a = tf.constant([1.0, 2.0], name="a")
    2. >>> a
    3. 2,), dtype=float32, numpy=array([1., 2.], dtype=float32)>
    4. >>> print(a)
    5. tf.Tensor([1. 2.], shape=(2,), dtype=float32)
    表 张量数据类型

    • 占位符(placeholder):事先未指定的值,(个人理解为C语言中对变量使用前进行定义)
    • 变量(variable):一个可以改变的值,
    1. >>> tf.Variable([[1., 2., 3.],[4., 5., 6]])#matirx
    2. 'Variable:0' shape=(2, 3) dtype=float32, numpy=
    3. array([[1., 2., 3.],
    4. [4., 5., 6.]], dtype=float32)>
    • 常量(constant):一个不可变的值,使用tf.constant()创建张量,
    1. >>> tf.constant([[1., 2., 3.],[4., 5., 6]]) #矩阵
    2. 2, 3), dtype=float32, numpy=
    3. array([[1., 2., 3.],
    4. [4., 5., 6.]], dtype=float32)>
    5. >>> tf.constant(42) #标量
    6. 42>

    三、有用的TensorFlow运算符

    • tf.add(x,y) 两个类型相同张量相加,x+y;
    • tf.subtract(x,y)两个类型相同张量相减,x-y;
    • tf.multiply(x,y)两个张量元素相乘
    • tf.pow(x,y)求元素x的y次方
    • tf.exp(x)相当于pow(e,x)其中e为欧拉常数(2.718...)
    • tf.sqrt(x)相当于pow(x,0.5)
    • tf.div(x,y)两个张量元素相除
    • tf.truediv(x,y)与tf.div相同,但将参数转换为浮点数
    • tf.floordiv(x,y)与tf.truediv相同,但将最终结果取整
    • tf.mod(x,y)取元素商的余数
    • tf.negative(x)每个元素都取反

    四、reduce系列函数实现约减

    • tf.reduce_mean()
    • tf.reduce_sum()
    • tf.reduce_max()
    • tf.math.log()

    约减这一概念的解释,可以通过以下两种方法来理解:

    1. 引入轴的概念,0表示垂直方向,即沿着行的方向,1表示水平方向,即沿着列的方向;
    2. 按张量括号层次的方式

    其中第一种理解方式简单且直观,但是仅限于2维以内的数组,当维数超过3时,我们很闹找到直观可以理解的方向。

    1-第一种理解方式:引入轴概念后直观可理

    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取代,此处保留的目的仅为兼容旧代码。
    1. >>> x = tf.constant([[1, 2, 3],[4, 5, 6]])
    2. >>> x
    3. 2, 3), dtype=int32, numpy=
    4. array([[1, 2, 3],
    5. [4, 5, 6]])>
    6. >>> tf.reduce_sum(x) #axis取默认值,即对两个维度都执行约减
    7. 21>
    8. >>> tf.reduce_sum(x,0) #axis=0
    9. 3,), dtype=int32, numpy=array([5, 7, 9])>
    10. >>> tf.reduce_sum(x,1) #axis=1
    11. 2,), dtype=int32, numpy=array([ 6, 15])>

    2-第二种理解方式:按张量括号层次的方式

    由于第一种理解方式对三维以上数组的约减没办法找到直观可以理解的方向,因此,更加普适的解释应该是按张量括号层次的方式来理解。张量括号由外到内,对应从小到大的维数,最外面的括号为0,表示第0维度;倒数第二括号,记为1,表示第1维度;以此类推0,1,2,。。。

    1. >>> y=tf.constant([[[1, 1, 1],[2, 2, 2]],[[3, 3, 3],[4, 4, 4]]])
    2. >>> y
    3. 2, 2, 3), dtype=int32, numpy=
    4. array([[[1, 1, 1],
    5. [2, 2, 2]],
    6. [[3, 3, 3],
    7. [4, 4, 4]]])>
    8. >>> tf.reduce_sum(y,0)
    9. 2, 3), dtype=int32, numpy=
    10. array([[4, 4, 4],
    11. [6, 6, 6]])>
    12. >>> tf.reduce_sum(y,1)
    13. 2, 3), dtype=int32, numpy=
    14. array([[3, 3, 3],
    15. [7, 7, 7]])>
    16. >>> tf.reduce_sum(y,2)
    17. 2, 2), dtype=int32, numpy=
    18. array([[ 3, 6],
    19. [ 9, 12]])>
    20. >>> tf.reduce_sum(y,[0,1])
    21. 3,), dtype=int32, numpy=array([10, 10, 10])>
    22. >>> tf.reduce_sum(y,[0,1,2])
    23. 30>
    • 当axis=0时:

    • 当axis=1时:

    • 当axis=2时:

    总结使用外层括号的进行约减的步骤:

    1. 根据axis的值,将相应的成对括号进行配对,括号内的元素表示这个维度下的元素,注意,这个维度下的元素可以根据相应的成对括号有几对便有几组;
    2.  计算每组这个维度下元素的和,注意,这里的元素可以表示标量、矩阵、三维数组、N维数组;
    3. 将每组这个维度下的计算结果放回到原先划分这个维度的元素的位置里,同时去掉这个维度的配对的括号。

    参考:

    《深度学习之美:AI时代的数据处理与最佳实践》(2018年6月出版,电子工业出版社)(这本书是我目前看到的介绍reduce(约减)最棒的书!把约减这个概念介绍的很清楚!其他书在介绍约减时很含糊,对于初学者不友好。)

    《机器学习实战:基于Scikit-Learn、Keras和TensorFlow(原书第2版)》(2020年10月出版,机工社)

    《Python深度学习:基于TensorFlow》(Python深度学习:基于TensorFlow)

    《TensorFlow机器学习(原书第2版)》(2022年5月出版,机工社)

  • 相关阅读:
    Flink / Scala 实战 - 18.一套代码搞懂 KeyedState
    【云原生】微服务之Feign的介绍与使用
    jenkins报错:Pseudo-terminal will not be allocated because stdin is not a terminal
    k8s核心概念
    web前端设计与开发期末作品_期末大作业【使用HTML制作汽车首页】
    技嘉主板前置面板没有声音的解决
    机器学习 之 python实现正规方程
    一文聊透 Netty 核心引擎 Reactor 的运转架构
    Rethinking Minimal Sufficient Representation in Contrastive Learning 论文解读和感想
    Linux中的日志
  • 原文地址:https://blog.csdn.net/u011375991/article/details/132661435