一、Tensorflow计算模型:计算图

计算图是Tensorflow中最基本的一个概念,Tensorflow中的所有计算都被被转化为计算图上的节点。

Tensorflow是一个通过计算图的形式来描述计算的编程系统。Tensor指张量(多维数组;表明了它的数据结构),Flow指计算图(直观地表达了张量之间通过计算相互转化的过程)。Tensorflow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。

为了建模方便,tf将常量转化成一种永远输出固定值的运算。

Tensorflow一般分为两个阶段:

  • 定义计算图中所有的计算
  • 执行计算

tf在加载过程中会自动地将定义的计算转化为计算图上的节点。

tf自动维护一个默认的计算图,如果没有特意指定,tf会将定义的计算自动转化为默认计算图上的节点。

示例:获取默认计算图 tf.get_default_graph() 以及查看一个运算所属的计算图 a.graph

>>> print(a.graph is tf.get_default_graph())
#输出为True

tf支持通过tf.Graph函数来生成新的计算图。不同计算图上的张量和运算都不会共享。 
示例:在不同计算图上定义和使用变量

import tensorflow as tf

g1=tf.Graph()
with g1.as_default():
# 在计算图g1中定义变量“v”,并设置初始值为0
v=tf.get_variable(
"v", initializer=tf.zeros_initializer()(shape=[1]))
# 新版本有更新 g2=tf.Graph()
with g2.as_default():
# 在计算图g2中定义变量“v”,并设置初始值为1
v=tf.get_variable(
"v", initializer=tf.ones_initializer()(shape=[1]))
# 新版本有更新 # 在计算图g1中读取变量“v”的取值
with tf.Session(graph=g1) as sess:
tf.global_variables_initializer().run()
# 初始化全局变量,新版本有更新
with tf.variable_scope("", reuse=True):
# 在计算图g1中,变量“v”的取值应该为0,所以下面这行会输出[0.]
print(sess.run(tf.get_variable("v"))) # 在计算图g2中读取变量“v”的取值
with tf.Session(graph=g2) as sess:
tf.global_variables_initializer().run()
# 初始化全局变量,新版本有更新
with tf.variable_scope("",reuse=True):
# 在计算图g2中,变量“v”的取值应该为1,所以下面这行会输出[1.]
print(sess.run(tf.get_variable("v")))

tf中的计算图不仅仅可以用来隔离张量和计算,还提供了管理张量和计算的机制:

示例:将加法计算跑在GPU上

import tensorflow as tf

a = tf.constant([1.0,2.0], name="a");
b = tf.constant([2.0,3.0], name="b");
g = tf.Graph()
with g.device('gpu:0'):
result = a + b
# 以上计算定义
sess = tf.Session()
print(sess.run(result))
# 执行计算

二、Tensorflow数据模型:张量

张量是tf管理数据的形式。

tf所有的数据都通过张量的形式来表示,张量可以简单理解为多维数组。但张量在tf的实现并不是直接采用数组的形式,它只是对tf中运算结果的引用。在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程。

示例:得到对结果的一个引用

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中node为节点的名称,src_output为当前张量来自节点的第几个输出;上例中result这个张量是计算节点add输出的第一个结果。
  • 张量的维度描述了一个张量的维度信息, shape=(2,)说明张量是一个一维数组,这个数组的长度为2。
  • 类型,每一个张量会有一个唯一的类型。tf会对所有参与计算的张量进行类型检查,类型不匹配时就会报错。一般建议通过dtype来明确指出变量或者常量的类型。tf支持的数据类型:实数(tf.float32,tf.float64),整数(tf.int8,tf.int16,tf.int32,tf.int64,tf.uint8),布尔型(tf.bool),复数(tf.complex64、tf.complex128)

得到结果而不是张量的几种方法:

import tensorflow as tf
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")
#方法1
sess = tf.Session()
print(sess.run(result))
sess.close() # 方法2
with tf.Session() as sess:
print(sess.run(result)) #方法3
sess = tf.Session()
with sess.as_default():
print(sess.run(result))
print(result.eval(session=sess)) #方法4
sess = tf.InteractiveSession()
print(result.eval())
sess.close()

张量使用主要可以总结为两大类:

1、对中间计算结果的引用。

当一个计算包含很多中间结果时,使用张量可以大大提高代码的可读性(类似与java中设置多个变量)。同时通过张量来存储中间结果,可以方便获取中间结果。
在卷积神经网络中,卷积层或者池化层有可能改变张量的维度,通过result.get_shape来获取结果张量的维度信息可以免去人工计算的麻烦;

2、计算图构造完成后,张量可以用来获得计算机结果,也就是得到真实的数字。张量本身没有存储具体的数字,但是通过会话就可以得到这些具体的数字。

三、Tensorflow运行模型:会话

会话拥有并管理tf程序运行时的所有资源。当所有计算完成后需要关闭会话来帮助系统系统回收资源,否则会出现资源泄露问题。 
tf使用会话有两种模式:

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

# 创建一个会话
sess = tf.Session()
# 使用这个创建好的会话来得到关心的运算的结果。比如可以调用sess.run(result)来得到张量result的取值
sess.run(...)
sess.close()

上面这种模式,如果程序发生异常退出时,关闭会话的函数可能不被执行;此时,可以通过python的上下文管理器来使用会话:

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

如前所述,tf会自动生成一个默认的计算图,但如果没有特殊指定,运算会自动加入这个到这个计算图中;
tf的会话也有类似的机制,但tf不会自动生成默认的对话,需要手动指定。默认的对话被指定后可以tf.Tensor.eval来计算一个张量的取值。
示例:通过设定默认会话计算张量的取值

sess = tf.Session()
with sess.as_default():
print(result.eval())

等价代码:

sess = tf.Session()

# 下面的两个命令有相同的功能
print(sess.run(result))
print(result.eval(session=sess))

交互式环境下,通过设置默认会话的方式来获取张量的取值更加方便。所以tf提供了一种在交互式环境下直接构建默认会话的函数——tf.InteractiveSession().这个函数会自动将生成的会话注册为默认会话

sess = tf.InteractiveSession()
print(result.eval())
sess.close()

示例:通过ConfigProto配置会话

config = tf.ConfigProto(allow_soft_placement=True, 
               log_device_placement=True)
sess1 = tf.InteractiveSession(config=config)
sess2 = tf.Session(config=config)

三、Tensorflow实现神经网络

tf游乐场及神经网络介绍:http://playground.tensorflow.org
特征提取(把实际问题变成平面上的一个点)。
在机器学习中,用于描述实体的数字的组合就是一个实体的特征向量,特征向量是神经网络的输入。
目前的主流神经网络都是分层的结构;第一层是输入层,代表特征向量中每一个特征的取值。每一层只和下一层连接,直到最后一层作为输出层得到计算结果;
输入层和输出层之间称为隐藏层;隐藏层的每一层有节点数,此外,还有学习率、激活函数、正则化都与学习效果密切相关。

使用神经网络解决分类问题的4个步骤:

  • 提取问题中实体的特征向量作为神经网络的输入,不同实体可以提取不同的特征向量;
  • 前向传播算法:定义神经网络的结构,并定义如何从神经网络的输入得到输出;
  • 通过训练数据来调整神经网络中参数的取值,即训练神经网络。 后面会介绍表示神经网络参数的方法,神经网络优化算法的框架,如何通过tf实现这个框架;
  • 使用训练好的神经网络来预测未知的数据。

计算神经网络的前向传播结果需要三部分信息:

  • 神经网络的输入。即从实体中提取出的特征向量;
  • 神经网络的连接结构。神经网络是由神经元构成的,神经网络的结构给出不同神经元之间输入输出的关系。后面把神经元统称为节点;
  • 每个节点的参数。给定神经网络的输入,神经网络的结构以及边上权重,就可以通过前向传播算法来计算出神经网络的输出。

《TensorFlow实战Google深度学习框架》笔记——TensorFlow入门的更多相关文章

  1. [Tensorflow实战Google深度学习框架]笔记4

    本系列为Tensorflow实战Google深度学习框架知识笔记,仅为博主看书过程中觉得较为重要的知识点,简单摘要下来,内容较为零散,请见谅. 2017-11-06 [第五章] MNIST数字识别问题 ...

  2. TensorFlow+实战Google深度学习框架学习笔记(5)----神经网络训练步骤

    一.TensorFlow实战Google深度学习框架学习 1.步骤: 1.定义神经网络的结构和前向传播的输出结果. 2.定义损失函数以及选择反向传播优化的算法. 3.生成会话(session)并且在训 ...

  3. 1 如何使用pb文件保存和恢复模型进行迁移学习(学习Tensorflow 实战google深度学习框架)

    学习过程是Tensorflow 实战google深度学习框架一书的第六章的迁移学习环节. 具体见我提出的问题:https://www.tensorflowers.cn/t/5314 参考https:/ ...

  4. 学习《TensorFlow实战Google深度学习框架 (第2版) 》中文PDF和代码

    TensorFlow是谷歌2015年开源的主流深度学习框架,目前已得到广泛应用.<TensorFlow:实战Google深度学习框架(第2版)>为TensorFlow入门参考书,帮助快速. ...

  5. TensorFlow实战Google深度学习框架-人工智能教程-自学人工智能的第二天-深度学习

    自学人工智能的第一天 "TensorFlow 是谷歌 2015 年开源的主流深度学习框架,目前已得到广泛应用.本书为 TensorFlow 入门参考书,旨在帮助读者以快速.有效的方式上手 T ...

  6. TensorFlow实战Google深度学习框架10-12章学习笔记

    目录 第10章 TensorFlow高层封装 第11章 TensorBoard可视化 第12章 TensorFlow计算加速 第10章 TensorFlow高层封装 目前比较流行的TensorFlow ...

  7. TensorFlow实战Google深度学习框架5-7章学习笔记

    目录 第5章 MNIST数字识别问题 第6章 图像识别与卷积神经网络 第7章 图像数据处理 第5章 MNIST数字识别问题 MNIST是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会 ...

  8. TensorFlow实战Google深度学习框架1-4章学习笔记

    目录 第1章 深度学习简介 第2章 TensorFlow环境搭建 第3章 TensorFlow入门 第4章 深层神经网络   第1章 深度学习简介 对于许多机器学习问题来说,特征提取不是一件简单的事情 ...

  9. Tensorflow实战Google深度学习框架-总结-1

    第一章:深度学习简介   1⃣️应用有 1.计算机视觉 2.语音识别 3.自然语言处理 4.人机博弈   2⃣️深度学习,机器学习,AI 的关系

随机推荐

  1. 「SPOJ10707」Count on a tree II

    「SPOJ10707」Count on a tree II 传送门 树上莫队板子题. 锻炼基础,没什么好说的. 参考代码: #include <algorithm> #include &l ...

  2. 「HNOI2016」大数

    题目描述 给定一个质数\(p\)和一个数字序列,每次询问一段区间\([l,r]\), 求出该序列区间\([l,r]\)内的所有子串,满足该子串所形成的数是\(p\)的倍数(样例的解释也挺直观的) 基本 ...

  3. .Net后台实现微信APP支付

    上一节分享了微信小程序支付的后台,这一节来分享一下微信APP支付的后台.微信APP支付和微信小程序差别不大,微信APP支付后台不需要微信登录凭证.后台下单时交易类型(trade_type)不再是&qu ...

  4. 一键GHOST使用图文教程

    一.准备工作 系统安装好以后,对系统进行及时备份,以防不测,以后恢复时三五分钟即可完成,还你一个全新的完整系统. 一键GHOST V8.3 Build 060903 硬盘版免费下载 从以上地址下载软件 ...

  5. OC中四种遍历方式

    标准的C语言for循环.Objective-C 1.0出现的NSEnumerator.Objective-C 1.0出现的for in快速遍历.块遍历. 遍历的话,一般是NSArray.NSDicti ...

  6. Python用户界面编程PyQt5的四种的布局方式

    1.QT是C++编写的跨平台GUI库,GUI是指桌面程序应用. 2.开发基于pyqt5的桌面应用程序必须要使用两个类Qapplication和Qwidget类,都在PyQt5.Qt.widgets里面 ...

  7. Pytorch 初次使用nn包

    计算图和autograd是十分强大的工具,可以定义复杂的操作并自动求导:然而对于大规模的网络,autograd太过于底层. 在构建神经网络时,我们经常考虑将计算安排成层,其中一些具有可学习的参数,它们 ...

  8. 分布估计算法解决TSP问题

    分布估计算法解决旅行商问题(TSP) TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出.问题描述 ...

  9. Linux CentOS7 VMware正则介绍、grep工具、egrep表达式

    一.正则介绍 正则是学习shell脚本的必学的内容,正则学的好坏直接影响到shell编程能力. 正则表达式:使用单个字符串来描述或匹配一系列符合某个句法规则的字符串.通常用来检索和替换那些符合某个模式 ...

  10. 修剪草坪 HYSBZ - 2442

    在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠. 然而,FJ的草坪非常脏乱,因此,FJ只能够让他的奶牛来完成这项工作.F ...