TensorFlow弹药库——基础知识

TensorFlow弹药库——基础知识

一. 废话篇

再发了一篇关于cifar-10数据集的读取之后,本来想着接下来将各类神经网络(包含最简单的三层结构、cnn、lenet、resnet、googlenet等)在该数据实现,进行训练与测试。突然发现,先介绍一下,tensorflow最基础的知识应该会更好,在此就请继续看我墨迹废话吧。

哈哈哈。。。学习很严肃,自娱自乐一下。(睿思说:你给我唱首歌吧。 谢尔:我唱歌不好听,给你讲个笑话吧。 睿思:也行 谢尔:从前呢,有个人叫小菜,他啊就在路上走啊走。。。走啊走。。。走啊走,突然就被人端走了 谢尔:哈哈哈)

二. TensorFlow基本概念

TensorFlow是基于计算图的框架:
使用图 (graph) 来表示计算任务.
使用 tensor 表示数据.
在被称之为 会话 (Session) 的上下文 (context) 中执行图.
通过 变量 (Variable) 维护状态.
使用 feed 和 fetch 可以为任意的操作(operation)赋值或者从其中获取数据.

在这里要强调一点啊,在 Tensorflow 中,所有不同的变量和运算都是储存在计算图,在我们构建完模型所需要的图之后,还需要打开一个会话(Session)来运行整个计算图。

这个图呢在我们搭建完模型后就默认存在了,如果你想要进行多个不同的会话,就要建立多个图,以保证他们不相互干扰

TensorFlow程序通常可以分为两个阶段: 图的构建阶段和图的执行阶段

2.1Graph

现在假如我们要计算下面的表达式 e=c*d, c= a+b, d = b+1 可见,要计算c就需要a和b,计算d需要b,计算e需要c和d,这样就形成了依赖关系。这种有向无环图就叫做计算图。
这里写图片描述

图中的每个节点就是一个操作(operation),operation以0个或多个tensor作为输入,以0个或多个tensor作为输出。比如图中节点c=a+b,a和b是作为输入的两个tensor,c是作为输出的tensor。tensor就在图中沿着箭头方向流动,这就是为什么这个框架叫做TensorFlow的原因吧。

graph仅仅定义了operation和tensor的流向,并不进行任何运算。之后session通过graph的定义预分配资源,计算operation,得出结果。tensor是各个操作之间的输入或者输出。

接下来再说一下张量(Tensor)

2.2 张量(Tensor)

什么是张量呢?说白了,就是在Tensorflow中数据的表示形式。
在tensorflow程序中所有的数据都通过张量的形式来表示。

扫描二维码关注公众号,回复: 1542251 查看本文章

从功能的角度看,张量可以被理解为多维数组。其中零阶张量表示标量(scalar)也就是一个数;一阶张量为向量,也就是一维数组;n阶张量可以理解为一个n维数组。
但张量的实现并不是直接采用数组的形式,它只是对TensorFlow中运算结果的引用。在张量中并没有保存数字,它保存的是如何得到这些数字的计算过程。

如下代码,并不会得到加法的结果,而会得到对结果的一个引用。

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')
print(result)

输出结果为:Tensor(“add:0”, shape=(2,), dtype=float32)
TensorFlow计算的结果不是一个具体的数字,而是一个张量结构。从上面代码运行的结果可以看出,一个张量主要保存三个属性:名字(name)、维度(shape)和类型(type)。
张量的第一个属性name不仅是一个张量的唯一标识符,它同样也给出了这个张量是如何计算出来的
TensorFlow的计算可以通过计算图的模型来建立,而计算图上的每个节点代表了一个计算,计算的结果就保存在张量之中。
所以张量和计算图上的节点所代表的计算结果是对应的。这样张量的命名就可以通过“node:str_output”的形式来给出。其中node为节点的名称,str_output表示当前张量来自节点的第几个输出。比如上面代码打出来的“add:0”就说明result这个张量是计算节点”add”输出的第一个结果(编号从零开始)。
张量的的第二个属性是张量的维度(shape)。这个属性描述了一个张量的维度信息。张量的第三个属性是类型(type),每个张量会有唯一的类型。TensorFlow会对参与运算的所有张量进行类型检查,当发现类型不匹配时会报错。

2.3 会话(session)

session会话是 tensorflow 的重要机制,tensorflow构建的计算图必须通过Session会话才能执行,如果只是在计算图中定义了图的节点但没有使用Session会话的话,就不能运行该节点。
比如在tensorflow中定义了两个矩阵a和b,和一个计算a和b乘积的c节点,如果想要得到a和b的乘积(也就是c节点的运算结果)的话,必须要建立Session会话,并调用Session中的run方法运行c节点才行。

import tensorflow as tf 
a=tf.constant([[1,2]])   #定义了一个1×2的矩阵
b=tf.constant([[2], [4]])    #定义了一个2×1的矩阵
c=tf.matmul(a,b)       #两者相乘赋给c节点

这样就定义好了图的op,怎么运行,得到结果呢? 有两种方式
1>

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

2>

sess=tf.Session()
result=sess.run(c)
print(result)
sess.close()

运行结果是:

[[10]]

这样说不知道能不能理解了,再换一个角度来说一下吧,
Tensorflow中的所有计算都构建在一张计算图中,这个session就是负责让这个图运算起来,session的主要任务就是负责分配GPU或者CPU的
如图所示:
这里写图片描述

2.4 Variable

变量维护图执行过程中的状态信息。tensor一旦拥有Variable的指向就不会随session的多次载入而丢失。在session中Variable是单独保存的,在使用时必须进行初始化。
其初始化的代码如下:

init = tf.global_variables_initializer()
sess.run(init)

ps: variable 和 Tensor 有什么区别呢?

a = tf.Variable(tf.ones(1))
b = tf.add(a,tf.ones(1))

a是Variable,而b是Tensor。

  1. Variable是可更改的(mutable),而Tensor是不可更改的。一个直接的例子就是Tensor不具有assign函数,而Variable含有。
  2. Variable用于存储网络中的权重矩阵等变量,而Tensor更多的是中间结果等。
  3. Variable是会显示分配内存空间的(既可以是内存,也可以是显存),需要初始化操作(assign一个tensor),由Session管理,可以进行存储、读取、更改等操作。相反地,诸如Const, Zeros等操作创造的Tensor,是记录在Graph中,所以没有单独的内存空间;而其他未知的由其他Tensor操作得来的Tensor则是只会在程序运行中间出现。
  4. Tensor可以使用的地方,几乎都可以使用Variable。

2.5 fetch与feed

在Tensorflow的使用中,取回训练结果有两种方法:

(1)fetch

可以传入一些tensor来传回运行结果,比如下面代码中的mul指定传入方法,intermed作为传回结果的张量

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

(2)feed

feed机制可以临时替代图中的任意操作中的 tensor 可以对图中任何操作提交补丁, 直接插入一个 tensor.

比如,下面的inout1与input2只是占位符,在传入会话时才临时指定具体的数值

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.]})

这次大概就说这些了,最近有点瞎忙,更新慢慢慢。。。。。

猜你喜欢

转载自blog.csdn.net/weixin_40593658/article/details/80628054