原文链接: https://medium.com/@camrongodbout/tensorflow-in-a-nutshell-part-one-basics-3f4403709c9d#.31jv5ekoy

学习世界上最流行的深度学习框架的最快最简单的教程

(其实这个系列写的差强人意,但是的确是学习tensflow精简的教程,比较适合新手入门,高手请绕行--------译者注)

tensorflow是google公司推出的深度学习框架。深度学习是一类采用多层神经网络的机器学习算法。深度学习的思想最早在1943年由神经物理学家Warren McCulloch和数学家Walter Pitts提出,他们在一篇文章里面讨论了神经元的工作原理以及如何采用数字电路模拟一个简单的神经网络。

从那时候起,很多工作逐步发展起来。然而, 伴随这些高度精确的数学模型的是复杂的计算量。近年来,随着GPU和CPU处理速度的提升,深度学习变得流行起来。

tensorflow的设计,受到了机器处理速度限制的影响。这个工具在2015年11月开源,目前能够在包括手机在内的各种计算机上运行。它可以用来编写各种训练模型,也是此时此刻最流行的深度学习框架。

计算图的基础知识

在tensorflow里面,任何事情都是构建在计算图的基础上的。如果你之前用过theano,这部分内容会看起来很熟悉。我们可以把计算图当作网络的节点,其中,每个节点都表示某种操作,就像运行某个函数一样,比如简单的加减,或者复杂的多变量运算。

每个运算可以返回一个值,或者其他的张量,这些张量可以用在后续图中。下面是一些简单的例子。

 import tensorflow as tf

 tf.add(1, 2)
# tf.sub(2, 1)
# tf.mul(2, 2)
# tf.div(2, 2)
# tf.mod(4, 5)
# tf.pow(3, 2)
# # x < y
tf.less(1, 2)
# True # x <= y
tf.less_equal(1, 1)
# True tf.greater(1, 2)
# False tf.greater_equal(1, 2)
# False tf.logical_and(True, False)
# False tf.logical_or(True, False)
# True tf.logical_xor(True, False)
# True

每个操作都能处理常量,矩阵,数组,或者多维矩阵。多维矩阵也就是一个张量,而二维张量就是一个m * m的矩阵。

 import tensorflow as tf

 # create a constant 2X2 matrix
tensor_1 = tf.constant([[1., 2.], [3.,4]]) tensor_2 = tf.constant([[5.,6.],[7.,8.]]) # create a matrix multiplication operation
output_tensor = tf.matmul(tensor_1, tensor_2) # have to run the graph using a session
sess = tf.Session() result = sess.run(output_tensor)
print(result) sess.close()

上述代码创建了两个常数张量,并把它们的成绩输出来。这个简单的例子展示了如何创建一个图并且执行它。所有需要的输入都自动运行,而且它们还可以并行的执行。执行过程涉及到图中的三个操作,创建两个常量,和矩阵的乘法。

在tensorflow中,我们创建的变量和操作会自动的加到图中。在引入tensorflow的时候,系统会自动的构建一个缺省的图。创建一个图,而不采用默认的图,在一个文件构建多个独立模型的时候,是非常有用的。

 new_graph = tf.Graph()
with new_graph.as_default():
new_g_const = tf.constant([1., 2.])

所有在with new_graph.as_default()之外的变量和操作会加到系统默认的图上,下面的代码可以得到一个默认图的句柄。

 default_g = tf.get_default_graph()

大部分情况下,这是得到系统默认图最好的方法。

运行周期

tensorflow中有两种运行周期。

tf.Session()

它封装了操作和张量执行的环境。运行周期可以有它们自己的变量,队列。所以,运行周期结束的时候,需要调用close()函数结束掉。运行周期有三个可选的参数,分别为:

1. target:要连接的执行引擎

2. graph:需要启动的图

3.config:一些配置

tf.InteractiveSession()

它和前面的tf.session()非常类似,只不过这个执行周期是为IPython和 Jupyter Notebooks设计的,它可以允许你添加一些东西,并通过调用Tensor.eval()以及Operation.run()来执行,而不需要每次执行session.run()来执行。

 sess = tf.InteractiveSession()
a = tf.constant(1)
b = tf.constant(2)
c = a + b
# instead of sess.run(c)
c.eval()

InteractiveSession 允许你不用显式的传递一个session对象。

变量

在tensorflow中,变量是由运行周期Session管理的。它们存在于session之间,这是非常有用的,因为张量和操作这些对象是不变的。变量的创建过程如下:

 tensorflow_var = tf.Variable(1, name="my_variable")

大多数时候,你希望创建各种0,1或者随机张量。

  • tf.zeros() — 创建全零矩阵
  • tf.ones() — 创建全1矩阵
  • tf.random_normal() — 两个数之间的随机数矩阵
  • tf.random_uniform() — 随机数矩阵
  • tf.truncated_normal() — 和前面类似,但是不包括大于随机方差的数

这些函数可以定义生成的矩阵的尺寸,比如

 # 4x4x4 matrix normally distribued mean 0 std 1
normal = tf.truncated_normal([4, 4, 4], mean=0.0, stddev=1.0)

为了把变量设置成这些矩阵,我们可以

 normal_var = tf.Variable(tf.truncated_normal([4,4,4] , mean=0.0, stddev=1.0)

为了初始化这些变量,需要在session里面,执行初始化操作,这和多个session运行变量是一样的。

init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

如果想要完全改变变量的值,你可以调用variable.assign()函数,这个函数也需要在一个session里面执行

 initial_var = tf.Variable(1)
changed_var = initial_var.assign(initial_var + initial_var)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
sess.run(changed_var)
#
sess.run(changed_var)
#
sess.run(changed_var)
#

有时候,你需要对变量添加一些东西,你需要执行variable.assign_add()函数,该函数输入一个数为参数,并把该数添加到变量上。函数variable.assign_sub()类似。

 counter = tf.Variable(0)
sess.run(counter.assign_add(1))
#
sess.run(counter.assign_sub(1))
# -1

作用域

为了控制模型的复杂度并尽可能简单的把模型划分成更小的片段,tensorflow引入了作用域。作用域是个非常见的概念,

 with tf.name_scope("Scope1"):
with tf.name_scope("Scope_nested"):
nested_var = tf.mul(5, 5)

可能这里还不能看到作用域的作用,但是在第二部分学习TensorBoard的时候,我们就会看到它的用途。

小结

这里展示了很多tensorflow的重要组成部分。这些独立的部分组合在一起就可以构建复杂的模型。

[tensorflow in a nutshell] tensorflow简明教程 (第一部分)的更多相关文章

  1. 2013 duilib入门简明教程 -- 第一个程序 Hello World(3)

    小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #i ...

  2. duilib入门简明教程 -- 第一个程序 Hello World(3)

    小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #i ...

  3. duilib入门简明教程 -- 第一个程序 Hello World(3) (转)

    原文转自 http://www.cnblogs.com/Alberl/p/3343579.html 小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个m ...

  4. 2013 duilib入门简明教程 -- 总结 (20)

        duilib的入门系列就到尾声了,再次提醒下,Alberl用的duilib版本是SVN上第个版本,时间是2013.08.15~       这里给出Alberl最后汇总的一个工程,戳我下载,效 ...

  5. DUILIB入门简明教程

      电子书下载: DUILIB入门简明教程.chm 文章作者:  Alberl 电子书制作: 邓学彬 目录: 2013 duilib入门简明教程 -- 前言(1) 2013 duilib入门简明教程 ...

  6. 大数据下基于Tensorflow框架的深度学习示例教程

    近几年,信息时代的快速发展产生了海量数据,诞生了无数前沿的大数据技术与应用.在当今大数据时代的产业界,商业决策日益基于数据的分析作出.当数据膨胀到一定规模时,基于机器学习对海量复杂数据的分析更能产生较 ...

  7. Anaconda、TensorFlow安装和Pycharm配置详细教程,亲测有效!

    目录 1.Anaconda下载与安装 2.Anaconda安装成功与否测试 3.安装python 4.检查TensorFlow环境添加成功与否 5.TensorFlow安装 6.测试TensorFlo ...

  8. [教程]Tensorflow + win10 + CPU + Python3.6+ 安装教程

    由于各种原因,清华镜像源已经彻底挂掉了,但是目前网上的各种教程基本上都是采取设置清华镜像源来加快下载速度,所以这给小白带来了很大的困扰!这里我将通过合理上网工具来直接下载源镜像. 注意:本次教程适用于 ...

  9. duilib教程之duilib入门简明教程3.第一个程序 Hello World

    小伙伴们有点迫不及待了么,来看一看Hello World吧:新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #in ...

随机推荐

  1. obj转换成数组

    原则上obj是不能转换成数组的.首先array也是obj.只是一个特殊的object. obj一个很关键的点,是拥有成员和方法,撇开方法不说,obj就是一个key-value结构.也就是哈希数组,而j ...

  2. 团体程序设计天梯赛-练习集L1-014. 简单题

    L1-014. 简单题 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 这次真的没骗你 —— 这道超级简单的题目没有任何输入. ...

  3. Java发送post请求

    package com.baoxiu.test; import java.io.BufferedReader;import java.io.InputStreamReader;import java. ...

  4. 【疯狂Java讲义学习笔记】【数据类型与运算符】

    [学习笔记]1.8bit = 1byte,4byte = 1word.Java中的整型数据有byte(1字节),short(2字节),int(4字节),long(8字节).Java中的浮点数据有flo ...

  5. SQL四种语言:DDL,DML,DCL,TCL

    1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema ...

  6. 网上图书商城项目学习笔记-035工具类之JdbcUtils及TxQueryRunner及C3P0配置

    事务就是保证多个操作在同一个connection,TxQueryRunner通过JdbcUtils获取连接,而JdbcUtils通过ThreadLocal<Connection>确保了不同 ...

  7. 动态改变QSS

    通常,一旦设置使用setObjectName来初始设置QSS: list_widget = new QListWidget(); list_widget->setObjectName(" ...

  8. C++拷贝对象

    简介 对象的创建中,常常有这样的需求,就是把对象复制一份. 而复制有三种方法: 1.通过初始化来复制 例如:Object o1(10); Object o2=o1; 2.通过赋值来复制 例如:Obje ...

  9. ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map

    原文地址: ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NE ...

  10. Java API ——Arrays类

    1.Arrays类概述 · 针对数组进行操作的工具类. · 提供了排序,查找等功能. 2.成员方法 · public static String toString(int[] a):in[] a可以改 ...