【TensorFlow使用教程】1 环境搭建

时间:2022-06-05 13:48:22

  一、TensorFlow主要依赖包——Protocol Buffer & Bazel

  1. Protocol Buffer

  首先要弄清三个概念:

  • 结构化数据:指拥有多种属性的数据,例如用户信息可以表示为
    name:张三
    id:1234
    email:zhangsan@abc.com

 

  这样的用户信息就是一个结构化数据,name、id和email都是这个数据的属性。

  • 序列化:结构化的数据持久化或进行网络传输时,需要先进行序列化。序列化就是将结构化的数据变成数据流的格式,即变成字符串。
  • 结构化数据的处理:将结构化数据序列化,并从序列化之后的数据流中还原出原来的结构化数据。

  Protocol Buffer就是用来处理结构化数据的。

  另外两种经常被用来处理结构化数据的工具时XML和JSON,它们和Protocol Buffer的主要区别如下

  XML、JSON Protocol Buffer
序列化结果 可读字符串 二进制流
还原操作 序列化结果包含格式信息,无需其他信息即可还原 需事先定义数据格式,还原时也需使用这个定义好的格式。

  由于Protocol Buffer在序列化时可根据需要选定数据类型,它序列化出来的数据一般比XML格式小,解析时间也要快许多。

  Protocol Buffer定义数据格式的文件一般保存在.proto文件中,如

message user{
    optional string name = 1
    required int32 id = 2
    repeated string email = 3
}

  其中,每一个message代表了一类结构化的数据,它的里面定义了每一个属性的类型和名字。

  属性的类型可以是:

  • 布尔型
  • 整型
  • 实数型
  • 字符型等基本类型
  • 另一个message

  属性的设置:

  • repeated 属性是可以重复的,即属性的取值可以是一个列表
  • optional 属性是可选的,即属性的取值可以为空

  2. Bazel

  一个自动化构建工具,用于对项目空间(workspace)中的程序进行编译。

  workspace可以理解为一个文件夹,它包含了编译一个软件所需要的源代码以及输出编译结果的软连接(symbolic link),其根目录的基本结构如下:

  • WORKSPACE文件,定义了对外部资源的依赖关系。可以是空文件。
  • BUILD文件,Bazel通过它来寻找需要编译的目标。它采用一种类似Python的语法来指定每一个编译目标的输入、输出和编译方式,也就是说,和一般的开放式编译工具不同,Bazel的编译方式是事先定义好的。
  • 程序源码的py文件(以Python为例)。

  Bazel对Python支持的编译方式只有以下三种:

  • py_binary 将Python程序编译为可执行文件
  • py_library 将Python程序编译为库函数供其他py_binary或py_test调用
  • py_test 编译Python测试程序

  举例见书p28-29。