【深度学习】从0完整讲透深度学习第2篇:TensorFlow介绍和基本操作(代码文档已分享)

本系列文章md笔记(已分享)主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归(含代码),熟练掌握numpy,pandas,sklearn等框架使用。在算法上,掌握神经网络的数学原理,手动实现简单的神经网络结构,在应用上熟练掌握TensorFlow框架使用,掌握神经网络图像相关案例。具体包括:TensorFlow的数据流图结构,神经网络与tf.keras,卷积神经网络(CNN),商品物体检测项目介绍,YOLO与SSD,商品检测数据集训练和模型导出与部署。

全套笔记和代码自取在个人博客: https://www.666mao.com/sku?skuId=6

感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~

共 9 章,60 子模块

TensorFlow介绍

说明TensorFlow的数据流图结构
应用TensorFlow操作图
说明会话在TensorFlow程序中的作用
应用TensorFlow实现张量的创建、形状类型修改操作
应用Variable实现变量op的创建
应用Tensorboard实现图结构以及张量值的显示
应用tf.train.saver实现TensorFlow的模型保存以及加载
应用tf.app.flags实现命令行参数添加和使用
应用TensorFlow实现线性回归

2.2 图与TensorBoard

学习目标

  • 目标

    • 说明图的基本使用

    • 应用tf.Graph创建图、tf.get_default_graph获取默认图

    • 知道开启TensorBoard过程

    • 知道图当中op的名字以及命名空间

  • 应用

  • 内容预览

    • 1 常见OP

    • 2 指令名称

    • 1 数据序列化-events文件

    • 2 启动TensorBoard

    • 1 默认图

    • 2 创建图

    • 2.2.1 什么是图结构

    • 2.2.2 图相关操作

    • 2.2.3 TensorBoard:可视化学习

    • 2.2.4 OP

2.2.1 什么是图结构

图包含了一组tf.Operation代表的计算单元对象和tf.Tensor代表的计算单元之间流动的数据。

2.2.2 图相关操作

1 默认图

通常TensorFlow会默认帮我们创建一张图。

查看默认图的两种方法:

  • 通过调用tf.get_default_graph()访问 ,要将操作添加到默认图形中,直接创建OP即可。

  • op、sess都含有graph属性 ,默认都在一张图中

def graph_demo():
   # 图的演示
   a_t = tf.constant(10)
   b_t = tf.constant(20)
   # 不提倡直接运用这种符号运算符进行计算
   # 更常用tensorflow提供的函数进行计算
   # c_t = a_t + b_t
   c_t = tf.add(a_t, b_t)
   print(“tensorflow实现加法运算:\n”, c_t)

   # 获取默认图
   default_g = tf.get_default_graph()
   print(“获取默认图:\n”, default_g)

   # 数据的图属性
   print(“a_t的graph:\n”, a_t.graph)
   print(“b_t的graph:\n”, b_t.graph)
   # 操作的图属性
   print(“c_t的graph:\n”, c_t.graph)

   # 开启会话
   with tf.Session() as sess:
       sum_t = sess.run(c_t)
       print(“在sess当中的sum_t:\n”, sum_t)
       # 会话的图属性
       print(“会话的图属性:\n”, sess.graph)

   return None

2 创建图

  • 可以通过tf.Graph()自定义创建图

  • 如果要在这张图中创建OP,典型用法是使用tf.Graph.as_default()上下文管理器

def graph_demo():
   # 图的演示
   a_t = tf.constant(10)
   b_t = tf.constant(20)
   # 不提倡直接运用这种符号运算符进行计算
   # 更常用tensorflow提供的函数进行计算
   # c_t = a_t + b_t
   c_t = tf.add(a_t, b_t)
   print(“tensorflow实现加法运算:\n”, c_t)

   # 获取默认图
   default_g = tf.get_default_graph()
   print(“获取默认图:\n”, default_g)

   # 数据的图属性
   print(“a_t的graph:\n”, a_t.graph)
   print(“b_t的graph:\n”, b_t.graph)
   # 操作的图属性
   print(“c_t的graph:\n”, c_t.graph)

   # 自定义图
   new_g = tf.Graph()
   print(“自定义图:\n”, new_g)
   # 在自定义图中去定义数据和操作
   with new_g.as_default():
       new_a = tf.constant(30)
       new_b = tf.constant(40)
       new_c = tf.add(new_a, new_b)

   # 数据的图属性
   print(“new_a的graph:\n”, new_a.graph)
   print(“new_b的graph:\n”, new_b.graph)
   # 操作的图属性
   print(“new_c的graph:\n”, new_c.graph)

   # 开启会话
   with tf.Session() as sess:
       sum_t = sess.run(c_t)
       print(“在sess当中的sum_t:\n”, sum_t)
       # 会话的图属性
       print(“会话的图属性:\n”, sess.graph)
       # 不同的图之间不能互相访问
       # sum_new = sess.run(new_c)
       # print(“在sess当中的sum_new:\n”, sum_new)

   with tf.Session(graph=new_g) as sess2:
       sum_new = sess2.run(new_c)
       print(“在sess2当中的sum_new:\n”, sum_new)
       print(“会话的图属性:\n”, sess2.graph)

   # 很少会同时开启不同的图,一般用默认的图就够了
   return None

TensorFlow有一个亮点就是,我们能看到自己写的程序的可视化效果,这个功能就是Tensorboard。在这里我们先简单介绍一下其基本功能。

2.2.3 TensorBoard:可视化学习

TensorFlow 可用于训练大规模深度神经网络所需的计算,使用该工具涉及的计算往往复杂而深奥。为了更方便 TensorFlow 程序的理解、调试与优化,TensorFlow提供了TensorBoard 可视化工具。

实现程序可视化过程:

1 数据序列化-events文件

TensorBoard 通过读取 TensorFlow 的事件文件来运行,需要将数据生成一个序列化的 Summary protobuf 对象。

 
 
# 返回filewriter,写入事件文件到指定目录(最好用绝对路径),以提供给tensorboard使用
 
 
tf.summary.FileWriter(‘./tmp/summary/test/’, graph=sess.graph)

这将在指定目录中生成一个 event 文件,其名称格式如下:

events.out.tfevents.{timestamp}.{hostname}

2 启动TensorBoard

tensorboard  –logdir=”./tmp/tensorflow/summary/test/”

在浏览器中打开 TensorBoard 的图页面 127.0.0.1:6006,会看到与以下图形类似的图,在GRAPHS模块我们可以看到以下图结构

![](https://it-res-md-1300471212.cos.ap-beijing.myqcloud.com/blog_md/IT003004002@深度学习笔记/images/add图.png)

2.2.4 OP

2.2.4.1 常见OP

哪些是OP?

类型实例标量运算add, sub, mul, div, exp, log, greater, less, equal向量运算concat, slice, splot, constant, rank, shape, shuffle矩阵运算matmul, matrixinverse, matrixdateminant带状态的运算Variable, assgin, assginadd神经网络组件softmax, sigmoid, relu,convolution,max_pool存储, 恢复Save, Restroe队列及同步运算Enqueue, Dequeue, MutexAcquire, MutexRelease控制流Merge, Switch, Enter, Leave, NextIteration

一个操作对象(Operation)是TensorFlow图中的一个节点, 可以接收0个或者多个输入Tensor, 并且可以输出0个或者多个Tensor,Operation对象是通过op构造函数(如tf.matmul())创建的。

例如: c = tf.matmul(a, b) 创建了一个Operation对象,类型为 MatMul类型, 它将张量a, b作为输入,c作为输出,,并且输出数据,打印的时候也是打印的数据。其中tf.matmul()是函数,在执行matmul函数的过程中会通过MatMul类创建一个与之对应的对象

 
 
# 实现一个加法运算
 
 
con_a = tf.constant(3.0)
con_b = tf.constant(4.0)

sum_c = tf.add(con_a, con_b)

print(“打印con_a:\n”, con_a)
print(“打印con_b:\n”, con_b)
print(“打印sum_c:\n”, sum_c)

打印语句会生成:

打印con_a:
Tensor(“Const:0”, shape=(), dtype=float32)
打印con_b:
Tensor(“Const_1:0”, shape=(), dtype=float32)
打印sum_c:
Tensor(“Add:0”, shape=(), dtype=float32)

注意,打印出来的是张量值,可以理解成OP当中包含了这个值。并且每一个OP指令都对应一个唯一的名称,如上面的Const:0,这个在TensorBoard上面也可以显示

请注意,tf.Tensor 对象以输出该张量的 tf.Operation 明确命名。张量名称的形式为 “<OP_NAME>:<i>“,其中:

  • “<OP_NAME>” 是生成该张量的指令的名称

  • <i>” 是一个整数,它表示该张量在指令的输出中的索引

2.2.4.2 指令名称

tf.Graph对象为其包含的 tf.Operation对象定义的一个命名空间。TensorFlow 会自动为图中的每个指令选择一个唯一名称,用户也可以指定描述性名称,使程序阅读起来更轻松。我们可以以以下方式改写指令名称

  • 每个创建新的 tf.Operation 或返回新的 tf.Tensor 的 API 函数可以接受可选的 name 参数。

例如,tf.constant(42.0, name=”answer”) 创建了一个名为 “answer” 的新 tf.Operation 并返回一个名为 “answer:0” 的 tf.Tensor。如果默认图已包含名为 “answer” 的指令,则 TensorFlow 会在名称上附加 “1”、”2″ 等字符,以便让名称具有唯一性。

  • 当修改好之后,我们在Tensorboard显示的名字也会被修改

a = tf.constant(3.0, name=”a”)
b = tf.constant(4.0, name=”b” )

2.3 会话

学习目标

  • 目标

    • 应用sess.run或者eval运行图程序并获取张量值

    • 应用feed_dict机制实现运行时填充数据

    • 应用placeholder实现创建占位符

  • 应用

  • 内容预览

    • 1 init(target=”, graph=None, config=None)

    • 2 会话的run()

    • 3 feed操作

    • 2.3.1 会话

2.3.1 会话

一个运行TensorFlow operation的类。会话包含以下两种开启方式

  • tf.Session:用于完整的程序当中

  • tf.InteractiveSession:用于交互式上下文中的TensorFlow ,例如shell

1 TensorFlow 使用 tf.Session 类来表示客户端程序(通常为 Python 程序,但也提供了使用其他语言的类似接口)与 C++ 运行时之间的连接

2 tf.Session 对象使用分布式 TensorFlow 运行时提供对本地计算机中的设备和远程设备的访问权限。

2.3.1.1 init(target=”, graph=None, config=None)

会话可能拥有的资源,如 tf.Variable,tf.QueueBase和tf.ReaderBase。当这些资源不再需要时,释放这些资源非常重要。因此,需要调用tf.Session.close会话中的方法,或将会话用作上下文管理器。以下两个例子作用是一样的:

def session_demo():
   “””
   会话演示
   :return:
   “””

   a_t = tf.constant(10)
   b_t = tf.constant(20)
   # 不提倡直接运用这种符号运算符进行计算
   # 更常用tensorflow提供的函数进行计算
   # c_t = a_t + b_t
   c_t = tf.add(a_t, b_t)
   print(“tensorflow实现加法运算:\n”, c_t)

   # 开启会话
   # 传统的会话定义
   # sess = tf.Session()
   # sum_t = sess.run(c_t)
   # print(“sum_t:\n”, sum_t)
   # sess.close()

   # 开启会话
   with tf.Session() as sess:
       # sum_t = sess.run(c_t)
       # 想同时执行多个tensor
       print(sess.run([a_t, b_t, c_t]))
       # 方便获取张量值的方法
       # print(“在sess当中的sum_t:\n”, c_t.eval())
       # 会话的图属性
       print(“会话的图属性:\n”, sess.graph)

   return None

  • target:如果将此参数留空(默认设置),会话将仅使用本地计算机中的设备。可以指定 grpc:// 网址,以便指定 TensorFlow 服务器的地址,这使得会话可以访问该服务器控制的计算机上的所有设备。

  • graph:默认情况下,新的 tf.Session 将绑定到当前的默认图。

  • config:此参数允许您指定一个 tf.ConfigProto 以便控制会话的行为。例如,ConfigProto协议用于打印设备使用信息

 
 
# 运行会话并打印设备信息
 
 
sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,
                                       log_device_placement=True))

会话可以分配不同的资源在不同的设备上运行。

/job:worker/replica:0/task:0/device:CPU:0

device_type:类型设备(例如CPU,GPU,TPU)

2.3.1.2 会话的run()

  • run(fetches,feed_dict=None, options=None, run_metadata=None)

    • 与tf.placeholder搭配使用,则会检查值的形状是否与占位符兼容。

    • 通过使用sess.run()来运行operation

    • fetches:单一的operation,或者列表、元组(其它不属于tensorflow的类型不行)

    • feed_dict:参数允许调用者覆盖图中张量的值,运行时赋值

使用tf.operation.eval()也可运行operation,但需要在会话中运行

 
 
# 创建图
 
 
a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b

 
 
# 创建会话
 
 
sess = tf.Session()

 
 
# 计算C的值
 
 
print(sess.run(c))
print(c.eval(session=sess))

2.3.1.3 feed操作

  • placeholder提供占位符,run时候通过feed_dict指定参数

def session_run_demo():
   “””
   会话的run方法
   :return:
   “””
   # 定义占位符
   a = tf.placeholder(tf.float32)
   b = tf.placeholder(tf.float32)
   sum_ab = tf.add(a, b)
   print(“sum_ab:\n”, sum_ab)
   # 开启会话
   with tf.Session() as sess:
       print(“占位符的结果:\n”, sess.run(sum_ab, feed_dict={a: 3.0, b: 4.0}))
   return None

请注意运行时候报的错误error:

RuntimeError:如果这Session是无效状态(例如已关闭)。
TypeError:如果fetches或者feed_dict键的类型不合适。
ValueError:如果fetches或feed_dict键无效或引用 Tensor不存在的键。

未完待续, 同学们请等待下一期

全套笔记和代码自取在个人博客: https://www.666mao.com/sku?skuId=6

感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~

资源下载: