TensorFlo2:环境搭建

1.TensorFlow的主要依赖包

1.1Protocol Buffer

Protocot Buffer是谷歌开发的处理结构化数据的工具。
结构化数据:举例我们要记录一些用户信息,每个用户信息包括用户名称、用户ID和E-mail地址。那么一个用户的信息可以表示为以下形式:

name:张三
id:12345
email:[email protected]
上面的用户信息就是一个机构化的数据。我们介绍的结构化数据和大数据中的结构化数据的概念不同,我们介绍的结构化数据指的是拥有多种属性的数据。比如上述的用户信息中包含名称、ID和E-mail地址三种不同属性,那么它就是一个结构化数据。当要将这些结构化的用户信息持久化或进行网络传输时,就需要先将它们序列化。所谓序列化,是将结构化的数据变成数据流的格式,简单地说就是变为一个字符串。如何将结构化的数据序列化,并从序列化之后的数据流中还原出原来的结构化数据,统称为处理结构化数据,这就是Protocol Buffer解决的主要问题。
除了Protocol Buffer之外,XML和JSON是两种比较常用的结构化数据处理工具。比如将上面的用户信息使用json格式表达,那么数据的格式为:
{"name":"张三",
"id":"12345",
"email":"[email protected]"
}
Protocol Buffer格式的数据和XML或者JSON格式的数据有比较大的区别。
1.Protocol Buffer序列化之后得到的数据不是可读的字符串,而是二进制流。
2.XML或JSON格式的数据信息都包含在了序列化之后的数据中中,不需要任何其他信息就能还原序列化之后的数据。但使用Protocol Buffer时需要先定义数据的格式。还原一个序列化之后的数据将需要使用到这个定义好的数据格式。
以下代码给出了上述用户信息样例的数据格式定义文件。因为这样的差别,Protocol Buffer序列化出来的数据要比XML格式的数据要小3到10倍,解析时间要快20到100倍。

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

Protocol Buffer定义数据格式的文件一般保存在.proto文件中。每一个message代表了一类结构化的数据,比如这里的用户信息。message里面定义了每一个属性的类型和名字。Protocol Buffer里属性的类型可以是像布尔型、整数型、实数型、字符型这样的基本类型,也可以是另外一个message。这样大大增加了Protocol Buffer的灵活性。在message中,Protocol Buffer也定义了一个属性是必须的还是可选的,或者是可重复的。如果一个属性是必须的,那么所有这个message的实例都需要这个属性;如果一个属性是可选的,那么这个属性的取值可以为空;如果一个属性是可重复的,那么这个属性的取值可以是一个列表。
还是以用户信息为例,所有用户都需要有ID,所以ID这个属性是必须的;不是所有用户都填写了姓名,所以姓名这个属性是可选的;一个用户可能有多个E-mail地址,所以E-mail地址是可重复的。
  Protocol Buffer是TensorFlow系统中使用到的重要工具,TensorFlow中的数据基本都是通过protocol Buffer来组织的。在后面的章节中将看到protocol Buffer是如何被使用的。分布式TensorFlow的通信协议gRPC也是以protocol Buffer作为基础的。

2.Bazel

  Bazel是谷歌开源的自动化构建工具,谷歌内部绝大部分的应用都是通过它来编译的。相比传统的Makefile、Ant或者Maven,Bazel在速度、可伸缩性、灵活性以及对不同程序语言和平台的支持上都要更加出色。TensorFlow本身以及谷歌给出的很多官方样例都是通过Bazel来编译的。这一小节将简单介绍Bazel是怎样工作的。

  项目空间是Bazel的一个基本概念。一个项目空间可以简单地理解为一个文件夹,在这个文件夹中包含了编译一个软件所需要的源代码以及输出编译结果的软连接地址。一个项目空间内可以包含一个应用(比如TensorFlow),这种情况将会用于从源码安装TensorFlow。一个项目空间也可以包含多个应用。一个项目空间所对应的文件夹是这个项目的根目录,在这个根目录中需要有一个workspace文件,此文件定义了对外部资源的依赖关系。空文件也是一个合法的workspace文件。
  在一个项目空间内,Bazel通过Build文件来找到需要编译的目标。build文件采用一种类似于python的语法来制定每一个编译目标的输入、输出以及编译方式。与makefile这种比较开放式的编译工具不同,Bazel的编译方式是事先定义好的。因为TensorFlow主要是用python语言,所以这里都以编译python程序为例。Bazel对python支持的编译方式只有3种:py_binary、py_library和py_test。其中py_binary将python程序编译为可执行文件,py_test编译python测试程序,py_library将python程序编译成库函数供其他py_binary货py_test调用。下面给出了一个简单的样例来说明Bazel是如何工作的。如下所示,在样例空间中有4个文件:WORKSPACE、BUILD、hello_main.py和hello_lib.py。


项目空间里的文件列表

WORKSPACE给出此项目的外部依赖关系。为了简单起见,这里使用一个空文件,标明这个项目没有对外部的依赖。hello_lib.py完成打印“Hello World”的简单功能,它的代码如下:

def print_hello_world():
    print("Hello World")

hello_main.py通过调用hello_lib.py中定义的函数来完成输出,它的代码如下:

import hello_lib
hello_lib.print_hello_world()

在build文件中定义了两个编译目标:

py_libray(
    name="hello_lib",
    srcs=[
        "hello_lib.py",
    ]
)

py_binary(
    name="hello_main",
    srcs = [
        "hello_main.py",
    ],
    deps = [
      ":hello_lib"  
    ],
)

从这个样例中可以看出,build文件是由一系列编译目标组成的。定义编译目标的先后顺序不会影响编译的结果。在每一个编译目标的第一行要制定编译方式,在这个样例中就是py_libray或者py_binary。在每一个编译目标中的主体需要给出编译的具体信息。编译的具体信息是通过定义name,srcs,deps等属性完成的。name是一个编译目标的名字,这个名字将被用来指代这一条编译目标。srcs给出了编译所需要的源代码,这一项可以是一个列表。deps给出了编译所需要的依赖关系,比如样例中hello_main.py需要调用hello_lib.py中的函数,所以hello_main的编译目标中将hello_lib作为依赖关系。在这个项目空间中运行编译操作bazel build:hello_main将会得到类似以下的结果:


运行编译的结果

结果分析:从上面的结果可以看到,在原来四个文件的基础上,Bazel生成了其他一些文件夹。这些新生成的文件夹就是编译的结果,它们都是通过软连接的形式放在当前的项目空间里。实际的编译结果文件都会保存到~/.cache/bazel目录下,这是可以通过output_user_root或者output_base参数来改变的。在这些编译出来的结果当中,bazel-bin目录下存放了编译产生的二进制文件以及运行该二进制文件所需要的所有依赖关系。在当前目录下运行bazel-bin/hello_main就会在屏幕输出“Hello World”。

2.TensorFlow安装

  TensorFlow提供了多种不同的安装方式,我们将逐一介绍通过docker安装、通过pip安装以及通过源码安装。

2.1使用Docker安装

Docker是新一代的虚拟化技术,它可以将TensorFlow以及TensorFlow的所有依赖关系同一封装到Docker镜像当中,从而大大简化了安装过程。通过Docker运行应用时需要先安装Docker。Docker支持大部分的操作系统,下面列出了最主要的一些。
Linux系统:Ubuntu、CentoOS、Debian、红帽企业版(Red Hat Enterprise Linux)等。
Mac OS X:10.10.3Yosemite或以上。
Windows:Windows7或以上
如果安装或使用Docker不是这里的重点,这里就不再介绍在不同操作系统下如何安装Docker,当Docker安装完成后,只需要使用一个打包好的Docker镜像。对于TensorFlow发布的每一个版本,谷歌都提供了4个官方镜像。如下表:


TensorFlow官方docker镜像列表

镜像的标签(冒号后面的部分)给出了TensorFlow的版本。此处绝大部分代码将统一使用版本0.9.0。

当Docker安装完成之后,可以通过一下命令来启动一个TensorFlow容器,在第一次运行的时候,docker会自动下载镜像

docker run -it -p 8888:8888 -p 6006:6006\
cargo.caicloud.io/tensorflow/ tensorflow:0.12.0

在这个命令中,-p 8888:8888将容器内运行的jupyter服务映射到本地机器,这样在浏览器中打开localhost:8888就能看到类似如下图的jupyter界面:


TensorFlow镜像jupyter页面示意图

-p 6006:6006将容器内运行的TensorFlow可视化工具TensorBoard映射到本地机器,通过在浏览器中打开localhost:6006就可以将TensorFlow在训练时的状态、图片数据以及神经网络结构等信息全部展示出来。此镜像会将所有输出到/log目录底下的日志全部可视化。
虽然支持GPU的Docker镜像,但是要运行这些镜像需要安装最新的Nvidia驱动以及nvidia-docker。在安装完成nvidia-docker之后,可以通过一下命令运行支持GPU的TensorFlow镜像。在镜像启动之后可以通过上面类似的方式使用TensorFlow。

nvidia-docker run -it -p 8888:8888 -p 6006:6006 \
      cargo.caicloud.io/tensorflow/tensorflow:0.12.0-gpu

关于docker的问题,可以参考一下文档:
Docker基本概念:https://www.docker.com/what-docker
不同操作系统下安装Docker:https://docs.docker.com/engine/installation
Docker命令的文档:https://docs.docker.com/engine/reference/commandline/cli
nvidia-docker的基本原理和安装说明:https://github.com/NVIDIA/nvidia-docker

2.2使用pip安装

pip是一个安装、管理python软件包的工具,通过pip可以安装已经打包好的TensorFlow以及TensorFlow需要的依赖关系,目前TensorFlow只提供了部分操作系统下打包好的安装文件,通过pip安装可以分为以下三步:
第一步:安装pip
在ubuntu/linux 64-bit环境下安装命令:
sudo apt-get install python-pip python-dev
在Mac OS X环境下安装命令:
sudo easy_install pip
sudo easy_install --upgrade six
第二步:通过pip安装TensorFlow
安装方式一:离线安装
1.下载whl离线安装文件,下载地址:
https://mirrors.tuna.tsinghua.edu.cn/tensorflow
2.这里我们选择Windows的0.9.0版本,CPU版本安装更加简单,所以选择CPU版本
下载地址:
https://mirrors.tuna.tsinghua.edu.cn/tensorflow/windows/cpu/tensorflow-1.3.0rc0-cp36-cp36m-win_amd64.whl
下载之后,进入此文件的目录,打来命令行执行:
pip install tensorflow-1.3.0rc0-cp36-cp36m-win_amd64.whl
执行到最后报错:

图片.png

进入python包下找到这个文件并删除,如下图所示:
图片.png

删除后,重新执行安装命令,执行成功,如下图所示:
TensorFlow安装成功

验证命令如下:
验证TensorFlow是否安装成功命令

结果分析:上图中成功导入TensorFlow并且,成功输出“Hello,Tensorflow!”,说明我们安装成功了。
安装方式二:直接使用pip install命令安装
第一步:升级 pip,命令行输入: python -m pip install --upgrade pip,若出现 Read timed out ,则使用: python -m pip install --timeout=100 --upgrade pip
第二步:
安装命令如下:

C:\Users\Administrator>pip install tensorflow==1.4.0

执行命令后报错,如下:



第三步:
卸载setuptools



第四步:
删除html5lib包,和离线安装一样,进入python包下找到这个文件并删除

第五步:
再次执行安装命令,安装成功,如下图:



验证命令如下:
>>> import tensorflow as tf
>>> hello = tf.constant("Hello,TensorFlow!")
>>> sess = tf.Session()
>>> print(sess.run(hello))

运行结果如下:
b'Hello,TensorFlow!'
至此,TensorFlow安装成功!

3.TensorFlow测试样例

刚才我们已经完成了TensorFlow的安装,下面我们来通过简单的样例,来测试安装好的TensorFlow环境,同时也可以对TensorFlow有一个直观的认识,输入代码如下:

#加载TensorFlow
import tensorflow as tf
a = tf.constant([1.0,2.0],name="a")
b = tf.constant([2.0,3.0],name="b")
result = a + b
#生成一个会话,通过这个会话来计算结果
sess = tf.Session()
sess.run(result)

运行结果:
array([3., 5.], dtype=float32)
结果分析:
1.可以发现,在TensorFlow中,向量的加法也是可以直接通过加号来完成的
2.要输出相加的结果,不能简单地直接输出result,而需要先生成一个会话(session),并通过这个会话(session)来计算结果。
到此实现了一个非常简单的TensorFlow模型。

你可能感兴趣的:(TensorFlo2:环境搭建)