tensorflow自学之前的bigpicture

本文介绍了TensorFlow的基础概念,包括计算图、会话、变量、占位符等,并通过一个手写数字识别实例展示了如何构建和训练模型。
部署运行你感兴趣的模型镜像

一、前言

目前,深度学习已经广泛应用于各个领域,比如图像识别,图形定位与检测,语音识别,机器翻译等等,对于这个神奇的领域,很多童鞋想要一探究竟,这里抛砖引玉的简单介绍下最火的深度学习开源框架 tensorflow。本教程不是 cookbook,所以不会将所有的东西都事无巨细的讲到,所有的示例都将使用 python。

那么本篇教程会讲到什么?首先是一些基础概念,包括计算图,graph 与 session,基础数据结构,Variable,placeholder 与 feed_dict 以及使用它们时需要注意的点。最后给出了在 tensorflow 中建立一个机器学习模型步骤,并用一个手写数字识别的例子进行演示。

1、 tensorflow是什么?

tensorflow 是 google 开源的机器学习工具,在2015年11月其实现正式开源,开源协议Apache 2.0。

下图是 query 词频时序图,从中可以看出 tensorflow 的火爆程度。

2、 why tensorflow?

Tensorflow 拥有易用的 python 接口,而且可以部署在一台或多台 cpu , gpu 上,兼容多个平台,包括但不限于 安卓/windows/linux 等等平台上,而且拥有 tensorboard这种可视化工具,可以使用 checkpoint 进行实验管理,得益于图计算,它可以进行自动微分计算,拥有庞大的社区,而且很多优秀的项目已经使用 tensorflow 进行开发了。

3、 易用的tensorflow工具

如果不想去研究 tensorflow 繁杂的API,仅想快速的实现些什么,可以使用其他高层工具。比如 tf.contrib.learn,tf.contrib.slim,Keras 等,它们都提供了高层封装。这里是 tflearn 的github样例集

4、 tensorflow安装

目前 tensorflow 的安装已经十分方便,有兴趣可以参考官方文档


二、 tensorflow基础

       实际上编写tensorflow可以总结为两步.

       (1)组装一个graph;

       (2)使用session去执行graph中的operation。

       因此我们从 graph 与 session 说起。

1、 graph与session

(1)计算图

Tensorflow 是基于计算图的框架,因此理解 graph 与 session 显得尤为重要。不过在讲解 graph 与 session 之前首先介绍下什么是计算图。假设我们有这样一个需要计算的表达式。该表达式包括了两个加法与一个乘法,为了更好讲述引入中间变量c与d。由此该表达式可以表示为:

当需要计算e时就需要计算c与d,而计算c就需要计算a与b,计算d需要计算b。这样就形成了依赖关系。这种有向无环图就叫做计算图,因为对于图中的每一个节点其微分都很容易得出,因此应用链式法则求得一个复杂的表达式的导数就成为可能,所以它会应用在类似tensorflow这种需要应用反向传播算法的框架中。

(2)概念说明

下面是 graph , session , operation , tensor 四个概念的简介。

Tensor:类型化的多维数组,图的边;

Operation:执行计算的单元,图的节点;

Graph:一张有边与点的图,其表示了需要进行计算的任务;

Session:称之为会话的上下文,用于执行图。

Graph仅仅定义了所有 operation 与 tensor 流向,没有进行任何计算。而session根据 graph 的定义分配资源,计算 operation,得出结果。既然是图就会有点与边,在图计算中 operation 就是点而 tensor 就是边。Operation 可以是加减乘除等数学运算,也可以是各种各样的优化算法。每个 operation 都会有零个或多个输入,零个或多个输出。 tensor 就是其输入与输出,其可以表示一维二维多维向量或者常量。而且除了Variables指向的 tensor 外所有的 tensor 在流入下一个节点后都不再保存。

(3)举例

下面首先定义一个图(其实没有必要,tensorflow会默认定义一个),并做一些计算。

import tensorflow as tf
graph = tf.Graph()
with graph.as_default():
    foo = tf.Variable(3,name='foo')
    bar = tf.Variable(2,name='bar')
    result = foo + bar
    initialize = tf.global_variables_initializer()

print(result)  #Tensor("add:0", shape=(), dtype=int32)

这段代码,首先会载入tensorflow,定义一个graph类,并在这张图上定义了foo与bar的两个变量,最后对这个值求和,并初始化所有变量。其中,Variable是定义变量并赋予初值。让我们看下result(最后1行代码)。后面是输出,可以看到并没有输出实际的结果,由此可见在定义图的时候其实没有进行任何实际的计算。

print(result)  #Tensor("add:0", shape=(), dtype=int32)
下面定义一个session,并进行真正的计算。
with tf.Session(graph=graph) as sess:
    sess.run(initialize)
    res = sess.run(result)
print(res)  # 5

这段代码中,定义了session,并在session中执行了真正的初始化,并且求得result的值并打印出来。可以看到,在session中产生了真正的计算,得出值为5。

下图是该graph在tensorboard中的显示。这张图整体是一个graph,其中foo,bar,add这些节点都是operation,而foo和bar与add连接边的就是tensor。当session运行result时,实际就是求得add这个operation流出的tensor值,那么add的所有上游节点都会进行计算,如果图中有非add上游节点(本例中没有)那么该节点将不会进行计算,这也是图计算的优势之一。


2、数据结构

Tensorflow的数据结构有着rank,shape,data types的概念,下面来分别讲解。

(1)rank

Rank一般是指数据的维度,其与线性代数中的rank不是一个概念。其常用rank举例如下。


(2)shape

Shape指tensor每个维度数据的个数,可以用python的list/tuple表示。下图表示了rank,shape的关系。


(3)data type

Data type,是指单个数据的类型。常用DT_FLOAT,也就是32位的浮点数。下图表示了所有的types。


3、 Variables

(1)介绍

当训练模型时,需要使用Variables保存与更新参数。Variables会保存在内存当中,所有tensor一旦拥有Variables的指向就不会在session中丢失。其必须明确的初始化而且可以通过Saver保存到磁盘上。Variables可以通过Variables初始化。

weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")

其中,tf.random_normal是随机生成一个正态分布的tensor,其shape是第一个参数,stddev是其标准差。tf.zeros是生成一个全零的tensor。之后将这个tensor的值赋值给Variable。

(2)初始化

实际在其初始化过程中做了很多的操作,比如初始化空间,赋初值(等价于tf.assign),并把Variable添加到graph中等操作。注意在计算前需要初始化所有的Variable。一般会在定义graph时定义global_variables_initializer,其会在session运算时初始化所有变量。

直接调用global_variables_initializer会初始化所有的Variable,如果仅想初始化部分Variable可以调用tf.variables_initializer。

Init_ab = tf.variables_initializer([a,b],name=”init_ab”)
Variables可以通过eval显示其值,也可以通过assign进行赋值。Variables支持很多数学运算,具体可以参照 官方文档

(3)Variables与constant的区别

值得注意的是Variables与constant的区别。Constant一般是常量,可以被赋值给Variables,constant保存在graph中,如果graph重复载入那么constant也会重复载入,其非常浪费资源,如非必要尽量不使用其保存大量数据。而Variables在每个session中都是单独保存的,甚至可以单独存在一个参数服务器上。可以通过代码观察到constant实际是保存在graph中,具体如下。

const = tf.constant(1.0,name="constant")
print(tf.get_default_graph().as_graph_def())
这里第二行是打印出图的定义,其输出如下:
node {
       name: "constant"
       op: "Const"
       attr {
          key: "dtype"
       value {
          type: DT_FLOAT
      }
  }
  attr {
    key: "value"
    value {
      tensor {
        dtype: DT_FLOAT
        tensor_shape {
        }
        float_val: 1.0
      }
    }
  }
}
versions {
  producer: 17
}

(4)命名

另外一个值得注意的地方是尽量每一个变量都明确的命名,这样易于管理命令空间,而且在导入模型的时候不会造成不同模型之间的命名冲突,这样就可以在一张graph中容纳很多个模型。

4、 placeholders与feed_dict

当我们定义一张graph时,有时候并不知道需要计算的值,比如模型的输入数据,其只有在训练与预测时才会有值。这时就需要placeholder与feed_dict的帮助。

定义一个placeholder,可以使用tf.placeholder(dtype,shape=None,name=None)函数。

foo = tf.placeholder(tf.int32,shape=[1],name='foo')
bar = tf.constant(2,name='bar')
result = foo + bar
with tf.Session() as sess:
   print(sess.run(result)) 
在上面的代码中,会抛出错误(InvalidArgumentError),因为计算result需要foo的具体值,而在代码中并没有给出。这时候需要将实际值赋给foo。最后一行修改如下( 其中最后的dict就是一个feed_dict,一般会使用python读入一些值后传入,当使用minbatch的情况下,每次输入的值都不同 ):
print(sess.run(result,{foo:[3]}))

三、mnist识别实例

介绍了一些tensorflow基础后,我们用一个完整的例子将这些串起来。

首先,需要下载数据集,mnist数据可以在Yann LeCun's website下载到,也可以通过如下两行代码得到。

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
该数据集中一共有55000个样本,其中50000用于训练,5000用于验证。每个样本分为X与y两部分,其中X如下图所示,是28*28的图像,在使用时需要拉伸成784维的向量。


整体的X可以表示为:



y为X真实的类别,其数据可以看做如下图的形式。因此,问题可以看成一个10分类的问题:

而本次演示所使用的模型为逻辑回归,其可以表示为:


用图形可以表示为下图,具体原理这里不再阐述,更多细节参考该链接


那么 let’s coding!

当使用tensorflow进行graph构建时,大体可以分为五部分:

     1、为输入X输出y定义placeholder;

    2、定义权重W;

    3、定义模型结构;

    4、定义损失函数;

    5、定义优化算法。

首先导入需要的包,定义X与y的placeholder以及 W,b 的 Variables。其中None表示任意维度,一般是min-batch的 batch size。而 W 定义是 shape 为784,10,rank为2的Variable,b是shape为10,rank为1的Variable。

import tensorflow as tf
x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, [None, 10])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

之后是定义模型。x与W矩阵乘法后与b求和,经过softmax得到y。

y = tf.nn.softmax(tf.matmul(x, W) + b)

求逻辑回归的损失函数,这里使用了cross entropy,其公式可以表示为:

这里的 cross entropy 取了均值。定义了学习步长为0.5,使用了梯度下降算法(GradientDescentOptimizer)最小化损失函数。不要忘记初始化 Variables。

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
init = tf.global_variables_initializer()
最后,我们的 graph 至此定义完毕,下面就可以进行真正的计算,包括初始化变量,输入数据,并计算损失函数与利用优化算法更新参数。
with tf.Session() as sess:
    sess.run(init)
    for i in range(1000):
        batch_xs, batch_ys = mnist.train.next_batch(100)
        sess.run(train_step, feed_dict={x:  batch_xs, y_: batch_ys})
其中,迭代了1000次,每次输入了100个样本。mnist.train.next_batch 就是生成下一个 batch 的数据,这里知道它在干什么就可以。那么训练结果如何呢,需要进行评估。这里使用单纯的正确率,正确率是用取最大值索引是否相等的方式,因为正确的 label 最大值为1,而预测的 label 最大值为最大概率。
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

至此,我们开发了一个简单的手写数字识别模型。


总结全文,我们首先介绍了 graph 与 session,并解释了基础数据结构,讲解了一些Variable需要注意的地方并介绍了 placeholders 与 feed_dict 。最终以一个手写数字识别的实例将这些点串起来,希望可以给想要入门的你一丢丢的帮助。


引用自:Qunar技术沙

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

<think>我们正在讨论TensorFlow中的会话(Session)概念。根据引用,会话是TensorFlow1.x中用于执行计算图的环境。在TensorFlow2.x中,默认使用即时执行(eagerexecution),但为了兼容性,仍可以通过`tf.compat.v1`模块使用会话。引用[1]提到:使用`with tf.compat.v1.Session() assess:`创建会话,这是一种安全的方式,确保会话在结束后关闭,避免资源泄露。引用[2]展示了基础用法:创建计算图(常量a和b,以及它们的乘积c),然后通过会话执行计算图(`sess.run(c)`)。引用[3]强调了必须通过会话的`run`方法才能得到常量的值,直接打印操作对象不会得到计算结果。引用[4]说明图与会话的关系:图定义计算,会话执行计算。引用[5]提到了会话的标准使用方式以及资源释放问题,并推荐使用上下文管理器(即with语句)来避免资源泄露。现在,我们详细解释TensorFlow中的会话(Session)及其在自学教程中的应用。 ###TensorFlow会话(Session)详解在TensorFlow1.x中,计算首先被定义在计算图(tf.Graph)中,然后通过会话(tf.Session)来执行图中的操作。计算图是一个全局数据结构,包含操作(Operation)和张量(Tensor)。会话将计算图的操作分发到CPU、GPU等设备上执行,并管理运行时的所有资源。####1.会话的作用-执行计算:通过`run()`方法执行计算图中的操作或求值张量。-资源管理:会话负责分配和管理计算资源(如CPU、GPU内存)。-关闭会话:使用完毕后必须关闭会话来释放资源。####2.创建会话在TensorFlow1.x中,创建会话的常用方式有两种:**方法一:显式创建和关闭** ```pythonimport tensorflow astf#定义计算图a =tf.constant(3.0)b =tf.constant(4.0)c =a *b#创建会话sess =tf.Session()#执行计算result= sess.run(c) print(result)#输出12.0#关闭会话sess.close() ```**方法二:使用上下文管理器(推荐)** ```pythonimporttensorflowas tfa= tf.constant(3.0) b= tf.constant(4.0) c= a* bwithtf.Session()as sess:result =sess.run(c)print(result)#输出12.0#退出with块后,会话自动关闭```在TensorFlow2.x中,默认启用了即时执行(eagerexecution),因此无需构建计算图和会话。但若要使用1.x风格的图与会话,可以通过`tf.compat.v1`模块:```pythonimporttensorflow.compat.v1as tftf.disable_v2_behavior()#禁用v2行为#后续代码与1.x相同```####3.会话执行多个操作在同一个会话中,可以执行多个操作。`run()`方法可以接受一个操作列表,返回对应的结果列表。 ```pythonimport tensorflow astfa =tf.constant(1)b =tf.constant(2)c =a +bd =b +1withtf.Session()as sess:#同时获取c和d的值result_c, result_d =sess.run([c, d])print(result_c,result_d)#输出33``` ####4.会话中的变量初始化对于变量(Variable),必须在会话中初始化后才能使用。通常使用`tf.global_variables_initializer()`来初始化所有变量。 ```pythonimport tensorflow astf#定义变量var= tf.Variable(0, name='counter')one= tf.constant(1) update= tf.assign(var, var+ one)#赋值操作#初始化变量操作init= tf.global_variables_initializer()with tf.Session() assess:sess.run(init)#执行初始化for_ inrange(3):sess.run(update)print(sess.run(var))#输出1,2,3```####5.会话在自学教程中的应用在TensorFlow自学教程中,会话是理解计算图执行机制的关键。教程通常会从以下方面展开:-计算图的构建:包括常量、变量、操作等。-会话的执行:如何启动会话,运行操作。-资源管理:如何正确关闭会话,避免资源泄露。 -变量初始化:如何初始化变量,以及常见的错误(如忘记初始化)。####6.TensorFlow2.x中的会话在TensorFlow2.x中,推荐使用即时执行模式,无需构建图与会话。但若需要将代码迁移到1.x的图模式,可以使用`tf.function`装饰器将函数转换为计算图,然后通过`tf.compat.v1.Session`执行(但通常不推荐,因为2.x的默认模式更直观)。###总结会话是TensorFlow1.x中执行计算的核心组件,它连接了计算图的定义与实际计算。在自学教程中,理解会话的创建、执行和资源管理是掌握TensorFlow基础的关键。随着TensorFlow2.x的普及,即时执行模式成为主流,但了解会话机制对于维护旧代码和深入理解框架设计仍有重要意义。 §§相关问题§§1. TensorFlow2.x中如何替代会话(Session)机制?2.在TensorFlow中,变量初始化有哪些注意事项? 3.什么是TensorFlow的计算图(Graph)?它与会话有什么关系? 4.使用会话时如何避免资源泄露?5.在TensorFlow1.x中,如何同时运行多个操作?</think>### TensorFlow会话(Session)详解 在TensorFlow 1.x中,**会话(Session)** 是执行计算图的核心机制,负责将计算图中的操作分配到CPU/GPU等设备上运行,并管理运行时的所有资源。以下是关键要点: #### 一、会话的核心作用 1. **执行计算图** 计算图仅定义计算关系,实际计算需通过会话执行: ```python a = tf.constant(2) b = tf.constant(3) c = a + b with tf.Session() as sess: print(sess.run(c)) # 输出 5 ``` 直接打印`c`只会得到Tensor对象(如`<tf.Tensor 'add:0' shape=() dtype=int32>`),而非计算结果[^3]。 2. **资源管理** 会话管理变量、队列、读取器等运行时资源,需显式关闭释放资源[^5]。 #### 二、创建会话的两种方式 1. **显式创建与关闭** ```python sess = tf.Session() # 创建会话 try: print(sess.run(hello)) # 执行操作 finally: sess.close() # 必须手动关闭 ``` 缺点:异常时可能跳过`close()`导致资源泄漏[^5]。 2. **推荐:上下文管理器(自动关闭)** ```python with tf.Session() as sess: # 进入作用域创建会话 print(sess.run(hello)) # 执行操作 # 退出作用域自动关闭会话[^1] ``` #### 三、会话执行机制 1. **`Session.run()`方法** - 可执行单个操作或多个操作: ```python result = sess.run([op1, op2, op3]) # 同时执行多个操作 ``` - 支持**数据馈送**(通过`feed_dict`): ```python x = tf.placeholder(tf.float32) y = x * 2 print(sess.run(y, feed_dict={x: 3.0})) # 输出 6.0[^5] ``` 2. **变量初始化** 所有变量必须显式初始化: ```python init = tf.global_variables_initializer() sess.run(init) # 执行初始化操作 ``` #### 四、TensorFlow 2.x的变化 TensorFlow 2.x默认启用**即时执行(Eager Execution)**,无需手动创建会话: ```python # TF2.x 示例(无需Session) a = tf.constant(2) b = tf.constant(3) print(a + b) # 直接输出 tf.Tensor(5, shape=(), dtype=int32) ``` 但兼容模式仍可调用1.x API: ```python with tf.compat.v1.Session() as sess: # 兼容模式[^1] print(sess.run(c)) ``` #### 五、自学教程中的典型应用 1. **基础执行流程** ```python # 定义计算图 matrix1 = tf.constant([[1., 2.]]) matrix2 = tf.constant([[3.], [4.]]) product = tf.matmul(matrix1, matrix2) # 执行计算 with tf.Session() as sess: result = sess.run(product) # 输出 [[11.]] ``` 2. **变量更新场景** ```python counter = tf.Variable(0) increment = tf.assign(counter, counter+1) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for _ in range(5): sess.run(increment) # 变量值从1递增到5 ``` #### 六、最佳实践 1. 始终使用`with`语句避免资源泄漏 2. 复杂计算优先执行`Session.run()`减少数据传输 3. TF2.x用户应逐步迁移到即时执行模式 > 会话机制体现了TensorFlow 1.x的**惰性计算(Lazy Evaluation)** 设计,与TF2.x的即时执行形成对比[^4]。
评论 16
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值