tensorflow(四)----会话

tensorflow----会话

一、会话
1.会话的定义和典型流程

会话提供了估计张量(打印张量)和执行操作的运行环境,他是发放计算认为的客户端,所有计算任务都由它连接的执行引擎完成。一个会话的典型使用流程分为以下三步:

# 1.创建会话
tf.Session(target=..., graph=..., config=...)
# 2.估计张量或执行操作
sess.run(...)
# 3.关闭会话
sess.close()

target:会话连接的执行引擎。
graph:会话加载的数据流图。当有多个数据流图时,需要指定一个数据流图加载。
config:会话启动时的配置项。

注意: 用with...as ...语句可以省略sess.close()

2.会话的一个小例子
# 定义占位符
x = tf.placeholder(tf.float16, shape=(), name='x')
y = tf.placeholder(tf.float16, shape=(), name='y')
# 创建数据流图:z = x * y
z = x * y
# 创建会话
with tf.Session() as sess:
    # 向数据节点分别填充: x=6 y=8
    result = sess.run(z, feed_dict={x: 6, y: 8})
    # 输出结果
    print('result of x*y: {}'.format(result))

# 结果:
result of x*y: 48.0
3.会话执行

在之前的文章中,我们已经了解到可以用sess.run(...)的方法去让会话执行操作,比如初始化变量:sess.run(tf.global_variables_initializer())和估计张量(获取张量): sess.run(n)。接下来介绍另外两种会话执行的方法:

  • 估计操作: Tensor.eval(…)
  • 执行操作:Operation.run()

接下来举一个例子:

# 另外两种会话执行的方法:(之前一直用的sess.run(...)方法)
# 定义占位符和变量
x = tf.placeholder(tf.float32, shape=(), name='x')
a = tf.Variable(3.0, name='a')
b = tf.Variable(2.0, name='b')
# 构建数据流图:y = a * x + b
y = a * x + b
with tf.Session() as sess:
    # 执行初始化操作
    tf.global_variables_initializer().run()
    # 向数据节点填充数据: x=2
    result = y.eval(feed_dict={x: 2})
    print('result of a*x+b: {}'.format(result))

# 结果:
result of a*x+b: 8.0

其实,刚才介绍的Tensor.eval(…)和Operation.run()获取张量的方法都是基于sess.run(…)方法实现的,具体流程见下图:
在这里插入图片描述

4.会话的执行原理

当我们调用sess.run(…)语句执行训练操作时:

  1. 首先,程序内部提取依赖的所有前置操作。这些操作的节点共同组成一幅子图。就是把数据流图根据前置操作的依赖关系,分成好几个子图。多个节点依赖一个结点,另外多个结点依赖另一个结点,则可以分为两个子图。
  2. 然后,程序会将子图中的计算节点、存储节点和数据节点按照各自的执行设备分类,相同设备上的节点组成了一幅局部图。就是更具执行设备再将子图分成几个子图。
  3. 最后,每个设备上的局部图在实际执行时,根据节点间的依赖关系将各个节点有序的加载到设备上执行。不同子图上同深度的节点可以并行运行。

在这里插入图片描述
比如上图:

  1. 根据前置操作input无法分割子图。
  2. 子图根据执行设备分割成子子图,这里根据cpu、gpu分为以上两个部分
  3. 首先会加载input节点(因为只有这个节点深度为0),input节点对应操作执行完毕后,左右边消失,reshape和class lable节点变为深度为0的节点,这两个节点同时的被加载,并行执行…
5.会话本地执行

对于单机程序来说,相同的机器上不同编号的cpu或gpu就是不同的设备,我们可以在创建节点时,指定执行该节点的设备。

# 会话本地执行
with tf.device('/cpu:0'):
    tf.Variable(...)
    
with tf.device('/gpu:0'):
    tf.Variable(...)
6.tensorflow本地执行

在这里插入图片描述
client是我们在python中编写的代码,当我们用sess.run(…)时,会调用本地的执行引擎server,而不是调用python解释器去执行。本地执行引擎再根据节点的执行设备不同,分配到相应的设备中执行。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个使用TensorFlow实现K-Means算法的示例代码: ```python import numpy as np import tensorflow as tf # 生成样本数据 num_points = 200 vectors_set = [] for i in range(num_points): if np.random.random() > 0.5: vectors_set.append([np.random.normal(0.0, 0.9), np.random.normal(0.0, 0.9)]) else: vectors_set.append([np.random.normal(3.0, 0.5), np.random.normal(1.0, 0.5)]) # 将数据转换为TensorFlow的常量张量 vectors = tf.constant(vectors_set) # 定义K-Means算法的簇数 k = 4 # 随机初始化质心 centroids = tf.Variable(tf.slice(tf.random.shuffle(vectors), [0, 0], [k, -1])) # 计算每个样本点到各个质心的距离 expanded_vectors = tf.expand_dims(vectors, 0) expanded_centroids = tf.expand_dims(centroids, 1) distances = tf.reduce_sum(tf.square(tf.subtract(expanded_vectors, expanded_centroids)), 2) assignments = tf.argmin(distances, 0) # 更新质心位置 means = [] for c in range(k): means.append(tf.reduce_mean(tf.gather(vectors, tf.reshape(tf.where(tf.equal(assignments, c)), [1, -1])), reduction_indices=[1])) new_centroids = tf.concat(means, 0) # 初始化变量并运行会话 init_op = tf.global_variables_initializer() sess = tf.Session() sess.run(init_op) # 执行K-Means算法 for step in range(100): _, centroid_values, assignment_values = sess.run([new_centroids, centroids, assignments]) if step % 10 == 0: print("Step {}: Centroids = {}".format(step, centroid_values)) # 关闭会话 sess.close() ``` 这段代码生成了200个二维数据点,并使用K-Means算法将它们分为4个簇。在每一步迭代中,算法会计算每个数据点到各个质心的距离并将每个点分配到距离最近的簇中。然后,算法会根据当前的簇分配来更新质心的位置,并重复以上步骤直到收敛。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElegantCodingWH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值