【TensorFlow学习笔记】基础篇(三)— —TensorFlow框架

在这里插入图片描述
深度学习, 神经网络,人工智能应该是当下最火爆的字眼了,随着AlphaGo的一炮走红,仿佛人人都谈论着人工智能, 说话不带DL, CNN这些就落伍了。

各大巨头也纷纷在AI领域布局, 目前比较流行的深度学习框架有:

  • 谷歌的开源深度学习框架TensorFlow
  • Facebook的开源深度学习框架Torchnet
  • 百度的开源深度学习框架Paddle
  • 源自伯克利的Caffe
  • 基于Theano/TensorFlow的Keras
    ·····

那么接下来我们将采用谷歌开源的TensorFlow框架,开启深度学习的学习之旅。



1.简介

TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。
TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。

因为 Tensorflow 只是一个很基础的库和框架, 如果你要训练一个完全可用的模型, 还需要你具有相当的深度学习知识。 如果我们把模型比作一个房子的话, 那么 Tensorflow 相当于给你一些砖和水泥,和脚手架之类,至于房子有几层, 什么朝向之类,还需要你自己来决定。 那么训练一个可用的模型就好像在这种情况下修一个好住的房子一样,需要你具有相关的知识和经验。

不过这个目前不是一个问题,因为 Google 的工程师和研究人员在开源框架的同时, 也开源了他们针对各种问题进行机器学习的代码和模型(当然是基于 Tensorflow 的), 这相当于公开了房子的设计图,我们就可以从这里入手,先实现,再优化, 再创造。

官方模型

我们可以在TensorFlow Models 找到很多已经设计好的模型
在这里插入图片描述
1.official 目录里面是正式发布的模型
2.research 目录里面是由谷歌的研究人员们写的模型
3.tutorials 目录里面是TensorFlow教程里面用到的模型

在继续往下讲之前,我们先说一下本系列文章中模型的定义, 一个模型由两个部分组成:

  • 第一部分是用于生成或者说训练模型的代码,包含如何提取和处理输入数据的特征, 如何构建神经网络(比如神经网络有几层)等
  • 第二部分就是通过这个代码加上大量数据训练出来的模型二进制文件,我们叫做Pre-trained model(这部分不是每一个模型都包含),然后通过迁移学习将Pre-trained model运用到我们的实际项目中

例如:
我们可以使用 Tensorflow Object Detection API 来进行静态图片的物体识别,我们可以在 Model Zoo里面找到我们需要的 Pre-trained model , 一共有5个

在这里插入图片描述
第一列为Pre-trained model的名字, 第二列为模型的识别速度, 第三列为衡量识别效果的一个指标,越高越好, 第三列为输出形式,都是输出识别物体的Box(物体在图片中的位置,矩形框)。

在实际项目开发中,我们更多的是使用别人已经训练好的模型进行迁移使用,但在此之前,了解深度学习框架,学会搭建神经网络,可以让我们更好地了解和运用Pre-trained model进行迁移学习。所以接下来,让我们一步一步的打好基础吧。

2. 数据流图

在这里插入图片描述
什么是数据流图(Data Flow Graph)?
数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点” 一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。

3. 基本使用框架

要想使用 TensorFlow, 你必须明白 TensorFlow:

  • 用张量(tensor)表示数据
  • 用计算图(Graph)搭建神经网络
  • 用会话(Session)执行计算图,优化线上的权重(参数w),得到模型
  • 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据

TensorFlow 是一个编程系统, 使用图来表示计算任务. 图中的节点被称之为 op (operation 的缩写). 一个 op 获得 0 个或多个 Tensor, 执行计算, 产生 0 个或多个 Tensor.每个 Tensor 是一个类型化的多维数组. 例如, 你可以将一小组图像集表示为一个四维浮点数数组, 这四个维度分别是 [batch, height, width, channels].

一个 TensorFlow 图描述了计算的过程. 为了进行计算, 图必须在 会话 里被启动. 会话 将图的 op 分发到诸如 CPU 或 GPU 之类的 设备 上, 同时提供执行 op 的方法. 这些方法执行后, 将产生的 tensor 返回. 在 Python 语言中, 返回的 tensor 是 numpy ndarray 对象; 在 C 和 C++ 语言中, 返回的 tensor 是 tensorflow::Tensor 实例.

3.1 张量(tensor)

  • 张量(tensor): 张量可以表示0阶到n阶数组(列表)
  • 阶:张量的维数
  • 数据类型 :tf.float32 tf.int32 ···
维数 名字 例子
0-D 0 标量 scalar
1-D 1 向量 vector v=[1,2,3]
2-D 2 矩阵 matrix m=[[1,2,3],[4,5,6],[7,8,9]
n-D n 张量 tensor t=[[[…(张量的维度可以通过方括号的个数来确定)
# 导入TensorFlow模块
import tensorflow as tf
 
# 数据类型
# 定义一个张量[1.0,2.0]
a=tf.constant([1.0,2.0])
# 定义一个张量[3.0,4.0]
b=tf.constant([3.0,4.0])
# 实现一维向量加法
result = a+b
# 输出 
print(result)
# 结果如下(输出的结果不是运算的结果) add:0 节点名:第0个输出;shape=(2,) shape维度  (2,)一维数组长度为2 dtype数据类型
# Tensor("add:0", shape=(2,), dtype=float32)
# result是一个名称为add:0的张量,shape=(2,)表示一维数组长度为2,dtype=float32表示数据类型为浮点型

3.2 计算图(graph)

计算图: 搭建神经网络的计算过程,只搭建,不运算
在这里插入图片描述
在前一讲中我们讲到,神经网络是由很多个神经元组成的。每个神经元的基本操作为数学运算中的加、乘运算。其中每条线上的w分别是输入在结果中占的权重。x1、x2表示输入,w1、w2分别是x1到y和x2到y的权重,y=x1w1+x2w2。

import tensorflow as tf
# 计算图(Graph)搭建神经网络的计算过程,只搭建不运算
#  y = x1*W1 + x2*W2 其中w1和w2 分别是x1和x2到y的权重值
x1=tf.constant([[1.0,2.0]])  # x1是一个1行2列的张量
x2=tf.constant([[3.0],[4.0]]) #x2是一个2行1列的张量
y=tf.matmul(x1,x2) #用tf调用matmul# 实现矩阵乘法
print(y)
'''
# 结果如下(输出的结果不是运算的结果,是一个张量Tensor)
Tensor("MatMul:0", shape=(1, 1), dtype=float32)

MatMul:节点名
0:第0个输出
shape:维度,2行0列
dtype:数据类型
'''

3.3 会话(session)

会话(Session):执行计算图中的节点运算,通过下面的代码将结果存入会话(Session)中,再通过输出sess对象得到结果

with tf.Session() as sess:
    print(sess.run(result))

则上面两个实例关于向量&关于矩阵的运算都可以输出结果,如下

#向量加法运算
import tensorflow as tf
a=tf.constant([1.0,2.0])
b=tf.constant([3.0,4.0])
result = a+b #实现一维向量加法
print(result)
with tf.Session() as sess:
    print(sess.run(result))
#结果 
# Tensor("add:0", shape=(2,), dtype=float32)
# [4. 6.] 二维数组
import tensorflow as tf
# 矩阵乘法运算
x=tf.constant([[1.0,2.0]])
w=tf.constant([[3.0],[4.0]])
y=tf.matmul(x,w)
print(y)
with tf.Session()as sess:
    print(sess.run(y))
# 结果
# Tensor("MatMul:0", shape=(1, 1), dtype=float32)
# [[11.]]

3.4 Fetch

为了取回操作的输出内容, 可以在使用 Session 对象的 run() 调用 执行图时, 传入一些 tensor, 这些 tensor 会帮助你取回结果. 在之前的例子里, 我们只取回了单个节点 state, 但是你也可以取回多个 tensor:

python
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)

with tf.Session():
  result = sess.run([mul, intermed])
  print result


# 输出:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]

需要获取的多个 tensor 值,在 op 的一次运行中一起获得(而不是逐个去获取 tensor)。

3.5 Feed

上述示例在计算图中引入了 tensor, 以常量或变量的形式存储. TensorFlow 还提供了 feed 机制, 该机制可以临时替代图中的任意操作中的 tensor 可以对图中任何操作提交补丁, 直接插入一个 tensor.

feed 使用一个 tensor 值临时替换一个操作的输出结果. 你可以提供 feed 数据作为 run() 调用的参数. feed 只在调用它的方法内有效, 方法结束, feed 就会消失. 最常见的用例是将某些特殊的操作指定为 “feed” 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符.

input1 = tf.placeholder(tf.types.float32)
input2 = tf.placeholder(tf.types.float32)
output = tf.mul(input1, input2)

with tf.Session() as sess:
  print sess.run([output], feed_dict={input1:[7.], input2:[2.]})

# 输出:
# [array([ 14.], dtype=float32)]

总结

TensorFlow神经网络的几个基本点:

在 TensorFlow 中,数据不是以整数、浮点数或者字符串形式存储的。这些值被封装在一个叫做 tensor 的对象中;tf.constant 返回的 tensor 是一个常量 tensor,因为这个 tensor 的值不会变

  • 操作(Op/operation):在 TensorFlow 的运行时中,它是一种类似 add 或 matmul 或 concat的运算
  • 张量(Tensor):表示数据。Tensor是一种特定的多维数组。每一个tensor值在graph上都是一个op
  • 计算图(Graph):描述运算任务。把运算任务描述成一个直接的无环图形(DAG),图表中的节点(node)代表必须要实现的一些操作。图中的边代表数据或者可控的依赖。
  • 会话(Session):运行Tensorflow操作的类,Session 提供在图中执行操作的一些方法。Session封装了被执行操作和Tensor计算的环境,运行session.run()可以获得你要进行运算的结果。启动图的第一步是创建一个 Session 对象。
  • tf.placeholder(dtype,shape=None,name=None) :在实际应用中,我们可以一次喂入一组或多组输入,先用tf.placeholder给输入占位,方便输入的处理。dtype:数据类型,喂给TensorFlow的张量元素的类型; shape:数据形状[x,y];表示有x组输入,y表示每组输入有y个特征。name:名称;返回值:张量Tensor类型
发布了28 篇原创文章 · 获赞 2 · 访问量 2812

猜你喜欢

转载自blog.csdn.net/Jarvis_lele/article/details/104975962