Tensorflow 学习-图的概念
本文tensorflow 版本1.12(先介绍1.x的版本,后面再学2.x的版本)
TensorFlow 是什么
TensorFlow 是一个开源的、基于 Python 的机器学习框架,它由 Google 开发,并在图形分类、音频处理、推荐系统和自然语言处理等场景下有着丰富的应用,是目前最热门的机器学习框架。
TensorFlow架构
(图片来源于网上,侵删)
前端:编程模型、构造计算图、Python、C++、JAVA
后端:运行计算图、C++
Graph
上面简单介绍一下Tensorflow,这个大家在网上都能查到,就不多说了,下面抓紧介绍Tensorflow的基本概念。
图(Graph):描述计算的过程,可以通过tensorboard图形化流程结果
在tensorflow程序中,系统会自动维护一个默认的计算图,下面代码展现如何定义或者获取:
1 | import tensorflow as tf # tf是tensorflow别名 |
输出结果:
1 | <tensorflow.python.framework.ops.Graph object at 0x000001F6F2BCAEF0> |
其中,tf.constant
(创建常量的api),后文会介绍。
我们接着用下面这个例子展示如何声明和交叉使用多个Graph:
1 | import tensorflow as tf |
输出结果为:3.0
我们再看一个例子:
1 | import tensorflow as tf |
我们可以发现tensorflow可以通过tf.Graph函数生成新的计算图。不同计算图上的张量和运算都不会共享。
接着我们介绍 Graph如何保存pb和从pb恢复Graph
pb:是MetaGraph的protocol buffer格式的文件,MetaGraph包括计算图,数据流,以及相关的变量和输入输出
保存pb的好处就是使用场景是实现创建模型与使用模型的解耦,使得创建模型与使用模型的解耦,使得前向推导inference代码统一。另外的好处就是保存为pb的时候,模型的变量会变成固定的,导致模型的大小会大大减小。
保存pb:
1 | g1 = tf.Graph() |
从pb中恢复Graph:
1 | with tf.gfile.FastGFile("graph.pb", 'rb') as f: |
tensorflow中的计算图不仅可以用来隔离张量和计算,它还提供了管理张量和计算的机制。计算图可以通过tf.Graph.device函数来指定运行计算的设备,下面代码指定在GPU上运行加法计算:
1 | g=tf.Graph() |
tf.constant
补充说明一下,tf.constant
(创建常量),函数原型如下:
1 | tf.constant( |
第一个参数value
是必须的,可以是一个数值,也可以是一个列表.
如果为查看结果必须创建一个会话session,并用取值函数eval()来查看创建的tensor的值(Session: 在会话(Session)的上下文(Context)中执行计算图。):
1 | sess=tf.Session() |
输出:1
而如果value是一个列表:
1 | tensor=tf.constant([2, 4]) |
输出:[2 4]
后面四个参数可写可不写,第二个参数表示数据类型,一般可以是tf.float32, tf.float64
等:
1 | tensor=tf.constant([1, 2], dtype=tf.float32) |
结果是: [1. 2.]
值得注意的数据类型相比之前发生了改变(float32),不是1 2
,而是1.2
。
第三个参数表示张量的“形状”,即维数以及每一维的大小。如果指定了第三个参数,当第一个参数value是数字时,张量的所有元素都会用该数字填充:
1 | tensor=tf.constant(1, shape=[2, 3]) |
结果是: [[1 1 1]
[1 1 1]]
可以看到是一个二维张量,第一维大小为2, 第二维大小为3,全用数字1填充。
而当第一个参数value是一个列表时,注意列表的长度必须小于等于第三个参数shape的大小(即各维大小的乘积),否则会报错:
1 | tensor=tf.constant([1, 2, 3, 4, 5, 6, 7], shape=[2, 3]) |
Traceback (most recent call last): File "<pyshell#68>", line 1, in <module> tensor=tf.constant([1, 2, 3, 4, 5, 6, 7], shape=[2, 3]) ValueError: Too many elements provided. Needed at most 6, but received 7
这是因为函数会生成一个shape大小的张量,然后用value这个列表中的值一一填充shape中的元素。这里列表大小为7,而shape大小为2*3=6,无法正确填充,所以发生了错误。
而如果列表大小小于shape大小,则会用列表的最后一项元素填充剩余的张量元素:
1 | tensor=tf.constant([1, 2], shape=[1, 4, 3]) |
结果是: [[[1 2 2]
[2 2 2]
[2 2 2]
[2 2 2]]]
第四个参数name可以是任何内容,主要是字符串就行。
不输入任何内容时:
1 | tensor=tf.constant([1, 2]) |
Tensor(“Const_16:0”, shape=(2,), dtype=int32)
作为对比:
1 | tensor=tf.constant([1, 2], name="jiayu") |
Tensor(“jiayu_1:0”, shape=(2,), dtype=int32)
第五个参数verify_shape默认为False,如果修改为True的话表示检查value的形状与shape是否相符,如果不符会报错。
1 | tensor=tf.constant([[1, 2, 3], [4, 5, 6]], shape=[2, 3], verify_shape=True) |
以上代码value与shape都是两行三列,检查结果正确。而下面的代码会报错:
1 | tensor=tf.constant([1, 2], shape=[3, 2], verify_shape=True) |
参考:
https://blog.csdn.net/csdn_jiayu/article/details/82155224
https://www.cnblogs.com/hypnus-ly/p/8040951.html
本篇文章到这里就结束啦,如果喜欢的话,多多支持,欢迎关注!