前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开刷cs20之Tensorflow第一弹

开刷cs20之Tensorflow第一弹

作者头像
公众号guangcity
发布2019-09-20 15:23:53
3220
发布2019-09-20 15:23:53
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

开刷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

数据流图

导包计算图

代码语言:javascript
复制
import tensorflow as tf
a = tf.add(3,5)
print(a)
代码语言:javascript
复制
Tensor("Add_1:0", shape=(), dtype=int32)

如何取出a的值

代码语言:javascript
复制
sess=tf.Session()
print(sess.run(a)) # 输出结果8
sess.close()

输出:

代码语言:javascript
复制
8

session高级管理

代码语言:javascript
复制
with tf.Session() as sess:
    print(sess.run(a))

输出:

代码语言:javascript
复制
8

tf.Session()

Session对象封装了执行Operation对象和评估Tensor对象的环境。

Session还将分配内存来存储变量的当前值。

更多图

代码语言:javascript
复制
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)
代码语言:javascript
复制
print(op3)

输出:

代码语言:javascript
复制
7776

子图

session不计算useless的值,而是储存计算结果

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
15625

session计算useless的值

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
(15625, 10)

子图总结:可以将图形分成几个块并在多个CPU,GPU,TPU或其他设备上并行运行它们

分布式计算

要将图形的一部分放在特定的CPU或GPU上:

代码语言:javascript
复制
# 创建一个图
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)
代码语言:javascript
复制
# 创建一个session,并将log_device_placement设置为True,该参数的意思是:是否打印设备分配日志
# cs20ppt中没有allow_soft_placemen参数,如果不加,我的机器报错,加上后即可解决!
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True,allow_soft_placement = True))
代码语言:javascript
复制
# 运行计算
sess.run(c)

输出:

代码语言:javascript
复制
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()

代码语言:javascript
复制
# 创建一个图
g = tf.Graph()

要将运算符添加到图表,请将其设置为默认值

代码语言:javascript
复制
g = tf.Graph()
with g.as_default():
    x = tf.add(3,5)
sess = tf.Session(graph=g)
sess.run(x)

输出:

代码语言:javascript
复制
8

上述变型

代码语言:javascript
复制
g = tf.Graph()
with g.as_default():
    x = tf.add(3,5)
with tf.Session(graph=g) as sess:
    print(sess.run(x))

输出:

代码语言:javascript
复制
8

去处理默认图

代码语言:javascript
复制
g = tf.get_default_graph()

不要混合默认图表和用户创建的图表!!!

代码语言:javascript
复制
g=tf.Graph()
a = tf.constant(3)
with g.as_default(): # 容易出错
    b=tf.constant(5)

上述解决办法

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开刷Cs20之Tensorflow第一弹
    • 数据流图
      • 什么是tensor?
        • 数据流图
          • 导包计算图
          • 如何取出a的值
          • session高级管理
          • tf.Session()
        • 更多图
          • 子图
        • 分布式计算
          • 如果我想搭建更多图,而不是只有一个图?
            • BUG ALERT!
            • 作者建议
          • 为什么需要图?
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档