3.1 TensorFlow计算模型–计算图
- 这是我第一次写博客,这学期有在上《机器学习》课程,现在上到深度学习方面了,刚好借此机会学习Google的深度学习框架TensorFlow。
- 我电脑上安装的是TensorFlow-gpu2.0版本,但本书用的v1.4版本。
主要书目:TensorFlow实战Google深度学习框架(第2版)
书籍百度云链接:https://pan.baidu.com/s/1JEZY4OOzr4qGpncPO26NOA
提取码:f0il
- 由于第一第二章是深度学习简介和TensorFlow环境搭建,就不再赘述了,环境搭建我推荐用Anaconda傻瓜式安装。主要从第三章TensorFlow入门开始开始记录和学习,而且我个人偏向于记录主要的内容,要用到的时候也方便来查。
- 重要的代码我尽量每条都给上注释,方便读者和自己查看,有疑问或错误的欢迎在评论区留言。
计算图
- TensorFlow中最重要的概念就是Tensor和Flow,Tensor的意思是张量,可以简单理解成多维数组。而Flow的意思是流,表明了张量之间通过计算的相互转换。
- TensorFLow是一种通过计算图的形式来表述计算的编程系统,计算图中的每一个节点表示一个计算,节点之间的边表示相互的依赖关系。
- 如果没有手动创建,TensorFlow会自动创建一个默认的graph。
代码
import tensorflow.compat.v1 as tf # 由于我的版本是v2,为了使用v1语法这样导入
from tensorflow.python.client import device_lib # 方便查看cpu、gpu设备信息
tf.disable_eager_execution() # 取消v2版本中的动态图
print('设备信息:\n' + str(device_lib.list_local_devices())) # 打印设备信息
g = tf.Graph() # 手动创建一个图
g1 = tf.Graph() # 创建另一个图,两个图相互独立
with g.as_default(): # 指定g这个图,graph.as_default()用于有多个图的时候
a = tf.Variable(tf.constant([1.0], dtype = 'float')) # 定义a的初始化方式,但未对其初始化
b = tf.Variable(tf.constant([2.0], dtype = 'float'))
result = a + b
with g1.as_default():
v = tf.Variable(tf.constant([1.0, 2.0], dtype = 'float'))
with g.device('/gpu:0'): # 指定图g在gpu:0上运行
with tf.Session(graph = g) as sess: # 在图g上创建会话
sess.run(tf.global_variables_initializer()) # 初始化所有变量
print(tf.get_default_graph()) # 打印当前的图
print(sess.run(result)) # 打印result运行的结果
with g1.device('/cpu:0'):
with tf.Session(graph = g1) as sess: # 在图g上创建会话
sess.run(tf.global_variables_initializer())
print(tf.get_default_graph())
print(sess.run(v))
运行结果:
设备信息:
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 3556329453418332334
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 3188470579
locality {
bus_id: 1
links {
}
}
incarnation: 3685845405683417136
physical_device_desc: "device: 0, name: GeForce GTX 950M, pci bus id: 0000:01:00.0, compute capability: 5.0"
]
<tensorflow.python.framework.ops.Graph object at 0x00000142900B06A0>
3
<tensorflow.python.framework.ops.Graph object at 0x000001428FFF7FD0>
[1. 2.]
从结果可以看出,两个Graph object的地址不同,是两个不同的、独立的图。
结语:以上内容和代码加入了自己的想法和验证,如有不当之处还请指正。
欢迎转载,标明出处。