TensorFlow编程框架基础

article/2025/4/16 20:32:43

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

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

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

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

例如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)

总结

 


http://chatgpt.dhexx.cn/article/eyJ60o79.shtml

相关文章

c语言编程框架_编程语言和框架的状态

c语言编程框架 作为专业的软件交付人员,我喜欢掌握技术趋势和“市场可能走向何方”。 在过去的十五年中,已经出现了许多语言和框架,并且几乎没有任何真正的持久力。 为了在“人们想知道的事情”上适销对路,使我知识广博&#xff0…

MFC编程框架总结

简介 MFC是一种C类库,利用面向对象的方法封装了Windows API,为Windows应用程序的开发带来了极大便利。本文总结了使用MFC进行编程的基本方法,编程环境为VS2008 SP1。 搭建MFC开发环境 由于使用MFC应用程序向导后VS会自动生成应用程序框架&am…

并发编程框架----disruptor框架(一)

背景 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后&…

网络编程框架

网络编程 Socket网络通信编程 Socket主要解决一个网间进程通信(不同主机进程间的相互通信问题)。 提供进程通信的端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到…

您所应了解的Python四大主流网络编程框架

**本文内容摘录自《Python高效开发实战——Django、Tornado、Flask、Twisted》一书。**该书分为三部分:第1部分是基础篇,带领初学者实践Python开发环境和掌握基本语法,同时对网络协议、Web客户端技术、数据库建模编程等网络编程基础深入浅出地…

常见编程/框架介绍

文章大纲 一、C/C二、C#三、cocos2d-x四、go语言五、Hadoop六、HBase七、PHP八、python九、Spark十、Storm十一、Unity3D十二、Java十三、Android十四、Object-C与swift十五、.NET十六、R语言 一、C/C 1. 简介 C语言是目前世界上流行、使用最广泛的高级程序设计语言。C语言对操…

Linux 应用编程框架

粗略的复习下linux应用编程的一些知识,画个导图记录总结下:

Python 四大主流 Web 编程框架

目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实。但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架开发的常用知识,及目前的4种主流Python网络框架:Django、Tornado、Flask、Twisted。 …

【常见编程/框架介绍】

目录 一、C/C 1. 简介 2. 特点 3. 优点 4. 缺点 5. 常见使用场景 二、C# 三、cocos2d-x 四、go语言 1. 简介 2. 优点 3. 缺点 4. 就业方向 五、Hadoop 1. 简介 2. 优势 3. 应用场景 六、HBase 七、PHP 1. 简介 2. 优点 3. 缺点 4. 就业方向 八、python …

mac命令行查看dSYM文件的UUID

通过命令行查看 *.dSYM 文件的UUID值,标准范式: xcrun dwarfdump --uuid dSYM文件 实例演示: 想查看 Electron Framework.dSYM 的UUID值: 结果:5BE9E0C9-3946-3E4D-B12A-595EDA5170AF

dSYM的简单介绍

通过http://www.cocoachina.com/ios/20100427/1222.html 这篇文章,结合自己日常工作的理解,提炼了一下主要内容 一、dsym是什么? 在XCODE编译项目之后,会在app旁看见一个同名的dSYM文件.(rd称之为 符号文件)他是一个编…

dSYM 文件分析工具

我在项目中使用了百度统计,友盟统计也可以,上线项目出bug的时候,错误信息统计中能比较方便的找出客户端异常的信息,可是很多像数组越界却只给出了 *** -[__NSArrayM objectAtIndex:]: index 50 beyond bounds [0 .. 39] 这类错误信…

firebase_crashlytics缺失dSYM unity ios

Firebase后台提示缺失dSYM文件的截图 解决方案: 一、找dSYM: 方法一: 打开xcode->window->organizer->选择你的版本包archives->show in finder->显示包内容->里面即可看到.dSYM文件 方法二: 打开终端&#…

iOS-详解没有dSYM文件 如何解析iOS崩溃日志

Xcode支持崩溃日志自动符号化,前提是本地有当时Build/Archive生成的dSYM文件,iOS崩溃日志符号化后,可以帮助开发者更好的定位问题,但如果dSYM文件丢失或拿到的崩溃日志不是标准的crash log,如何定位crash呢&#xff0c…

iOS开发-dSYM文件

文章目录 dSYMxcode的符号化解析每个架构的符号 Bitcode相关定位你的dSYMBuild UUID对比恢复隐藏的符号表文件符号化解析操作命令命令行工具 symbolicatecrash 符号化 dSYM 根据 苹果官方文档,当编译器将源代码转为机械码时,会生成调试符号(debug symbo…

ios崩溃日志分析,无dSYM文件

问题场景 大部分情况下,我们都拿不到dSYM文件,只有一份ipa文件一个crash文件,应该如何定位具体崩溃的代码呢? 实例说明 首先本人建立了一个demo工程,写了一段会crash的代码,如下图 然后打包成ipa包&…

命令行工具解析Crash文件,dSYM文件进行符号化

https://www.jishux.com/p/10628644fe5dabf3 序 在日常开发中,app难免会发生崩溃。简单的崩溃还好说,复杂的崩溃就需要我们通过解析Crash文件来分析了,解析Crash文件在iOS开发中是比较常见的。 获取崩溃信息方式 在iOS中获取崩溃信息的方…

iOS-dSYM 文件分析工具

来到新公司后,前段时间就一直在忙,前不久 项目 终于成功发布上线了,最近就在给项目做优化,并排除一些线上软件的 bug,因为项目中使用了友盟统计,所以在友盟给出的错误信息统计中能比较方便的找出客户端异常…

DSYM文件

什么是dSYM文件? iOS平台中,dSYM文件是指具有调试信息的目标文件,文件名通常为:xxx.app.dSYM。如下图所示: 为了方便找回Crash对应的dSYM文件和还原堆栈,建议每次构建或者发布APP版本的时候,备…