深度学习解决的核心问题之一就是自动地将简单的特征组合成更加复杂的特征,一旦解决了数据表达和特征提取,很多人工智能任务也就解决了90%。
TensorFlow计算框架可以很好地支持深度学习的各种算法,但它的应用不限于深度学习。
一、TensorFlow的主要依赖包
- Protocol Buffer
将结构化的数据(不同于大数据中的机构化数据,这里的结构化数据指的是拥有多种属性的数据)序列化,并从序列化之后的数据流中还原出原来的结构化数据。
三种常见的结构化数据处理工具对比:
1. Protocol Buffer:
name: 张三
id: 12345
email: zhangsan@abc.com
2. XML:
<user>
<name>张三</name>
<id>12345</id>
<email>zhangsan@abc.com</email>
</user>
3. JSON:
{
"name": "张三",
"id": "12345",
"email": "zhangsan@abc.com",
}
相比较另外两种工具,使用Protocol Buffer时需要先定义数据的格式,Protocol Buffer序列化出来的数据要比XML格式的数据小3到10倍,解析时间要快20到100倍。以下代码给出了上述用户信息样例的数据格式定义文件(存放在 .proto 文件中):
message user{
optional string name = 1; # 可以为空
required int32 id = 2; # 必须有
repeated string email =3; # 取值可以为一个列表
}
- Bazel
谷歌开源的自动化构建工具,TensorFlow本身以及谷歌给出的很多官方样例都是通过Bazel来编译的。
项目空间是Bazel的一个基本概念,项目空间(workspace)包含了编译一个软件所需要的源代码以及输出编译结果的symbolic link地址,一个项目的根目录需要有一个WORKSPACE文件,此文件定义了对外部资源的依赖关系。
Bazel对Python支持的编译方式只有三种:py_binary(将Python程序编译为可执行文件)、py_library(将Python程序编译成库函数供其他调用)和py_test(编译Python测试程序)
二、TensorFlow计算模型
TensorFlow程序一般可以分为两个阶段:在第一个阶段定义计算图中所有的计算,第二个阶段执行计算。
1. 计算图
TensorFlow是一个通过计算图的形式来表达计算的编程系统,每一个计算都是计算图上的一个节点,节点之间的边描述了计算之间的依赖关系。
![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1531147036534&di=a0696f341ddd219f90625074ffcae7e8&imgtype=0&src=http%3A%2F%2Fimg.kuqin.com%2Fupimg%2Fallimg%2F151124%2F194K4H20-2.png)
import tensorflow as tf
a = tf.constant([1.0,2.0],name='a')
print(a.graph is tf.get_default_graph())
a.graph获得张量a所属的计算图,tf.get_default_graph函数可以获取当前线程默认的计算图,所以输出结果如下:
True
tf.Graph.device可以指定运行计算的设备:
g = tf.Graph()
# 指定计算运行的设备
with g.device('/gpu:0'):
result = a + b
通过tf.Graph函数生成新的计算图,不同计算图上的张量和运算不会共享:
import tensorflow as tf
# 在计算图g1中定义变量“v”,并设置初值为0
g1 = tf.Graph()
with g1.as_default():
v = tf.get_variable("v", initializer=tf.zeros_initializer()(shape = [1]))
# 在计算图g2中定义变量“v”,并设置初值为1
g2 = tf.Graph()
with g2.as_default():
v = tf.get_variable("v", initializer=tf.ones_initializer()(shape = [1]))
# 在计算图g1中读取变量“v”的取值
with tf.Session(graph=g1) as sess:
tf.global_variables_initializer().run()
with tf.variable_scope("", reuse=True):
print(sess.run(tf.get_variable("v")))
# 在计算图g1中,变量“v”的取值应该为0,所以上面这行会输出[0.]
# 在计算图g2中读取变量“v”的取值