TensorFlow编程框架基础

一、为什么要使用编程框架

深度学习的算法具有多层结构,每层的运算由一些基本操作构成,这些基本操作中存在大量共性运算,如卷积、池化、激活等。 将这些共性运算操作封装起来,可以提高编程实现效率。

面向这些封装起来的操作,硬件程序员可以基于硬件特征, 有针对性的进行充分优化,使其能充分发挥硬件的效率。

深度学习编程框架:将深度学习常用的算法和操作封装成一系列的组件,这一系列的组件就构成了深度学习编程框架。

例如VGG-19使用编程框架的流程图如下所示:

二、TensorFlow概述

2.1 TensorFlow概述

谷歌在第一代分布式深度学习平台DistBelief的基础上开发了大规模机器学习系统TensorFlow。

相比DistBelief,具有以下优点:

        支持多种高级语言作为输入: Python、C、C++、Java、Go

        更灵活的编程模型

        更高的性能

        支持在更广泛的异构硬件平台上进行训练和使用更大规模的神经网络模型

2.2 TensorFlow的发展

 TensorFlow 1.x :

        静态图,方便对整个计算图做全局优化,性能较高;但调试困难,影响开发效率。

TensorFlow 2.x:

        动态图,调试简单,更适合快速开发;但运行效率低于静态图方法

三、TensorFlow编程模型及基本用法

TensorFlow是声明式编程,告诉计算机想要达到的目标,不指定具体的实现步骤,而是通过函数、推论规则等描述数据之间的关系,优化较容易。

概览

3.1 计算图

        TensorFlow中使用有向图来描述计算过程。有向图中包含一组节点和边。计算图对应了神经网络的结构

        y= w*x 如下所示:

3.2 节点和边

        节点主要表示各种操作,比如计算、数据填充等等。

        边则有两种,一种表示数据传输,比如上图matmut到y,传输得数据称之为张量(tensor);另一种则表示依赖关系,表明执行此操作需要前序操作完成才行

3.3 操作 

一般而言TensorFlow程序包括两部分:       

  •         构建计算图
  •         创建会话,执行计算
import tensorflow.compat.v1 as tf
tf.disable_eager_execution()
#创建计算图
a = tf.constant([[3.,3.]])
b = tf.constant([[2.],[2.]])
y = tf.matmul(a,b)
#创建会话,执行计算
with tf.Session() as sess:
    result = sess.run(y)
    print(result)

计算图中的每个计算节点即为一个操作,其接收0个或多个tensor作为输入,产生0个或多个tensor作为输出。上述代码中有三个操作:给a赋值、给b赋值、a和b相乘得到y。

操作的一些属性如下表所示:

3.4 张量(Tensor)

在TensorFlow中张量在各个计算节点直接传递,也就是说张量是数据的载体。但是实际上张量并没有保存数据,而是类似指针,只是对于数据的引用

我们在深度学习中使用的数据经常是多维的,比如一张RGB图片是三维的,多张图片是四维的。相应的张量也是有阶数的:零维张量(标量)、一维(向量)、二维(矩阵)、n维(n维数组)。

 张量的一些常用属如下所示:

上面示例程序中的a、b、y都是tensor。

(1)dtype属性,设置了tensor的数据类型:

用法如下:

a = tf.constant([2,3], dtype = tf.float32);

(2)shape属性,设置了tensor每一阶的长度:

(3)device属性,设置了tensor使用的设备名:

        /cpu:0用于指定CPU,/gpu:n用于指定第n个GPU,/mlu:n用于指定第n个深度学习处理器

(4)op属性,常用操作命令:

import tensorflow.compat.v1 as tf
tf.disable_eager_execution()
with tf.device('/cpu:0'):
    t0 = tf.constant(9, dtype=tf.int32)
    t1 = tf.constant([1.0,2.1,3.2], dtype=tf.float32)
    t2 = tf.constant([['i','like'],['eat','cat']], dtype=tf.string)
    t3 = tf.constant([[[1],[2],[3]],[[4],[5],[6]]])
    #打印tensor属性
    print(t0)
    print(t1)
    print(t2)
    print(t3)
#创建会话,打印tensor的值
with tf.Session() as sess:
    print(sess.run(t0))
    print(sess.run(t1))
    print(sess.run(t2))
    print(sess.run(t3))

3.5 会话(session)

TensorFlow在计算图中定义好了计算的过程,但是真正启动计算还是要用到会话来启动。session会给程序提供求解张量、执行操作的环境,将计算图定义好的步骤转化为不同设备上去执行。

使用流程:

#创建会话
sess = tf.Session()
#执行会话
sess.run(t0)
#关闭会话    
sess.close()

 (1)创建会话:

sess = tf.Session(target='',graph=None,config=None)

 (2)执行会话:

        基于计算图和输入数据,求解张量或执行计算。

        输入参数如下图所示,其中fetches即为执行计算后的输出,feed_dict是输入

示例代码: 

import tensorflow.compat.v1 as tf
tf.disable_eager_execution()

a = tf.placeholder(tf.int32)
b = tf.placeholder(tf.int32)
c = tf.multiply(a, b)

with tf.Session() as sess:
    print(sess.run(c, feed_dict={a:100, b:100}))

x = tf.placeholder(tf.float32, [2,3])
y = tf.placeholder(tf.float32, [3,2])
z = tf.matmul(x, y)

with tf.Session() as sess:
    print(sess.run(z, feed_dict={x:[[1,2,3],[1,2,3]], y:[[1,2],[1,2],[1,2]]}))

 在求解张量值时有两种办法:sess.run()和tensor.eval(),如下图所示:

tensor.eval()函数使用前,需要显式指定会话如用with定义会话 ) 处理单个tensor时tensor.eval()与session.run()等价 ,多个时session.run可以一次进行多个tensor或操作的计算。

 (3)关闭会话:

        两种方式,一种是显式调用sess.close();另一种使用了with tf.Session() as sess会隐式关闭会话。

3.6 变量

在对计算图进行计算后便释放其中的值,这样一来深度学习中的模型参数无法存储、迭代更新,因此就需要用到变量。

变量是计算图中的一种有状态节点,用于在多次执行同一计算图时存储并更新指定参数,对应了机 器学习或深度学习算法中的模型参数 。作为有状态节点,其输出由输入、节点操作、节点内部已保存的状态值共同作用

常用属性如下图所示:

 (1)创建变量

 一共有三种办法:

#(1)直接定义初值
a = tf.Variable(2,tf.int16)
b = tf.Variable([1,2])

#(2)使用内置函数定义变量初值
#形状为(20,40)、标准差为0.35的正态分布随机数作为变量初值
c = tf.Variable(tf.random_normal([20, 40], stddev=0.35))
#形状为(2,3)的常量0作为初值
d = tf.Variable(tf.zeros([2,3]))

#(3)使用其他变量进行定义初值
#创建一个变量w2用a进行赋值
w2 = tf.Variable(a.initialized_value(), name="w2")
#创建一个变量w_double用a的两倍进行赋值
w_double = tf.Variable(a.initialized_value()*2, name="w_double")
  • 直接使用tf.Variable()进行定义
  • 使用TensorFlow内置函数来定义变量的初值(常量或随机值)
  • 用其他变量的初始值来定义新变量

常用的定义变量初值的函数:

(2)初始化变量

使用tf.Variable()函数创建变量,仅仅完成了对于变量初值、形状、数据类型的定义,但是并没有真正把初值赋给变量。这就需要在session中进行变量的初始化,最简单的变量初始化方法:使用tf.global_variables_initializer()对所有变量初始化

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(a))
    print(sess.run(b))
    print(sess.run(c))
    print(sess.run(d))
    print(sess.run(w2))

(3)更新变量

变量通常存储的是神经网络中的参数,可以将这些参数的trainable属性设置为True,然后调用内置优化器函数进行更新:

  • tf.train.GradientDescentOptimizer()
  • tf.train.MomentumOptimizer()
  • tf.trian.AdamOptimizer()

也可以进行强制更新:

 3.7 占位符

TensorFlow使用占位符来构建计算图中的样本输入节点,不需要实际分配数据 。 占位符本身并没有初始值,只是在程序中分配了内存 ,只在执行时向其填充数据

tf.placeholder()的输入参数主要包括:占位符名、数据类型、形状。在session中运行时与feed_dict参数配合,用feed_dict提交数据,进行参数传递。

 3.8 队列

队列是一种有状态的操作机制,用来处理数据读取。为了加快训练速度,可以采用多个线程读取数据, 在处理当前数据的同时对下一批数据进行读取

 队列操作包含了:入队、出队操作 。

TensorFlow 提 供了 多 种 队 列 机 制 :FIFOQueue 、 RandomShuffleQueue、优先级队列。

import tensorflow.compat.v1 as tf
tf.disable_eager_execution()

#创建一个FIFO队列,队列长度为3,类型为float
q = tf.FIFOQueue(3, 'float')
#初始化队列
init = q.enqueue_many(([0.,0.,0.],))
#出队加1后入队
x = q.dequeue()
y = x + 1
q_inc = q.enqueue([y])

with tf.Session() as sess:
    sess.run(init)
    sess.run(q_inc)
    sess.run(q_inc)
    sess.run(q_inc)
    sess.run(q_inc)

总结

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值