开刷cs20之Tensorflow第一弹
- 2019 年 10 月 5 日
- 筆記
开刷Cs20之Tensorflow第一弹
本节学习来源斯坦福大学cs20课程,有关自学与组队学习笔记,将会放于github仓库与本公众号发布,欢迎大家star与转发,收藏!
cs20是一门对于深度学习研究者学习Tensorflow的课程,今天学习了一节,非常有收获,并且陆续将内容写入jupytebook notebook中,有关这个源代码及仓库地址,大家可以点击阅读原文或者直接复制下面链接!
直通车: https://github.com/Light-City/Translating_documents

数据流图什么是tensor?数据流图导包计算图如何取出a的值session高级管理tf.Session()更多图子图分布式计算如果我想搭建更多图,而不是只有一个图?BUG ALERT!作者建议为什么需要图?
数据流图
- 组装一个图
- 使用会话(session)来执行图中操作
什么是tensor?
一个n维数组
0维tensor为标量(scalar)
1维tensor为向量(vector)
2维tensor为矩阵(matrix)
等等…shuchu
数据流图
导包计算图
import tensorflow as tf a = tf.add(3,5) print(a)
Tensor("Add_1:0", shape=(), dtype=int32)
如何取出a的值
sess=tf.Session() print(sess.run(a)) # 输出结果8 sess.close()
输出:
8
session高级管理
with tf.Session() as sess: print(sess.run(a))
输出:
8
tf.Session()
Session对象封装了执行Operation对象和评估Tensor对象的环境。
Session还将分配内存来存储变量的当前值。
更多图
x = 2 y = 3 op1 = tf.add(x, y) op2 = tf.multiply(x, y) op3 = tf.pow(op2, op1) with tf.Session() as sess: op3 = sess.run(op3)
print(op3)
输出:
7776
子图
session不计算useless的值,而是储存计算结果
x = 2 y = 3 add_op = tf.add(x, y) mul_op = tf.multiply(x, y) useless = tf.multiply(x, add_op) pow_op = tf.pow(add_op, mul_op) with tf.Session() as sess: z = sess.run(pow_op) z
输出:
15625
session计算useless的值
x = 2 y = 3 add_op = tf.add(x, y) mul_op = tf.multiply(x, y) useless = tf.multiply(x, add_op) pow_op = tf.pow(add_op, mul_op) with tf.Session() as sess: z, not_useless = sess.run([pow_op, useless]) z,not_useless
输出:
(15625, 10)
子图总结:可以将图形分成几个块并在多个CPU,GPU,TPU或其他设备上并行运行它们
分布式计算
要将图形的一部分放在特定的CPU或GPU上:
# 创建一个图 with tf.device('/gpu:2'): a=tf.constant([1.0,2.0,3.0,40,5.0,6.0],name='a') b=tf.constant([1.0,2.0,3.0,40,5.0,6.0],name='b') c=tf.multiply(a,b)
# 创建一个session,并将log_device_placement设置为True,该参数的意思是:是否打印设备分配日志 # cs20ppt中没有allow_soft_placemen参数,如果不加,我的机器报错,加上后即可解决! sess = tf.Session(config=tf.ConfigProto(log_device_placement=True,allow_soft_placement = True))
# 运行计算 sess.run(c)
输出:
array([1.0e+00, 4.0e+00, 9.0e+00, 1.6e+03, 2.5e+01, 3.6e+01], dtype=float32)
如果我想搭建更多图,而不是只有一个图?
BUG ALERT!
- 多个图表需要多个会话,默认情况下每个会尝试使用所有可用资源
- 无法在不通过python / numpy传递数据的情况下在它们之间传递数据,这在分布式协议中不起作用
- 最好在一个图中包含断开连接的子图
作者建议
tf.Graph()
# 创建一个图 g = tf.Graph()
要将运算符添加到图表,请将其设置为默认值
g = tf.Graph() with g.as_default(): x = tf.add(3,5) sess = tf.Session(graph=g) sess.run(x)
输出:
8
上述变型
g = tf.Graph() with g.as_default(): x = tf.add(3,5) with tf.Session(graph=g) as sess: print(sess.run(x))
输出:
8
去处理默认图
g = tf.get_default_graph()
不要混合默认图表和用户创建的图表!!!
g=tf.Graph() a = tf.constant(3) with g.as_default(): # 容易出错 b=tf.constant(5)
上述解决办法
g1 = tf.get_default_graph() g2 = tf.Graph() with g1.as_default(): a=tf.constant(3) with g2.as_default(): b=tf.constant(5)
上述方式虽然比较好,但仍然不够好,因为不超过一个图!
为什么需要图?
- 保存计算。仅运行导致您要获取的值的子图。
- 将计算分解为小的差分片段以促进自动区分。
- 促进分布式计算,将工作分布在多个CPU,GPU,TPU或其他设备上。
- 许多常见的机器学习模型被教导并可视化为有向图。
许多常见的机器学习模型,例如神经网络,通常被教导并可视化为有向图,这使得它们的实现对于机器学习从业者来说更自然。
通过将计算分成小的,易于区分的片段,TF能够相对于可影响第一节点输出的任何其他节点自动计算任何节点(或“操作”,因为它们在TensorFlow中调用)的导数。能够计算节点的导数/梯度,尤其是输出节点,对于建立机器学习模型至关重要。
第三,将计算分开,这使得在多个CPU,GPU和其他计算设备之间分配工作变得更加容易。只需将整个较大的图形拆分为几个较小的图形,并为每个设备提供一个独立的图形部分(通过一系列逻辑来协调跨设备的共享信息)