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

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

时间:2024-02-01 21:07:04浏览次数:21  
标签:sess 会话 graph sum 深度 print TensorFlow tf 基本操作

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

欢迎大家点赞转发~


共 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的名字以及命名空间
  • 应用

  • 内容预览

    • 2.2.1 什么是图结构

    • 2.2.2 图相关操作

      • 1 默认图
      • 2 创建图
    • 2.2.3 TensorBoard:可视化学习

      • 1 数据序列化-events文件
      • 2 启动TensorBoard
    • 2.2.4 OP

      • 1 常见OP
      • 2 指令名称

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 可视化工具。

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模块我们可以看到以下图结构 <center></center>

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" )

OP名字修改

2.3 会话

学习目标

  • 目标

    • 应用sess.run或者eval运行图程序并获取张量值
    • 应用feed_dict机制实现运行时填充数据
    • 应用placeholder实现创建占位符
  • 应用

  • 内容预览

    • 2.3.1 会话

      • 1 init(target='', graph=None, config=None)
      • 2 会话的run()
      • 3 feed操作

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)
    • 通过使用sess.run()来运行operation

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

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

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

使用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不存在的键。

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

欢迎大家点赞转发~

符 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:

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

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

欢迎大家点赞转发~

标签:sess,会话,graph,sum,深度,print,TensorFlow,tf,基本操作
From: https://blog.51cto.com/u_13578013/9535766

相关文章

  • 深度学习-DNN深度神经网络-反向传播-40
    目录人工神经网络有两个或两个以上隐藏层,称为DNN深度神经网络三种常见的激活函数及其导数--复习前面所学线性回归更新权重逻辑回归多分类......
  • 深度学习奖励规则
      111111111111111111111111111111111111111111111111111111111111      1 1王者荣耀,-觉悟机器人,深度学习训练阿尔法go,深度学习; 1 1 1 1智能体环境动作要素奖励 1......
  • 面试官:Mysql千万级大表如何进行深度分页优化?
    背景假如有一张千万级的订单表,这张表没有采用分区分表,也没有使用ES等技术,分页查询进行到一定深度分页之后(比如1000万行后)查询比较缓慢,我们该如何进行优化?数据准备订单表结构如下:CREATETABLE`t_order`(`id`BIGINT(20)UNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT......
  • Java字符串池(String Pool)深度解析
    在工作中,String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,这就是我们今天要讨论的核心,即字符串池(StringPool)。字符串池由String类私有的维护。   我们知道,在Java中有两种创建字符串对象的方式:1......
  • Viper基本操作
    一、概述Viper主要是操作:1.读取命令行参数2.读取环境变量3.读取配置文件这比配置参数直接写在代码中方便的多,而且还支持配置热加载导入vipergoget-ugithub.com/spf13/viper 二、代码示例1.在代码中读取设置默认配置......
  • 打造高效经营:开发连锁餐饮管理系统的技术深度解析
    为了适应市场的快速发展和提高经营效率,许多连锁餐饮企业纷纷投入开发连锁餐饮管理系统。 一、数字化转型的动力传统的餐饮经营面临着诸多挑战,如订单管理、库存控制、人力资源等问题。在这样的背景下,连锁餐饮企业迫切需要一种全面而高效的解决方案,以提升业务水平、降低成本。开发连......
  • 【深度思考】一线开发大头兵对于工作的感悟分享
    目录前言一、工作方式方法1.1先尽人事1.2关注个人成长1.3work&lifebalance二、构建知识体系2.1夯实基础2.2抽象思维2.3广度与深度三、尽早规划职业3.1市场现状3.2如何破局四、文章小结前言写在前面的是关于自己的一点介绍,21年本科毕业,学的是计算机科学与技术专业,到现在工作(实习......
  • Qt 深度解析QMap与QHash
    一、QMap深度解析1、QMap是一个以升序键顺序存储键值对的数据结构(1)QMap原型为classQMap<K,T>模板(2)、QMap中的键值对根据key进行了排序(3)、QMap中的key类型必须重载operator<(小于操作符)2、QMap使用实例一 3、QMap使用实例二4、QMap的注意事项(1)、通过key获取Value时......
  • 文本分类识别Python+卷积神经网络算法+TensorFlow模型训练+Django可视化界面
    一、介绍文本分类系统,使用Python作为主要开发语言,通过选取的中文文本数据集("体育类","财经类","房产类","家居类","教育类","科技类","时尚类","时政类","游戏类","娱乐类"),基于TensorFlow搭建CNN卷积神经网络算法模型,并进行多轮迭代训练最后得到一个识......
  • 快乐学Python,DataFrame的基本操作
    在上一篇文章中,我们了解了如何使用pandas的函数来从多种数据源:csv、excel和html网页。其中不管是哪一种数据读取的方式,最终返回的都是一个DataFrame对象。对于DataFrame对象,我们只是简单将其打印出来,这一篇我们来学习围绕DataFrame的基本操作(添加行、列,删除行、列,排序......