tensorflow:基础篇

    技术2022-07-13  83

    首先我们来了解一下tensorflow的使用流程是怎么样的? tensorflow是一种声明式语言。

    工作流程:

    1,“粮草先行”: 首先先定义输入数据,也就是将数据分成训练集数据特征和要预测的值即X和Y。

    2,“战略路线”: 定义数据流图。什么是数据流图呢?tensorflow用数据流图表示算法模型,是一个框架,一个只有规则没有数据和执行的空壳。就好比是战争中的一个战略路线图,首先攻打哪里,怎么攻打,和谁合作,然后攻打哪里等等。数据流图由节点和有向边组成。有向边,就是数据流图中流动的东西,如张量(Tensor)。数据流图中流动的东西就是数据,数据就是张量,只是张量分成几种不同的类型。就像是战争中流动的是士兵,士兵又分成不同的等级。节点就是一个一个的城池,战争的时候,城池里面会发生生很多事情,也会有一部分士兵留下来看守。在tensorflow中,每个节点均对应一个具体的操作,因此操作是模型功能的实际载体。节点包含操作(Operation),存储节点(Variable)和数据节点(Placeholder)。

    3,“攻城略地”: 士兵准备好了,战略路线也有了,接下来就是攻城略地了。在tensorflow中,准备好了输入数据,和数据流图,接下来就是开启一个会话(Session),在session中加载数据流图,和输入数据和,然后run一下,就可以输出结果了。

    4,“战后可视化”: 在战争中伤亡了多少人,每个城池的战争表现怎么样,可以用可视化出来,更好的了解自己的战术。在tensorflow中可以用tensorboard来进行可视化。

    具体概念:

    张量: 在数学里,张量是一种几何实体,广义上表示任意形式的“数据”,张量可以理解为0阶,1阶…矩阵在高维空间上的推广,张量的阶表示它能描述的最大维度。1阶就代表一个维度,维度里可以有多个元素。

    在tensorflow中,张量表示的是具有相同数据类型和多维数组。在python中,列表和元组中的数据可以是不同的数据类型,但是tensorflow中的张量必须是一样的。因此张量有两个特性:1.数据类型(浮点型,整型,字符串等),可以在声明张量时就定义好数据类型,也可以不定义,不定义的时候,tensorflow就会根据数据或操作,自动设置一个合适的数据类型。2.是数组的形状大小,即各个维度的大小。

    那tensorflow中,张量到底是什么呢?

    表示多维数据是执行操作时的输入或输出数据用户通过执行操作来创建或计算张量张量的形状不一定在编译时确定,可以在运行时,通过形状推断计算得出(如tf.placeholder)

    张量的几种类型:

    tf.constant() 常量tf.placeholder() 占位符tf.variable() 变量tf.get_variable() 变量

    常量(constant): 常量操作得到的张量是不能改变的,当数据从一个节点流向另一个节点时,数据是不能更改的。如:y = a+b时,在计算时,a和b的值是不能改变的。当重新输入数据要计算y = a+b时,是不能实现的,此时就不能将数据设计为常量。定义了一个常量之后,永远也无法改变,除非重新定义常量;

    变量(variable): 定义出来的张量,可以在数据流图中保存状态,值一直保存在内存中,不会被释放,以保存值的效果。不会因为没有依赖,而被垃圾回收机制回收。变量的主要作用就是维护特定节点的状态,如深度学习或机器学习模型参数。例如在用线性回归方程预测房价的模型中,要将模型参数W定义为variable。

    定义的方式:

    tf.Variable() 是操作,返回值是变量(特殊张量) 好处:

    张量的生命周期通常随着依赖的计算完成而结束,内存也随即释放;变量则常驻内存,在每一步训练时,不断更新其值,以实现模型参数的更新;

    tf.get_variable()

    W = tf.get_variable('weight', (X_data.shape[1], 1), initializer=tf.constant_initializer())

    好处:

    可以直接通过key找到变量,赋值,复用都可以,在数据流图中复用同名节点,会很方便;因此当数据流图的特殊张量et_variable创建好之后,也就是weight创建好之后,后面再去创建.get_variable相同名字的variable就会报错;tf.constant_initializer 会默认的给weight初始化为1; 4. 定义权重变量"weight" ,get_variable已经存在过了,就不能第二次执行了;

    注意,在tensorflow中,定义数据和赋值时分开的!

    定义数据:是描述数据长什么样子,初始值是什么 赋值:在计算时,要把数据流图放到会话里面,然后要向设备申请资源,比如向cpu申请资源,在执行计算时,要对数据进行初始化操作,这是真正对变量进行初始化。

    变量的一些常见操作: # 创建变量的两种方式 w = tf.Variable(<initial-value>, name=<option-name>) w = tf.get_variable(<option-name>,<shape>, initializer=tf.constant_initializer()) # 将变量作为操作的输入 y = tf.matmul(w, ...another variable or tensor) z = tf.sigmoid(w + y) # 使用assign 或 assign_xxx 方法重新给变量赋值 w.assign(w + 1.0) w.assign_add(1.0)

    操作: 数据流图包含有向边和节点,每个节点均对应一个具体的操作,因此操作是模型功能的实际载体。

    节点的分类:

    存储节点: 有状态的变量操作,通常用来存储模型参数; 计算节点: 无状态的计算或控制操作,主要负责算法逻辑表达或流程控制; 数据节点: 数据的占位符操作,用于描述图外输入数据的属性

    占位符操作(tf.placeholder()): 使用占位符操作表示图外输入的数据,如训练和测试数据; 数据流图描述了算法模型的计算拓扑,其中的各个操作(节点)都是抽象的函数映射或数学表达式; 换句话说,数据流图本身是一个具有拓扑和内部结构的“壳”。在用户向数据流图填充数据前,图中并没有真正执行任何计算。

    Processed: 0.016, SQL: 9