当前位置:   article > 正文

tensorflow一些参数的详细讲解分享(tensorflow1的哦)_tpuestimator model_fn

tpuestimator model_fn

tf1:

tf.GradientTape()函数:

tf提供的自动求导函数

x = tf.Variable(initial_value=3.)

with tf.GradientTape() as tape:     # 在 tf.GradientTape() 的上下文内,所有计算步骤都会被记录以用于求导

    y = tf.square(x)

y_grad = tape.gradient(y, x)        # 计算y关于x的导数

tf.GradientTape() 是一个自动求导的记录器。只要进入了 with tf.GradientTape() as tape 的上下文环境,

则在该环境中计算步骤都会被自动记录。对with下的函数进行自动的求导,然后tape.gradient()表示,

在关于y的这个函数中,对x这个变量进行求导。

tf.nn.rnn_cell.BasicRNNCell():创建一个RNN的神经单元,参数:num_units:隐藏层神经单元个数

tf.nn.dynamic_rnn():一个文本序列长度为n,那么就需要调用n次RNN的cell来计算state,为了避免麻烦封装了这个方法来直接计算state。

参数:

cell:RNNCell的一个实例,input:RNN输入

如果time_major == False(默认), 则是一个shape为[batch_size, max_time, input_size]的Tensor,或者这些元素的嵌套元组。

如果time_major == True,则是一个shape为[max_time, batch_size, input_size]的Tensor,或这些元素的嵌套元组。

sequence_length: (可选)大小为[batch_size],数据的类型是int32/int64向量。如果当前时间步的index超过该序列的实际长度时,则该时间步不进行计算,RNN的state复制上一个时间步的,同时该时间步的输出全部为零。

initial_state: (可选)RNN的初始state(状态)。如果cell.state_size(一层的RNNCell)是一个整数,那么它必须是一个具有适当类型和形状的张量[batch_size,cell.state_size]。如果cell.state_size是一个元组(多层的RNNCell,如MultiRNNCell),那么它应该是一个张量元组,每个元素的形状为[batch_size,s] for s in cell.state_size。

time_major: inputs 和outputs 张量的形状格式。如果为True,则这些张量都应该是(都会是)[max_time, batch_size, depth]。如果为false,则这些张量都应该是(都会是)[batch_size,max_time, depth]。time_major=true说明输入和输出tensor的第一维是max_time。否则为batch_size。

返回值:

返回一对元组(output,state)

其中:output:RNN的输出

如果说time_major==False,那么输出的output的维度是[batch_size, max_time, cell.output_size]的tensor

如果说time_major==True, 那么输出的output的维度是[batch_size, max_time, cell.output_size]的tensor

state为最终的隐藏状态,一般维度为[batch_size, output_size]

tf.nn.dynamic_rnn和tf.nn.static_rnn的区别:当遇到序列长度不相同的情况下,前者会自动补0,且在计算的时候参数不参与计算

tf.contrib.seq2seq.sequence_loss():常用的损失函数:

过程:1.softmax  2.交叉熵选择  3.求均值

参数重点:weights:就是需要代价loss乘以一个mask矩阵,把不必要的代价给去除掉,可以从tf.sequence_mask中直接调用

比如说:hello翻译成helloo,那么它们的代价就会是[0,0,0,0,0,2],其实我们发现这个最后一个代价其实本没有什么意义,但是但是它的存在会产生代价,因此怎么办,乘以一个权重0,就ok了,这也就是说weights这个参数的作用。

tf.contrib.rnn.MultiRNNCell():构建多层的RNN网络需要将多层RNN进行堆叠,使用该方法,参数:cell:传入创建的cell列表。state_is_tuple=True:接受返回的state为元组

tf.multinomial(logits, num_samples, seed=None, name=None)

从数据中采样

参数:logits:是对数后的概率,num_samples:是采样的个数,比如说:logits的维度[b_z,num_class],然后num_samples为5,就代表,从num_sample中随机抽取5个

那么最终的返回就变成了,return:[b_z,num_sample]

tf.TensorArray函数和tf.while_loop函数:tensorArray可以看作是具有动态size功能的tensor数组,通常和while_loop或者map_fn联合使用

常用的方法有:write(index,value):将value写入到TensorArray的第index个位置。stack:将TensorArray中的值作为tensor返回

while_loop函数:循环的处理某个变量,中间处理的结果用来进行下一次处理,最后经过数次加工的变量,由于Tensorflow可以动态扩展,因此用来储存中间结果

参数:cond:是一个函数,负责判断是否继续执行循环

loop_body:是每个循环体内执行的操作,负责对循环状态进行更新

tf.clip_by_value:参数:A:列表,min,max。就是将列表A中的元素,小于最小的,变成最小,大于最大的变成最大

tf.clip_by_global_norm:进行梯度的裁剪,防止梯度的更新过大。参数:第一个参数传梯度,第二个参数传,截取的比例

pretrain_opt.apply_gradients:参数更新

tf.slices():切分取数据的作用

参数:

          input:传入的要切分的数据

          begin:从每个维度开始的位置

          size:从每个维度拿出来几个元素

tf中的高级的API Estimator,作用是将,训练,测试,和验证以及保存给保存了起来,免去了,Session.run的操作。

在Estimator中,暴露出来四个接口,分别是:train,eval,predict,export_savedmodel,分别对应着模型的训练,验证

预测和模型保存。其中主要包括两个比较重要的方法,1.create_model和model_fn_builder。对于训练,验证和测试,都需要

传入数据集合,因此需要从input_fn这个函数中获得输入。

input_fn:返回的是数据的特征和标签

在create_model中定义的一般都是,模型最后的网络结构,以及代价函数和返回值等等,返回值可以为(loss, per_example_loss, logits, probabilities, predict)

model_fn中传入的参数:1. 特征和标签,2. mode,根据用户的定义而自动传入的参数,3. param 4. config

接着详细的定义一下,train,eval和predict方法中的操作。train中传入三个参数:1. mode, 2. loss, 3. 优化器

eval中传入三个参数:1。 mode 2. loss 3. eval_metrics,这是模型的评估方法。

predictions:传入两个参数,1.mode 2. predictions用于后续计算模型的recall

到了这一步,模型的输入有了,模型有了,三个功能也有了,如何把模型跑起来。

run_config = tf.contrib.tpu.RunConfig(...)

  model_fn = model_fn_builder(...)

  estimator = tf.contrib.tpu.TPUEstimator

tf.train.polynomial_decay()学习率进行指数行的衰减,当然还有其他衰减方式:多项式衰减,自然衰减,随着时间衰减,分段衰减

参数:learning_rate,初始学习率

    global_step,当前迭代次数

    decay_steps,衰减速度(在迭代到该次数时学习率衰减为earning_rate * decay_rate)

    decay_rate,学习率衰减系数,通常介于0-1之间。

decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)

直观解释:假设给定初始学习率learning_rate为0.1,学习率衰减率为0.1,decay_steps为10000。

则随着迭代次数从1到10000,当前的学习率decayed_learning_rate慢慢的从0.1降低为0.1*0.1=0.01,

当迭代次数到20000,当前的学习率慢慢的从0.01降低为0.1*0.1^2=0.001

tf.layers.dense():

inputs:输入该网络层的数据

units:输出的维度大小,改变inputs的最后一维

activation:激活函数,即神经网络的非线性变化

use_bias:使用bias为True(默认使用),不用bias改成False即可,是否使用偏置项

trainable=True:表明该层的参数是否参与训练。如果为真则变量加入到图集合中

tf.train.init_from_checkpoint(),恢复模型的映射

参数:1. ckpt_dir_or_file:.ckpt模型的路径

         2. assignment_map:字典类型,key为要恢复的变量名

TFRecord数据格式,他是Google官方推荐的一种数据结构形式,是专门为tensorflow设计的一种数据结构格式。

并且它是一种二进制文件,能够更好的利用内存,在TFRecord里边,有很多Example,在一个Example中又有很多的feature

feature是一个字典的形式,里边都是键值对。其中key是一个字符串,vaule的取值为三种:

bytes_list: 可以存储string 和byte两种数据类型。

float_list: 可以存储float(float32)与double(float64) 两种数据类型 。

int64_list: 可以存储:bool, enum, int32, uint32, int64, uint64 。

Google官方推荐在对于中大数据集来说,先将数据集转化为TFRecord数据(.tfrecords), 这样可加快你在数据读取, 预处理中的速度。

将数据转化成TFRecord:

TFRecord文件的读取:

使用tf.data,搭建数据读取的管道。使用这个API构建管道,主要通过两个API:1. tf.data.Dataset 2. tf.data.Iterator  Iterator是提取Dataset中的数据的。

1用于读取数据,做预处理,如batch和epoch等,而读取数据需要用到2. 形成迭代器

步骤:1.先构建一个一些feature和labels的数据集合

  1. 实例化一个tf.data.Dateset的实例:tf.data.Dataset.from_tensor_slices(传入元组的形式,其中元组中包含data和labels,它们分别都是列表)
  2. 常用的方法有:batch(返回一个批量),map(将数据映射出来),repeat(描述数据重复几次,也就是epochs),shuffle(随机打乱顺序)
  3. Iterator的使用,在Dataset中提供了直接生成Iterator迭代器的对象:1. tf.data.Dataset.make_one_shot_iterator(不需要进行初始化,但是仅仅能遍历一次数据集) 2. tf.data.Dataset.make_initializable_iterator(需要进行初始化)
  4. 迭代器中有get_next方法:指令会在执行时生成 Dataset 的下一个元素,并且此指令通常充当输入管道和模型之间的接口。
  5. 其中map方法可以将保存的数据给读取出来,map(传入的数据是一个读取文件的方法)
  6. Batch(传入的是批量大小这个参数)
  7. Repeat(方法传入的是epochs的大小,也就是说要将数据进行几次大循环)

而其中的tf.data.Dataset.make_initializable_iterator()方法更加的灵活,他可以进行不同的迭代的批次。

构建Dataset对象:

  1. 基于Numpy的形式,使用tf.data.Dataset.from_tensor_slices()方法,该方法中传入,字典或者元组的形式。注:适用于小量的数据集。
  2. 基于TF中的TFRcord的数据格式去构建Dataset对象,使用tf.data.TFRecordDataset传入的是一个列表的形式,列表当中包含是的.tfcord类型文件的文件路径的字符串。适用于大数据集,应为TFRcord是一种二进制的格式。

解析tfrecord格式数据的时候,必须使用一下map函数对去中的数据进行解析,因为里边的数据是很多个example的形式,因此需要map函数去解析一下。解析的时候在map函数中传入的是一个方法,那么解析用tf.parse_single_example方法去进行解析,

tf.parse_single_example():

参数:

  • serialized:一个标量字符串张量,单个序列化的例子.
  • features:一个 dict,映射功能键到 FixedLenFeature 或 VarLenFeature值.
  • name:此操作的名称(可选).
  • example_names:(可选)标量字符串张量,关联的名称.请参阅 _parse_single_example_raw 文档了解更多详情.

返回:

一个 dict,映射功能键到 Tensor 和 SparseTensor 值.

Tf中优化器中的minimize()的用法:

Minimize:其实是 compute_gradients 和 apply_gradients这两个方法的结合

compute_gradients()的作用是计算梯度,而后者的意思是使用得到的梯度更新对应的变量,

compute_gradients()的参数:

Loss和val_list,作用就是计算loss对于val_list中变量分别进行求偏导,然后返回一个元组套列表的形式,列表中有多个元组,元组的第一个元素指求导输出的值,第二个元素指,要该参数变量。例如:【(y对w求偏导,w这个变量),(y对x求偏导,x这个变量)】

Tf.clip.by.norm():值对梯度进行裁剪

参数:t传入的tf.norm(t)计算出这个梯度

clip_norm:判断这个梯度是否大于给定的梯度值

如果大于通过指定的公式进行替换。

apply_gradients()就是为了对刚才求出来的梯度进行更新。

tf中模型保存:

  1. 实例化一个saver = tf.train.Saver()
  2. 保存模型使用:saver.save(sess,pass)
  3. 将保存的模型读取出来:saver.restore(sess,pass)

注意点,在模型复现出来的时候一定要将,模型的结构一摸一样的写出来

tf.data:tf.data学习指南(超实用、超详细)_我的博客有点东西-CSDN博客_tf.data

TensorFlow tf.data 导入数据(tf.data官方教程) * * * * *_黑暗星球-CSDN博客_tf.data

tf.estimator:Tensorflow笔记:高级封装——tf.Estimator - 知乎 (zhihu.com)

TFRecord:TFRecord - TensorFlow 官方推荐的数据格式 - 知乎 (zhihu.com)

Tensorflow高阶读写教程_luchi007的专栏-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/312332
推荐阅读
相关标签
  

闽ICP备14008679号