tensorflow API简单整理(一、常量与变量基础)

来源:互联网 发布:弘扬软件股份有限公司 编辑:程序博客网 时间:2024/06/01 18:21

Tensorflow Python API简单整理

google 对tensorflow的教程里面,从机器学习的角度进行了一步步的讲解,但是我自己在编写机器学习代码的时候,经常找不到相应的api。故我从官网上下载了tensorflow python api的文档,花了些时间对其中主要的内容过了一下,这里做一下整理和记录,望各位大牛给予指导。

另:本人为传统行业转行IT,没有科班经验,若有错误之处,请直接指明,我会尽快修改。

0.总体

tensorflow python api分为13个部分,按照麦肯锡每一个层级不超过3个的原则,我又分了一下,大概分为图的构建,图的运行,相关支持三类,。其中图的构建内容比较多,包括constant op,Variables,Control Flow,BUiliding Graphs,Tensor Transformations ,图的运行包括Running Graphs,Training,其他支持包括Inputs & Readers,data IO,Math,Neural Network,Sparse Tensor,Iamges.感觉不尽合理,但是我就这样分了。

1. 图的构建

有些地方说tensorflw差不多算是一门新的语言,既然这样,干脆就从常量、变量、控制条件等出发算了。

1.1 constan op

在深度学习中,常量一般用来描述学习框架的结构,或者叫超参数。tensorflow基本的数据类型有14种,在这几本数据类型上,给与了3种主要的包装类型,分别是Constants value tensors,Sequence和Random Tensors

1.1.1基本数值结构

数据类型Python 类型描述DT_FLOATtf.float3232 位浮点数.DT_DOUBLEtf.float6464 位浮点数.DT_INT64tf.int6464 位有符号整型.DT_INT32tf.int3232 位有符号整型.DT_INT16tf.int1616 位有符号整型.DT_INT8tf.int88 位有符号整型.DT_UINT8tf.uint88 位无符号整型.DT_STRINGtf.string可变长度的字节数组.每一个张量元素都是一个字节数组.DT_BOOLtf.bool布尔型.DT_COMPLEX64tf.complex64由两个32位浮点数组成的复数:实数和虚数.DT_QINT32tf.qint32用于量化Ops的32位有符号整型.DT_QINT8tf.qint8用于量化Ops的8位有符号整型.DT_QUINT8tf.quint8用于量化Ops的8位无符号整型.

我也只有整体的印象,两个浮点,分别是tf.float32,tf.float64, 5 个整数类型,分别是tf.int(64~8)和tf.unit8,uint8表示无符号的,然后是字符串,布尔、复数和三个用来量化OPS的(这个我也不清楚)。

1.1.2 Constant Value Tensors

用来定义基本的常量以及其简化使用方式

  • tf.constant(value,dtype = None,shape = None,name = "Constant")

    这是最基础的一个,参数种dtype建议增加,若不增加,tensorflow会默认加一个,程序可能会有bug,shape对value进行一次形状变化,需要传入一个python列表;name为图中保存的名字。

    例: a =tf.constant(np.arange(10),dtype = tf.float32,shape = [2,5],name = "constant")

    print(a.eval()) [[ 0. 1. 2. 3. 4.] [ 5. 6. 7. 8. 9.]]

  • tf.zeros(shape,dtype = tf.float32,name = None)/tf.ones(shape,dtype = tf.float32,name = None)

    这两个函数差不多,一个生成全为0的常量,一个生成全为1的常量,默认的格式tf.float32.

  • tf.zeros_like(tensor,dtype=None,name = None)/tf.ones_like(tensor,dtype=None,name = None)

    这俩函数基本一样,需要传入一个tensor,导出一个同结构全0/1的tensor,数据类型可能变化。

  • tf.fill(dims,value,name = None) 我自己试了一下,dims的参数其实和shape是一样的,这个函数生成了一个以dims(列表)为结构,value为值的一个tensor。

1.1.3 Sequences

生成一维tensor,主要由两个函数,分别是linspace 和 range,用法有稍微的区别。

  • tf.linspace(start,stop,num,name = None )

    生成一个一维tensor,以start为开始,以stop为结束,这两个数都必须是float,num为总个数(int)。 print(tf.linspace(0.0,10.0,11).eval()) 结果为 [ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]

  • tf.range(start,limit,delta = 1,name = "range")

    生成一个一维tensor,以start为开始,最大不超过limit,间隔为delta。建议使用整数,浮点数可能会出现精度问题。

1.1.4Random Tensors

生成常用的多维随机数。包括几个生成器和一个种子设置方法。

  • tf.random_normal(shape,mean = 0,stddev = 1,dtype = tf.float32,seed = None,name = None)

  • tf.truncated_normal(shape,mean = 0,stddev = 1,dtype = tf.float32,seed = None,name = None)

    这两函数都是生成正态随机数,区别是truncated在生成随机数后,如果随机数在两倍标准差之外,就重新生成一个,直到生成最终结果。参数中shape为一个列表,表示形状,mean和stddev分别标书均值和标准差,seed为随机数种子。和其他python随机语法一样,固定seed以后,生成的随机数将不变。

  • tf.random.uniform(shape,minval = 0.0,maxval = 1.0,dtype = tf.float32,seed = None)

    这个函数生成从0到1中平均分布的数值。

  • tf.random_shuffle(value,seed = None,name = None)

    传入一个tensor,然后将这个rensor进行随机洗牌。

1.2 Variables 变量

tensorflow中变量一般用来用来描述学习的参数,tensorflow向量需要先进行初始化,然后才可以使用,向量也可以进行分享与保存,变量部分主要有新建、初始化、保存与读取、分享、更新几个部分

1.2.1 新建与初始化

(1)tensorflow中新建使用tf.Variables(init_value,trainable = True,collections = None,validate_shape = None,name = option_name) .Variable 是tensorflow模块中的一个类,以上为其的init方法。init_value为其初始化值,可以传入数值,列表,numpy数组,tf的tensor等;必须含有shape,如果没有,validate_shape必须设置为False,但是对一个变量来说,最好使用固定结构的变量。trainable默认为True,可以经过训练来改变,添加到GraphKeys.TRAINABLE_VARIABLES 中,collections默认添加到图的[GraphKeys.VARIABLES] 中,

在tf.Variables的类中有add,sub,dtype、name,get_shape()等属性和方法,有需要进一步查看API文档吧。

(2)tensorflow中所有的变量在构架的时候都是一个框架,并没有具体的值,只有在初始化之后才有具体的值,最新版的tf采用initializer的方式,更符合面向对象的思想。主要有两个初始化器:

tf.variables_initilizer(var_list,name = "nint")/tf.global_variables_initializer()前者对指定的一个变量列表进行初始化,后者则对所有的变量进行初始化。

注意:这里的初始化只是在计算图中定义了这样的一个节点,这个节点的运算是将变量进行初始化,所以在实际计算中,还是要调用seee.run(initializer),才能真正的完成初始化过程。

(3)查询变量 tf.gloable_variables() 显示图中所有的变量。 tf.trainable_variables() 显示图中可训练的变量。

(4)tf.assert_variables_initialized(var_list) 判断传入的变量列表是否已经初始化,如果还有没初始化的,就报错。感觉没啥大用。

1.2.2 变量的保存与读取

tensorflow使用Saver类进行变量的保存和读取,系统的变量将被保存到checkpoints中,point我简单的理解成快照,其本质是tensorflow使用二进制保存的变量名到变量值的map映射文件。

新建Saver类,其init方法为tf.train.Saver(var_list = None,reshape = False,shared = False,max_to_keep = 5,keep_checkpoint_every_n_hours = 10000.0,name = None,restore_sequentially = False,saver_def = None,builder = None) 简单的话,可以使用tf.train.Saver({"v1":v1,"v2":v2})/tf.train.Saver([v1,v2])/tf.train.Saver{v.op.name for v in [v1,v2]} 从这个角度来看,Saver可以传入变量名set,变量名list,变量名:变量值得dict等类型。默认是将所有的变量都保存。

参数中重要的是max_to_keep 最大备份数量;keep_checkpoint_every_n_hours 每隔多少小时备份一次。

Saver类需要调用save才能真正的完成保存。调用方法为tf.train.Saver.save(sess,save_path,global_step=None,latest_filename =None)sess 和path 是必须传入的,global_step 若标准,则会以此为checkpoint的文件名。latest_filename将包含最新检查点文件名列表的协议缓冲区文件的可选名称。保存在与检查点文件相同的目录中的文件由保存程序自动管理以跟踪最近的检查点。默认为“checkpoint”。

读取 tf.train.Saver.restore(sess, save_path) 简单的使用sess 和path就可以读取。如果要读取数据,那么原来的变量要设置好,但是不比初始化。

还有 tf.train.Saver.last_checkpoints 返回checkpoints的文件名 等函数用的不多。

阅读全文
1 0
原创粉丝点击