开刷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和其他计算设备之间分配工作变得更加容易。只需将整个较大的图形拆分为几个较小的图形,并为每个设备提供一个独立的图形部分(通过一系列逻辑来协调跨设备的共享信息)