深度学习笔记——深度学习框架TensorFlow(十一)

看了一段时间的官网,对TensorFlow有了一定了解,但还不会通过TensorFlow搭神经网络框架,准备周末做一个总结。
找了一个TensorFlow教程集合,准备开始看看。
简要的做一些笔记。

TensorFlow的一些易用工具
如果不想研究tensorflow的API,只是想快速实现什么,那么可以使用其他高层工具,比如:tf.contrib.learn,tf.contrib.slim,Keras等。这里是tflearn的github样例集合

TensorFlow的基础概念

graph与session

  1. 计算图:
    TensorFlow是基于计算图的框架。所谓计算图是一个有向无环图:
    这里写图片描述
    当需要计算e时就需要计算c与d,而计算c就需要计算a与b,计算d需要计算b。这样就形成了依赖关系。这个图更好的讲述引入中间变量c与d。
  2. 概念说明:
    • Tensor:张量,表示的是计算图的边。
    • Operation:执行计算的单元,表示计算图的节点
    • Graph:一张有边有点的图,表示了需要进行计算的任务。
    • Session:称为会话的上下文,用于执行图。
      Graph仅仅定义了所有operation与tensor流向,没有进行任何计算。而session根据graph的定义分配资源,计算operation,得出结果。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是定义变量并赋予初值。但我们会发现,最后的输出值是Tensor(“add :0”, shape = (),dtype = int32),并没有实际值输出,由此可见在定义图的时候,其实并没有进行任何实际的计算。
接下来,定义一个session,并进行真正的计算:

with tf.Session(graph = graph) as sess:
    sess.run(initialize)
    res = sess.run(result)
print(res) # 5

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

基础数据结构

  1. rank:
    Rank指的是数据的维度,我一般通过括号的层数进行判断
    这里写图片描述
  2. shape:
    Shape指的是tensor每个维度的数据个数,可以用python的list/tuple表示,下图是rank,shape的关系,这里我通过括号中数字的个数判断rank
    这里写图片描述
  3. data type:
    Data type,是指单个数据的类型。常用DT_FLOAT,也就是32位的浮点数。下图表示了所有的types。
    这里写图片描述

Variable

  1. 介绍:
    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")

Variable第一个参数表示初始化的值,比如biases初始化为200个一维的0,这样biases在后面的过程中会一直变化,下次可能获取biases时候是biases = xxx某个值,在tensorFlow中,这种,可以通过fetch也就是当需要获得传递某个最新的biases时可以session.run([biases]),这时候,传递的biases就是每次最新变化的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_initalizer([a,b],name="init_ab")

Variables可以通过eval显示其值,也可以通过assign进行赋值。Variables支持很多数学运算,具体可以参照官方文档。
3. 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  
}  
  1. 命名:
    另外一个值得注意的地方是尽量每一个变量都明确的命名,这样易于管理命令空间,而且在导入模型的时候不会造成不同模型之间的命名冲突,这样就可以在一张graph中容纳很多个模型。

placeholder与feed_dict

在不知道模型输入数据的确切值时,需要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,{foo:[3]}))

如果不给出代码中的foo具体值,会出现InvalidArgumentError错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值