本节学习来源斯坦福大学cs20课程,有关自学与组队学习笔记,将会放于github仓库与本公众号发布,欢迎大家star与转发,收藏!
cs20是一门对于深度学习研究者学习Tensorflow的课程,今天学习了一节,非常有收获,并且陆续将内容写入jupytebook notebook中,有关这个源代码及仓库地址,大家可以点击阅读原文或者直接复制下面链接!
直通车: https://github.com/Light-City/Translating_documents
数据流图什么是tensor?数据流图导包计算图如何取出a的值session高级管理tf.Session()更多图子图分布式计算如果我想搭建更多图,而不是只有一个图?BUG ALERT!作者建议为什么需要图?
一个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)
sess=tf.Session()
print(sess.run(a)) # 输出结果8
sess.close()
输出:
8
with tf.Session() as sess:
print(sess.run(a))
输出:
8
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)
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)
上述方式虽然比较好,但仍然不够好,因为不超过一个图!
许多常见的机器学习模型,例如神经网络,通常被教导并可视化为有向图,这使得它们的实现对于机器学习从业者来说更自然。
通过将计算分成小的,易于区分的片段,TF能够相对于可影响第一节点输出的任何其他节点自动计算任何节点(或“操作”,因为它们在TensorFlow中调用)的导数。能够计算节点的导数/梯度,尤其是输出节点,对于建立机器学习模型至关重要。
第三,将计算分开,这使得在多个CPU,GPU和其他计算设备之间分配工作变得更加容易。只需将整个较大的图形拆分为几个较小的图形,并为每个设备提供一个独立的图形部分(通过一系列逻辑来协调跨设备的共享信息)