赞
踩
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的数据集合
Dataset
的下一个元素,并且此指令通常充当输入管道和模型之间的接口。而其中的tf.data.Dataset.make_initializable_iterator()方法更加的灵活,他可以进行不同的迭代的批次。
构建Dataset对象:
解析tfrecord格式数据的时候,必须使用一下map函数对去中的数据进行解析,因为里边的数据是很多个example的形式,因此需要map函数去解析一下。解析的时候在map函数中传入的是一个方法,那么解析用tf.parse_single_example方法去进行解析,
tf.parse_single_example():
参数:
返回:
一个 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中模型保存:
注意点,在模型复现出来的时候一定要将,模型的结构一摸一样的写出来
tf.data:tf.data学习指南(超实用、超详细)_我的博客有点东西-CSDN博客_tf.data
TensorFlow tf.data 导入数据(tf.data官方教程) * * * * *_黑暗星球-CSDN博客_tf.data
tf.estimator:Tensorflow笔记:高级封装——tf.Estimator - 知乎 (zhihu.com)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。