TensorFlow 入门

本文转自:http://www.jianshu.com/p/6766fbcd43b9

字数3303 阅读904 评论3 喜欢5

CS224d-Day 2:

在 Day 1 里,先了解了一下 NLP 和 DP 的主要概念,对它们有了一个大体的印象,用向量去表示研究对象,用神经网络去学习,用 TensorFlow 去训练模型,基本的模型和算法包括 word2vec,softmax,RNN,LSTM,GRU,CNN,大型数据的 seq2seq,还有未来比较火热的研究方向 DMN,还有模型的调优。

今天先不直接进入理论学习,而是先学习一下 TensorFlow,在原课程里,这部分在第7讲,但是我觉得最高效地学习算法的方式,就是一边学理论,一边写代码,实践中才能理解更深刻。

Day 2 先认识 TensorFlow,了解一下基本用法,下一次就写代码来训练模型算法,以问题为导向,以项目为驱动。


本文结构:

  • 1. TensorFlow 是什么
  • 2. 为什么需要 TensorFlow
  • 3. TensorFlow 的优点
  • 4. TensorFlow 的工作原理
  • 5. 安装
  • 6. TensorFlow 基本用法
    • 要点
    • 例子
    • 概念
      • 张量
      • 会话

1. TensorFlow 是什么

是一个深度学习库,由 Google 开源,可以对定义在 Tensor(张量)上的函数自动求导。

Tensor(张量)意味着 N 维数组,Flow(流)意味着基于数据流图的计算,TensorFlow即为张量从图的一端流动到另一端。

它的一大亮点是支持异构设备分布式计算,它能够在各个平台上自动运行模型,从电话、单个CPU / GPU到成百上千GPU卡组成的分布式系统。

支持CNN、RNN和LSTM算法,是目前在 Image,NLP 最流行的深度神经网络模型。


2. 为什么需要 TensorFlow 等库

深度学习通常意味着建立具有很多层的大规模的神经网络。

除了输入X,函数还使用一系列参数,其中包括标量值、向量以及最昂贵的矩阵和高阶张量。

在训练网络之前,需要定义一个代价函数,常见的代价函数包括回归问题的方差以及分类时候的交叉熵。

训练时,需要连续的将多批新输入投入网络,对所有的参数求导后,代入代价函数,从而更新整个网络模型。

这个过程中有两个主要的问题:1. 较大的数字或者张量在一起相乘百万次的处理,使得整个模型代价非常大。2. 手动求导耗时非常久。

所以 TensorFlow 的对函数自动求导以及分布式计算,可以帮我们节省很多时间来训练模型。


3. TensorFlow 的优点

第一,基于Python,写的很快并且具有可读性。

第二,在多GPU系统上的运行更为顺畅。

第三,代码编译效率较高。

第四,社区发展的非常迅速并且活跃。

第五,能够生成显示网络拓扑结构和性能的可视化图。


4. TensorFlow 的工作原理

TensorFlow是用数据流图(data flow graphs)技术来进行数值计算的。

数据流图是描述有向图中的数值计算过程。

有向图中,节点通常代表数学运算,边表示节点之间的某种联系,它负责传输多维数据(Tensors)。

节点可以被分配到多个计算设备上,可以异步和并行地执行操作。因为是有向图,所以只有等到之前的入度节点们的计算状态完成后,当前节点才能执行操作。


5. 安装

极客学院有官方文档翻译版,讲的很清楚,有各种安装方式的讲解。

我选择基于 Anaconda 的安装,因为这个很方便。

Anaconda 是一个集成许多第三方科学计算库的 Python 科学计算环境,用 conda 作为自己的包管理工具,同时具有自己的计算环境,类似 Virtualenv。

  • 安装 Anaconda
    我之前已经安装过 Anaconda 了,直接从下面进行:

  • 建立一个 conda 计算环境

  1. # 计算环境名字叫 tensorflow:
  2. # Python 2.7
  3. $ conda create -n tensorflow python=2.7
  • 激活环境,使用 conda 安装 TensorFlow
  1. $ source activate tensorflow
  2. (tensorflow)$ # Your prompt should change
  3. # Mac OS X, CPU only:
  4. (tensorflow)$ pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.8.0rc0-py2-none-any.whl
  • 安装成功后,每次使用 TensorFlow 的时候需要激活 conda 环境

  • conda 环境激活后,你可以测试是否成功,在终端进入 python,输入下面代码,没有提示错误,说明安装 TensorFlow 成功:

  1. $ python
  2. ...
  3. >>> import tensorflow as tf
  4. >>> hello = tf.constant('Hello, TensorFlow!')
  5. >>> sess = tf.Session()
  6. >>> print(sess.run(hello))
  7. Hello, TensorFlow!
  8. >>> a = tf.constant(10)
  9. >>> b = tf.constant(32)
  10. >>> print(sess.run(a + b))
  11. 42
  12. >>>
  • 当你不用 TensorFlow 的时候,关闭环境:
  1. (tensorflow)$ source deactivate
  2. $ # Your prompt should change back
  • 再次使用的时候再激活:
  1. $ source activate tensorflow
  2. (tensorflow)$ # Run Python programs that use TensorFlow.
  3. ...
  4. (tensorflow)$ source deactivate

在 Jupyter notebook 里用 TensorFlow
我在 (tensorflow)$ 直接输入 jupyter notebook 后,输入 import tensorflow as tf 是有错误的,可以参考这里


6. TensorFlow 基本用法

接下来按照官方文档中的具体代码,来看一下基本用法。

你需要理解在TensorFlow中,是如何:

  • 将计算流程表示成图;
  • 通过Sessions来执行图计算;
  • 将数据表示为tensors;
  • 使用Variables来保持状态信息;
  • 分别使用feeds和fetches来填充数据和抓取任意的操作结果;

先看个栗子:
例1,生成三维数据,然后用一个平面拟合它:

  1. # (tensorflow)$ python 用 Python API 写 TensorFlow 示例代码
  2. import tensorflow as tf
  3. import numpy as np
  4. # 用 NumPy 随机生成 100 个数据
  5. x_data = np.float32(np.random.rand(2, 100))
  6. y_data = np.dot([0.100, 0.200], x_data) + 0.300
  7. # 构造一个线性模型
  8. b = tf.Variable(tf.zeros([1]))
  9. W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
  10. y = tf.matmul(W, x_data) + b
  11. # 最小化方差
  12. loss = tf.reduce_mean(tf.square(y - y_data))
  13. optimizer = tf.train.GradientDescentOptimizer(0.5)
  14. train = optimizer.minimize(loss)
  15. # 初始化变量
  16. init = tf.initialize_all_variables()
  17. # 启动图 (graph)
  18. sess = tf.Session()
  19. sess.run(init)
  20. # 拟合平面
  21. for step in xrange(0, 201):
  22. sess.run(train)
  23. if step % 20 == 0:
  24. print step, sess.run(W), sess.run(b)
  25. # 输出结果为:
  26. 0 [[-0.14751725 0.75113136]] [ 0.2857058]
  27. 20 [[ 0.06342752 0.32736415]] [ 0.24482927]
  28. 40 [[ 0.10146417 0.23744738]] [ 0.27712563]
  29. 60 [[ 0.10354312 0.21220125]] [ 0.290878]
  30. 80 [[ 0.10193551 0.20427427]] [ 0.2964265]
  31. 100 [[ 0.10085492 0.201565 ]] [ 0.298612]
  32. 120 [[ 0.10035028 0.20058727]] [ 0.29946309]
  33. 140 [[ 0.10013894 0.20022322]] [ 0.29979277]
  34. 160 [[ 0.1000543 0.20008542]] [ 0.29992008]
  35. 180 [[ 0.10002106 0.20003279]] [ 0.29996923]
  36. 200 [[ 0.10000814 0.20001261]] [ 0.29998815]

注意这几条代码:

  1. W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
  2. y = tf.matmul(W, x_data) + b
  3. init = tf.initialize_all_variables()
  4. sess = tf.Session()
  5. sess.run(init)
  6. sess.run(train)
  7. print step, sess.run(W), sess.run(b)

接下来看具体概念:

  • TensorFlow 用图来表示计算任务,图中的节点被称之为operation,缩写成op。
  • 一个节点获得 0 个或者多个张量 tensor,执行计算,产生0个或多个张量。
  • 图必须在会话(Session)里被启动,会话(Session)将图的op分发到CPU或GPU之类的设备上,同时提供执行op的方法,这些方法执行后,将产生的张量(tensor)返回。

1. 构建图
例2,计算矩阵相乘:

  1. import tensorflow as tf
  2. # 创建一个 常量 op, 返回值 'matrix1' 代表这个 1x2 矩阵.
  3. matrix1 = tf.constant([[3., 3.]])
  4. # 创建另外一个 常量 op, 返回值 'matrix2' 代表这个 2x1 矩阵.
  5. matrix2 = tf.constant([[2.],[2.]])
  6. # 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入.
  7. # 返回值 'product' 代表矩阵乘法的结果.
  8. product = tf.matmul(matrix1, matrix2)

默认图有三个节点, 两个 constant() op, 和一个 matmul() op. 为了真正进行矩阵相乘运算, 并得到矩阵乘法的结果, 你必须在会话里启动这个图.

2. 张量 Tensor
从向量空间到实数域的多重线性映射(multilinear maps)(v是向量空间,v*是对偶空间)
例如代码中的 [[3., 3.]],Tensor 可以看作是一个 n 维的数组或列表。在 TensorFlow 中用 tensor 数据结构来代表所有的数据, 计算图中, 操作间传递的数据都是 tensor。

3. 在一个会话中启动图
创建一个 Session 对象, 如果无任何创建参数, 会话构造器将启动默认图。
会话负责传递 op 所需的全部输入,op 通常是并发执行的。

  1. # 启动默认图.
  2. sess = tf.Session()
  3. # 调用 sess 的 'run()' 方法, 传入 'product' 作为该方法的参数,
  4. # 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op),
  5. # 向方法表明, 我们希望取回矩阵乘法 op 的输出.
  6. result = sess.run(product)
  7. # 返回值 'result' 是一个 numpy `ndarray` 对象.
  8. print result
  9. # ==> [[ 12.]]
  10. # 任务完成, 需要关闭会话以释放资源。
  11. sess.close()

交互式使用
在 Python API 中,使用一个会话 Session 来 启动图, 并调用 Session.run() 方法执行操作.

为了便于在 IPython 等交互环境使用 TensorFlow,需要用 InteractiveSession 代替 Session 类, 使用 Tensor.eval() 和 Operation.run() 方法代替 Session.run()。

例3,计算 'x' 减去 'a':

  1. # 进入一个交互式 TensorFlow 会话.
  2. import tensorflow as tf
  3. sess = tf.InteractiveSession()
  4. x = tf.Variable([1.0, 2.0])
  5. a = tf.constant([3.0, 3.0])
  6. # 使用初始化器 initializer op 的 run() 方法初始化 'x'
  7. x.initializer.run()
  8. # 增加一个减法 sub op, 从 'x' 减去 'a'. 运行减法 op, 输出结果
  9. sub = tf.sub(x, a)
  10. print sub.eval()
  11. # ==> [-2. -1.]

变量 Variable

上面用到的张量是常值张量(constant)。

变量 Variable,是维护图执行过程中的状态信息的. 需要它来保持和更新参数值,是需要动态调整的。

下面代码中有 tf.initialize_all_variables,是预先对变量初始化,
Tensorflow 的变量必须先初始化,然后才有值!而常值张量是不需要的。

下面的 assign() 操作和 add() 操作,在调用 run() 之前, 它并不会真正执行赋值和加和操作。

例4,使用变量实现一个简单的计数器:

  1. # -创建一个变量, 初始化为标量 0. 初始化定义初值
  2. state = tf.Variable(0, name="counter")
  3. # 创建一个 op, 其作用是使 state 增加 1
  4. one = tf.constant(1)
  5. new_value = tf.add(state, one)
  6. update = tf.assign(state, new_value)
  7. # 启动图后, 变量必须先经过`初始化` (init) op 初始化,
  8. # 才真正通过Tensorflow的initialize_all_variables对这些变量赋初值
  9. init_op = tf.initialize_all_variables()
  10. # 启动默认图, 运行 op
  11. with tf.Session() as sess:
  12. # 运行 'init' op
  13. sess.run(init_op)
  14. # 打印 'state' 的初始值
  15. # 取回操作的输出内容, 可以在使用 Session 对象的 run() 调用 执行图时,
  16. # 传入一些 tensor, 这些 tensor 会帮助你取回结果.
  17. # 此处只取回了单个节点 state,
  18. # 也可以在运行一次 op 时一起取回多个 tensor:
  19. # result = sess.run([mul, intermed])
  20. print sess.run(state)
  21. # 运行 op, 更新 'state', 并打印 'state'
  22. for _ in range(3):
  23. sess.run(update)
  24. print sess.run(state)
  25. # 输出:
  26. # 0
  27. # 1
  28. # 2
  29. # 3

上面的代码定义了一个如下的计算图:

Ok,总结一下,来一个清晰的代码:
过程就是:建图->启动图->运行取值

计算矩阵相乘:

  1. import tensorflow as tf
  2. # 建图
  3. matrix1 = tf.constant([[3., 3.]])
  4. matrix2 = tf.constant([[2.],[2.]])
  5. product = tf.matmul(matrix1, matrix2)
  6. # 启动图
  7. sess = tf.Session()
  8. # 取值
  9. result = sess.run(product)
  10. print result
  11. sess.close()

上面的几个代码介绍了基本用法,通过观察,有没有觉得 tf 和 numpy 有点像呢。

TensorFlow和普通的Numpy的对比
cs224d的课件中有下面这个代码,来看一下二者之间的区别:

eval()

在 Python 中定义完 a 后,直接打印就可以看到 a。

  1. In [37]: a = np.zeros((2,2))
  2. In [39]: print(a)
  3. [[ 0. 0.]
  4. [ 0. 0.]]

但是在 Tensorflow 中需要显式地输出(evaluation,也就是说借助eval()函数)!

  1. In [38]: ta = tf.zeros((2,2))
  2. In [40]: print(ta)
  3. Tensor("zeros_1:0", shape=(2, 2), dtype=float32)
  4. In [41]: print(ta.eval())
  5. [[ 0. 0.]
  6. [ 0. 0.]]

通过几个例子了解了基本的用法,feed 在上面的例子中还没有写到,下一次就能用到了,其他的可以查询这里


Day 1 宏观了解了 NLP,Day 2 搞定了工具,下次要直接先进入实战,训练模型,先从 Logistic 和 NN 开始,一边看模型一边写代码一边思考模型原理,这样理解才会更深刻!

Run With Artificial Intelligence, not Against. ...

¥ 打赏支持

 
×

喜欢的用户

不需要这么麻烦,只需要
conda install -c jjhelmus tensorflow=0.10.0rc0
然后就可以在ipython3 notebook中欢快的使用了,不需要任何设置
我的环境是ubuntu16.04+anaconda3+emacs24
参考网页
https://anaconda.org/jjhelmus/tensorflow

不会停的蜗牛: @seesky2000 谢谢哦,我后来用的这个里面的方法:在tensorflow下安装了ipython和jupyter,再在notebook里import tensorflow就不提示错误了
http://stackoverflow.com/questions/37061089/trouble-with-tensorflow-in-jupyter-notebook

 

登录后发表评论

被以下专题收入,发现更多相似内容:

(转)TensorFlow 入门的更多相关文章

  1. TensorFlow 入门之手写识别(MNIST) softmax算法

    TensorFlow 入门之手写识别(MNIST) softmax算法 MNIST flyu6 softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...

  2. FaceRank,最有趣的 TensorFlow 入门实战项目

    FaceRank,最有趣的 TensorFlow 入门实战项目 TensorFlow 从观望到入门! https://github.com/fendouai/FaceRank 最有趣? 机器学习是不是 ...

  3. #tensorflow入门(1)

    tensorflow入门(1) 关于 TensorFlow TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操 ...

  4. TensorFlow入门(五)多层 LSTM 通俗易懂版

    欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @creat_date: 2017-03-09 前言: 根据我本人学习 TensorFlow 实现 LSTM 的经 ...

  5. TensorFlow入门,基本介绍,基本概念,计算图,pip安装,helloworld示例,实现简单的神经网络

    TensorFlow入门,基本介绍,基本概念,计算图,pip安装,helloworld示例,实现简单的神经网络

  6. [译]TensorFlow入门

    TensorFlow入门 张量(tensor) Tensorflow中的主要数据单元是张量(tensor), 一个张量包含了一组基本数据,可以是列多维数据.一个张量的"等级"(ra ...

  7. 转:TensorFlow入门(六) 双端 LSTM 实现序列标注(分词)

    http://blog.csdn.net/Jerr__y/article/details/70471066 欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @cr ...

  8. TensorFlow入门(四) name / variable_scope 的使

    name/variable_scope 的作用 欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @creat_date: 2017-03-08 refer to: ...

  9. TensorFlow入门教程集合

    TensorFlow入门教程之0: BigPicture&极速入门 TensorFlow入门教程之1: 基本概念以及理解 TensorFlow入门教程之2: 安装和使用 TensorFlow入 ...

随机推荐

  1. STM32之GPIO端口位带操作

    #ifndef __SYS_H #define __SYS_H #include "stm32f10x.h" //位带操作 //把“位带地址+位序号”转换别名地址宏 #define ...

  2. SharePoint表单和工作流 - Nintex篇(七)

    博客地址 http://blog.csdn.net/foxdave 接上篇点击打开链接 在工作流设计面板点击Close返回到列表页面,切换到List标签,选择"Nintex Forms&qu ...

  3. NSURLSession使用实战教程

    我的前面两篇文章介绍了NSURLSession套件的使用和NSURLSession套件的主要类.今天我们使用NSURLSession来完成一个小的应用程序.在实战之前,我先补充一点,为什么苹果会主推N ...

  4. Ubuntu虚机中SVN连接出错,虚机本机可正常CO,CIN,解决方法

    Ubuntu虚机中SVN连接出错,虚机本机可正常CO,CIN,外面机器无法正常连接. 解决: 虚机换个IP即可正常连接,原因不明,有可能为公司网管对该IP做了某些限制. PS:VMware中只需将网络 ...

  5. Android与服务器http连接模块代码

    package com.example.httpdemo2; import java.io.BufferedReader; import java.io.IOException; import jav ...

  6. Oracle查看表结构的几种方法(转后加工)

    1. DESCRIBE 命令使用方法如下:SQL> describe WX_ADVANCEUP (WX_ADVANCEUP为表名)显示的结果如下: 名称                     ...

  7. Unity3D ShaderLab 各向异性高光

    Unity3D ShaderLab 各向异性高光 各向异性时一种模拟物体表面沟槽方向性的高光反射类型,它会修改或延伸垂直方向上的高光.当我们想模拟金属拉丝高光的时候,它非常适合.下面就一步一步实现. ...

  8. I - Tri Tiling

      Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status #in ...

  9. 不错的nginx文章,找个时间好好看下。

    http://blog.csdn.net/chosen0ne/article/category/915324

  10. I.MX6 ubuntu-core-14.04 Apache php mysql Qt5

    /*************************************************************************** * I.MX6 ubuntu-core-14. ...