前置准备

在阅读本文之前,请确定你已经了解神经网络的基本结构以及前向传播、后向传播的基本原理,如果尚未了解,可以查看下文。

深度学习之神经网络

什么是TensorFlow?

TensorFlow是Google基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流图的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网络中进行分析和处理的系统。

TensorFlow可被用于语音识别图像识别等多项机器学习和深度学习领域,对2011年开发的深度学习基础架构DistBelief进行了各方面的改进,它可在小到异步智能手机、大到数千台数据中心服务器的各种设备上运行。TensorFlow将完全开源,任何人都可以用。

安装

先确定需要哪种类型的TensorFlow:

  • 仅支持CPU运算版本:如果电脑没有NVIDIA®的GPU,那么必须安装这个版本。这个版本的TensorFlow安装非常简单(安装仅需一个命令,5到10分钟),所以即使系统中有满足要求的NVIDIA®GPU官方还是建议在学习阶段安装这个版本。
  • 支持GPU运算版本:TensorFlow程序在GPU下运行比在GPU下运行明显快很多。如果系统中包含NVIDIA®GPU满足下一小节所示的条件并且程序对性能要求很高,建议安装此版本。

我是在Ubuntu 16.04 LTS下安装CPU版本的TensorFlow

#一键安装(CPU版)
sudo pip3 install tensorflow -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
#一键安装(GPU版)
sudo pip3 install tensorflow-gpu -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

更加详细的安装教程请见:安装指南

测试

安装之后可以测试是否安装成功,可以编写以下代码(功能是进行基本的向量加法):

 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()
print(sess.run(result))

如果安装成功,会显示:

[3. 5.]

基本概念介绍

TensorFlow由Tensor和Flow组成,Tensor是张量的意思,在这里可以理解成多维数组,Flow是“流”,张量像“流”一样相互流动和转化,形成计算模型。

计算图

TensorFlow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看作是一种有向图,TensorFlow中的每个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。

TensorFlow中有一个默认的计算图,它会自动将定义的计算转化为该计算图中的节点,下面代码体现了如何查看默认的计算图:

 import tensorflow as tf
print(tf.get_default_graph)

张量

TensorFlow中的所有数据如图片、语音等都是以张量这种数据结构的形式表示的。张量是一种组合类型的数据类型,表示为一个多维数组,通用的形式为

[T1,T2,T3,...,TN],其中T可以是在TensorFlow中指定类型的单个数字,也可以是一个矩阵。

张量的维数又叫张量的,是张量维数的一个数量描述。如下分别表示0维、1维、2维和3维的张量:

 1    #维度为0的标量
[1,2,3] #维度为1,一维向量
[[1,2],[3,4]] #维度为2, 二维矩阵
[[[1,2],[3,4]],[[1,2],[3,4]]] #维度为3,3维空间矩阵

维度要看张量的最左边有多少个左中括号,有n个,则这个张量就是n维张量。

张量有3个重要的属性——名字、维数和数据类型,如下代码:

 #coding:utf-8
import tensorflow as tf
# tf.constant是一个计算,这个计算的结果为一个张量,保存在变量a中。
a = tf.constant ([1.0, 2.0], name = "a")
b= tf.constant ([2.0, 3.0], name = "b")
result = tf.add (a, b, name="add")
print(result)

输出如下:

 Tensor("add:0", shape=(2,), dtype=float32)

张量和计算图上的节点是对应的,张量可以使用“node:src_output”来表示,如上文中的"add:0"表示计算节点add中的第一个输出(从0开始计数)。

会话

TensorFlow使用计算图表示计算过程,它是依据各个操作之间的依赖关系生成的。这是一个底层的编程模型,你需要先定义一个数据流图,然后创建一个TensorFlow会话以在多个本地或在远程的设备上运行流图的各个部分。

构造阶段完成后,才能启动图。启动图的第一步是创建一个Session对象,如果无任何创建参数,会话构造器将启动默认图。会话会管理TensorFlow程序运行时的所有资源。当所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄露的问题。

TensorFlow中使用会话的模式一般有两种:

1、需要明确调用会话生成函数和关闭会话函数

 # 创建一个会话。
sess = tf.Session() # 使用会话得到之前计算的结果。
sess.run(...) # 关闭会话使得本次运行中使用到的资源可以被释放。
sess.close()

例子:

 #coding:utf-8
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() # 使用会话得到之前计算的结果。
print(sess.run(result)) # 关闭会话使得本次运行中使用到的资源可以被释放。
sess.close()

输出:

 [3. 5.]

使用这种模式时,在所有计算完成之后,需要明确调用Session.close函数来关闭会话释放资源。然而,当程序因为异常而退出时,关闭会话的函数可能就不会执行从而导致资源泄露。

所以TensorFlow可以通过Python的上下文管理器来使用会话。

2、通过Python的上下文管理器来使用会话

 #创建一个会话,并通过Python中的上下文管理器来管理
with tf.Session() as sess: #使用这个会话来计算关心的结果
sess.run(...)
#不再需要调用“Session.close()”函数来关闭会话,当上下文退出时会话关闭和资源释放也会自动完成。

例如:

 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 with tf.Session() as sess:
print(sess.run(result))123456789

通过Python上下文管理器的机制,只要将所有的计算放在with的内部就可以了。当上下文管理器退出时就会自动释放所有的资源。这样既解决了因为异常退出时资源释放的问题,同时也解决了忘记调用Session.close函数而产生的资源泄露。

变量

TensorFlow变量(Variable)是在程序中表示共享、持久状态的最佳方式。

通过tf.Variable类操作变量。tf.Variable表示值可以被操作改变的张量。跟tf.Tensor对象不一样,tf.Variable存在于单个session.run调用的上下文之外。

在内部,tf.Variable存储一个持久张量,允许读取和修改张量的值。这些修改是跨tf.Session可见的,所以不同的工作节点可以看到相同的值tf.Variable。

创建变量最好的方法是调用tf.get_variable功能。此功能要求你指定变量的名字,此名称将被其它副本用于访问相同的变量,以及在检查点和导出模型时命名此变量的值。tf.get_variable还允许你重复使用先前创建的同名变量,从而可以轻松定义重复使用图层的模型。

用tf.get_variable来创建一个变量,只需提供名字和形状

 my_variable = tf.get_variable("my_variable", [1, 2, 3])

这将创建一个名为“my_variable”的变量,它是一个带有形状[1,2,3]的3维张量。这个默认的dtype是tf.float32,其初始值将通过tf.glorot_uniform_initializer随机化。

你可以选择指定dtype和初始化程序tf.get_variable,例如:

 my_int_variable = tf.get_variable("my_int_variable", [1, 2, 3], dtype=tf.int32,initializer=tf.zeros_initializer)

TensorFlow提供了许多方便的初始化程序。或者,你可以初始化一个tf.Variable为具有tf.Tensor的值。例如:

 other_variable = tf.get_variable("other_variable", dtype=tf.int32, initializer=tf.constant([23, 42]))

请注意,当初始化器是一个tf.Tensor,你不应该指定变量的形状,因为用来初始化张量的形状将被复用。

变量集合

因为TensorFlow程序中不连接的部分之间可能需要创建变量,所以用单一的方法来访问所有的变量是有用的。出于这个原因,TensorFlow提供collections(集合),它们被命名为张量或其它对象的列表,例如tf.Variable实例。

默认情况下每个tf.Variable被放置在以下两个集合中:

  • tf.GraphKeys.GLOBAL_VARIABLES——可以在多个设备上共享的变量
  • tf.GraphKeys.TRAINABLE_VARIABLES——TensorFlow将计算梯度的变量。

如果你不想要一个变量是可训练的,可把它添加到tf.GraphKeys.LOCAL_VARIABLES集合。例如,以下代码片段演示了如何添加一个名为my_local的变量到这个集合:

 my_local = tf.get_variable("my_local", shape=(), collections=[tf.GraphKeys.LOCAL_VARIABLES])

或者,你可以指定trainable=False作为tf.Variable的参数:

 my_non_trainable = tf.get_variable("my_non_trainable", shape=(),trainable=False)

你也可以使用自己的集合。任何字符串都是有效的集合的名称,并且不需要显示创建集合。在创建变量之后向变量添加一个变量(或任何其它对象),调用tf.add_to_collection。例如,下面的代码添加一个名为my_local的现有变量到一个名为my_collection_name的集合:

 tf.add_to_collection("my_collection_name", my_local)

为了检索你已经放置在集合中的所有变量(或其它对象)的列表,你可以使用:

 tf.get_collection("my_collection_name")

参考链接:http://chrer.com/2018/08/05/TensorFlow%E5%85%A5%E9%97%A8-%E4%B8%8A/#moreTensorFlow

Tensorflow入门-上的更多相关文章

  1. TensorFlow 入门 上(自用)

    下文会出现的一些知识点:TensorFlow的计算模型.数据模型.运行模型,TensorFlow的工作原理. 两个重要概念——Tensor和Flow: Tensor是张量,在TensorFlow中可以 ...

  2. (转)TensorFlow 入门

        TensorFlow 入门 本文转自:http://www.jianshu.com/p/6766fbcd43b9 字数3303 阅读904 评论3 喜欢5 CS224d-Day 2: 在 Da ...

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

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

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

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

  5. #tensorflow入门(1)

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

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

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

  7. [译]TensorFlow入门

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

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

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

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

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

随机推荐

  1. IDE配置jvm参数

    -------- IntelliJ IDEA 配置参数:-Xms34m -Xmx234m 内存初始化大小,最小和最大值: 测试代码: public class JVMDemoTest { public ...

  2. jquery中一些容易忽略的方法

    jquery.ajaxPrefilter:([dataTypes],handle(options,originalOptions,jqXHR)):在发送请求之前和执行$.ajax之前操作options ...

  3. 【192】PowerShell 相关知识

    默写说明: 查询别名所指的真实cmdlet命令. Get-Alias -name ls 查看可用的别名,可以通过 “ls alias:” 或者 “Get-Alias”. 查看所有以Remove打头的c ...

  4. 第一篇(那些JAVA程序BUG中的常见单词)

    The local variable xxx may not have been initialized. 局部变量xxx可能尚未初始化 local variable 局部变量 initialized ...

  5. 动态规划基础复习 By cellur925

    结束帝都的qbxt dp图论精讲班后,感觉自己依然很水,接下来的一周,不妨来复习一下讲课内容:) 动态规划是lyd讲的,上次在泉城讲数据结构,然鹅体验较差,这次虽说好了些,但还是比想象中的效果不好(还 ...

  6. Spark SQL概念学习系列之Spark SQL入门

    前言 第1章   为什么Spark SQL? 第2章  Spark SQL运行架构 第3章 Spark SQL组件之解析 第4章 深入了解Spark SQL运行计划 第5章  测试环境之搭建 第6章 ...

  7. PowerDesigner在PDM转换为sql脚本时报错Generation aborted due to errors detected during the verification of the mod

    在设计概念数据模型(CDM)之后,转换为物理数据模型(PDM),之后转换为sql脚本时报错Generation aborted due to errors detected during the ve ...

  8. redis问题集结

    redis和memcached比较? redis中数据库默认是多少个db 及作用? python操作redis的模块? 如果redis中的某个列表中的数据量非常大,如果实现循环显示每一个值? redi ...

  9. cmdb客户端服务器信息采集一

    #cmdb脚本程序一 #!/usr/bin/python # coding:utf-8 """ 采集机器自身信息 1 主机名 2 内存 3 ip与mac地址 4 cpu信 ...

  10. CF446C [DZY loves Fibonacci]

    Description Transmission Gate 你需要维护一个长度为\(n \leq 300000\) 的数列,兹词两个操作: 1.给一个区间加上一个fibonacci数列,规定\(f[0 ...