第五节,TensorFlow编程基础案例-session使用(上)
在第一节中我们已经介绍了一些TensorFlow的编程技巧;第一节,TensorFlow基本用法,但是内容过于偏少,对于TensorFlow的讲解并不多,这一节对之前的内容进行补充,并更加深入了解讲解TensorFlow.
TesorFlow的命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算。TensorFlow是张量从图像的一端流动到另一端的计算过程,这也是TensorFlow的编程模型。
TensorFlow编程基础上主要介绍session的创建,以及session与图的交互机制,最后讲解一下在session中指定GPU运算资源。
一 运行机制
TensorFlow的运行机制属于"定义"与”运行“相分离。从操作层面可以抽象成两种:构造模型和模型运行。
在讲解构建模型之前,需要讲解几个概念。在一个叫做"图"的容器中包括:
- 张量(tensor):TensorFlow程序使用tensor数据结构来代表所有的数据,计算图中,操作间传递的数据都是tensor,你可以把TensorFlow tensor看做一个n维的数组或者列表。
- 变量(Variable):常用于定义模型中的参数,是通过不断训练得到的值。比如权重和偏置。
- 占位符(placeholder):输入变量的载体。也可以理解成定义函数时的参数。
- 图中的节点操作(op):一个op获得0个或者多个Tensor,执行计算,产生0个或者多个Tensor。op是描述张量中的运算关系,是网络中真正结构。
一个TensorFlow图描述了计算的过程,为了进行计算,图必须在会话里启动,会话将图的op分发到诸如CPU或者GPU的设备上,同时提供执行op的方法,这些方法执行后,将产生的tensor返回,在python语言中,返回的tensor是numpy array对象,在C或者C++语言中,返回的tensor是tensorflow:Tensor实例。
session与图的交互过程中定义了以下两种数据的流向机制。
- 注入机制(feed):通过占位符向模式中传入数据。
- 取回机制(fetch):从模式中取得结果。
二 session的使用
1.session案例
第一个案例是通过session输出一段字符串信息,通过这个案例,让我们了解session如何创建。
import tensorflow as tf ''' TensorFlow 编程基础 ''' ''' 1.编写hello world程序掩饰session的使用 建立一个session,在session中输出hello TensorFlow ''' #定义一个常量 hello = tf.constant('hello TensorFlow') #构造阶段完成后,才能启动图,启动图的第一步是创建一个Session对象,如果无任何创建函数,会话构造器将启动默认图 sess = tf.Session() #通过session里面的run()函数来运行结果 print(sess.run(hello)) #或者 print(hello.eval(session=sess)) #任务完毕,关闭会话,Session对象在使用完毕后需要关闭以释放资源,除了显示调用close()外,也可以使用with代码块 sess.close() ''' 2. with session的使用 ''' a = tf.constant(3) b = tf.constant(4) with tf.Session() as sess: print(' a + b = {0}'.format(sess.run(a+b))) print(' a * b = {0}'.format(sess.run(a*b))) ''' 3.交互式session ''' #进入一个交互式TensorFlow会话 sess = tf.InteractiveSession() x = tf.Variable([1.0,2.0]) a = tf.constant([3.0,3.0]) #使用初始化器 initinalizer op的run()初始化x x.initializer.run() #增加一个减去sub op,从 x 减去 a,运行减去op,输出结果 sub = tf.subtract(x,a) print(sub.eval()) #[-2. -1.]
上面使用了三种方法创建session,一个是是用了with代码块,一个是没有使用with代码块。还有几种交互式session方式。
为了方便使用诸如Jupter之类的Python交互环境,可以使用InteractiveSession替代Session类,使用Tensor.eval()和Operation.run()方法来代替Session.run(),这样可以避免使用一个变量来持有会话。
2.session的注入机制
feed 使用一个 tensor 值临时替换一个操作的输出结果. 你可以提供 feed 数据作为 run()
调用的参数. feed 只在调用它的方法内有效, 方法结束,feed 就会消失. 最常见的用例是将某些特殊的操作指定为 "feed" 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符。下面将演示如何使用feed机制将上一个案例程序中的数值通过占位符传入。
''' 4.注入机制 ''' a = tf.placeholder(dtype=tf.float32) b = tf.placeholder(dtype=tf.float32) add = a + b product = a*b with tf.Session() as sess: #启动图后,变量必须先经过'初始化' op sess.run(tf.global_variables_initializer()) print(' a + b = {0}'.format(sess.run(add,feed_dict={a:3,b:4}))) print(' a * b = {0}'.format(sess.run(product,feed_dict={a:3,b:4})))
#一次取出两个节点值
print(' {0}'.format(sess.run([add,product],feed_dict={a:3,b:4})))
注意这个案例最后一个print一次取出来两个节点的值。
3.指定GPU运算
在实现上, TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU).一般你不需要显式指定使用 CPU 还是 GPU, TensorFlow 能自动检测. 如果检测到 GPU, TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作.如果机器上有超过一个可用的 GPU, 除第一个外的其它 GPU 默认是不参与计算的. 为了让 TensorFlow 使用这些 GPU, 你必须将 op 明确指派给它们执行. with...Device 语句用来指派特定的 CPU 或 GPU 执行操作:
''' 5.指定GPU运算 ''' with tf.Session() as sess: with tf.device("/cpu:0"): print(sess.run(product,feed_dict={a:3,b:4}))
设备用字符串进行标识. 目前支持的设备包括: "/cpu:0": 机器的 CPU. "/gpu:0": 机器的第一个 GPU, 如果有的话. "/gpu:1": 机器的第二个 GPU, 以此类推.
类似的还有通过tf.ConfigProto来构建一个config,在config中指定相关的GPU,并且在session中传入参数config='自己创建的config'来指定GPU操作
tf.ConfigProto参数如下:
亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。
日期 | 姓名 | 金额 |
---|---|---|
2023-09-06 | *源 | 19 |
2023-09-11 | *朝科 | 88 |
2023-09-21 | *号 | 5 |
2023-09-16 | *真 | 60 |
2023-10-26 | *通 | 9.9 |
2023-11-04 | *慎 | 0.66 |
2023-11-24 | *恩 | 0.01 |
2023-12-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
2024-09-06 | *强 | 8.8 |
2024-09-09 | *波 | 1 |
2024-09-10 | *口 | 1 |
2024-09-10 | *波 | 1 |
2024-09-12 | *波 | 10 |
2024-09-18 | *明 | 1.68 |
2024-09-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了