概述
学习网址:Tensorflow中文社区 http://www.tensorfly.cn/
一、tensorflow框架笔记
1.Variable
一个Variable
代表一个可修改的张量,存在在TensorFlow的用于描述交互性操作的图中。它们可以用于计算输入值,也可以在计算中被修改。对于各种机器学习应用,一般都会有模型参数,如w、b,可以用Variable
表示。
2. session
Tensorflow依赖于一个高效的C++后端来进行计算。与后端的这个连接叫做session。
3.InteractiveSession
InteractiveSession
类,它能让你在运行图的时候,插入一些计算图,这些计算图是由某些操作(operations)构成的。
为了便于使用诸如 IPython 之类的 Python 交互环境, 可以使用 InteractiveSession
代替 Session
类,用Tensor.eval()
和 Operation.run()
方法代替 Session.run()
. 这样可以避免使用一个变量来持有会话.
4. RNN
- BasicRNNCell - 香草RNN细胞。
- GRUCell- 门控复发单元。
- BasicLSTMCell- 基于递归神经网络正则化的LSTM单元。没有窥视孔连接或细胞剪切。
- LSTMCell - 一个更复杂的LSTM细胞,允许可选的窥视孔连接和细胞剪切。
- MultiRNNCell - 将多个单元格组合成多层单元格的包装器。
- DropoutWrapper - 一个包装添加到单元格的输入和/或输出连接丢失。
- CoupledInputForgetGateLSTMCell- LSTMCell基于LSTM:搜索空间奥德赛的输入和忘记门的扩展。
- TimeFreqLSTMCell - 基于建模时频模式的时频LSTM单元与LSTM与卷积结构的LVCSR任务
- GridLSTMCell - 来自网格长期短期记忆的单元格。
- AttentionCellWrapper- 将注意力集中在基于长期短期记忆网络的机器阅读的现有RNN小区上。
- LSTMBlockCell- 一个更快的基本LSTM单元版本(注意:这个是在lstm_ops.py)
5. tf.nn.xw_plus_b()函数
相当于:tf.matmul(x, weights) + biases
tf.nn.xw_plus_b(
x,
weights,
biases,
name=None
)
- x:2D Tensor。维度通常为:batch,in_units
- weights:2D Tensor。维度通常为:in_units,out_units
- biases:1D Tensor。维度为:out_units
- name:操作的名称(可选)。如果未指定,则使用“xw_plus_b”。
6. 常用CNN
(1)tf.nn.atrous_conv2d()空洞卷积或者扩张卷积
如何理解空洞卷积(dilated convolution)?
其实用一句话概括就是:在不用pooling的情况下扩大感受野(pooling层会导致信息损失)
7. 区别
普通会话:
sess = tf.Session()
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
交互式会话:
sess = tf.InteractiveSession()
# Operation.run()
train_step.run(feed_dict={x: batch[0], y_: batch[1]})
# Tensor.eval()
accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels})
8. dropout--tf.placeholder()
用一个placeholder
来代表一个神经元的输出在dropout中保持不变的概率。这样我们可以在训练过程中启用dropout,在测试过程中关闭dropout。
keep_prob = tf.placeholder("float")
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
9.feed_dict
中加入额外的参数keep_prob
来控制dropout比例
for i in range(20000):
batch = mnist.train.next_batch(50)
# 每100轮,检测下精度:测试过程中关闭dropout
if i%100 == 0:
train_accuracy = accuracy.eval(feed_dict={
x:batch[0], y_: batch[1], keep_prob: 1.0})
print("step %d, training accuracy %g"%(i, train_accuracy))
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5}) # 训练过程中启用dropout
# 训练过程中关闭dropout
print("test accuracy %g"%accuracy.eval(feed_dict={
x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))
10.tensorflow.compat.v1
TensorFlow 2.0中提供了tensorflow.compat.v1代码包来兼容原有1.x的代码,可以做到几乎不加修改的运行。 TensorFlow 2.0中提供了命令行迁移工具,来自动的把1.x的代码转换为2.0的代码。
参考:https://cloud.tencent.com/developer/article/1414830
11. 保存检查点(checkpoint):加载、恢复模型
为了得到可以用来后续恢复模型以进一步训练或评估的检查点文件(checkpoint file),我们实例化一个tf.train.Saver
。
saver = tf.train.Saver()
在训练循环中,将定期调用saver.save()
方法,向训练文件夹中写入包含了当前所有可训练变量值得检查点文件。
saver.save(sess, FLAGS.train_dir, global_step=step)
这样,我们以后就可以使用saver.restore()
方法,重载模型的参数,继续训练。
saver.restore(sess, FLAGS.train_dir)
tf.train.Saver类
功能:保存和恢复变量
有关变量,保存和恢复的概述,请参见变量
将Saver类添加ops 从而在checkpointes里save和restore变量 。它还提供了运行这些操作的便捷方法。
Checkpoints是专有格式的二进制文件,它将变量名称映射到张量值。测试Checkpoints内容的最佳方式是使用Saver来加载。
Savers可以使用提供的计数器自动为Checkpoint文件名编号,这使您可以在训练模型时在不同的步骤中保留多个Checkpoints。例如,您可以使用训练步骤编号对Checkpoint文件名进行编号。为避免填满磁盘,储存器会自动管理Checkpoint文件。例如,他们只能保留N个最新文件,或每N小时训练一个Checkpoint。
- max_to_keep:表示要保留的最近文件的最大数量。创建新文件时,将删除旧文件。如果为None或0,则不会从文件系统中删除任何Checkpoint,但只有最后一个Checkpoint保留在checkpoint文件中。默认为5(即保留最近的5个Checkpoint文件。)
- keep_checkpoint_every_n_hours:除了保留最新的 max_to_keep检查点文件之外,您可能还希望每N小时的训练保留一个Checkpoint文件。如果您想稍后分析模型在长时间训练期间的进展情况,这将非常有用。例如,传递keep_checkpoint_every_n_hours=2确保每2小时训练保留一个检查点文件。默认值10,000小时可有效禁用该功能。
12. tf.contrib.crf
(1)tf.contrib.crf.crf_log_likelihood()
在一个条件随机场里面计算标签序列的log-likelihood
函数的目的:使用crf 来计算损失,里面用到的优化方法是:最大似然估计
参数:max_seq_len = 一个句子的字数
- inputs: 一个形状为 [batch_size, max_seq_len, num_tags] 的tensor,也就是每个标签的预测概率值,这个值根据实际情况选择计算方法,CNN,RNN...都可以,一般使用BILSTM处理之后输出转换为他要求的形状作为CRF层的输入。
- tag_indices: 一个形状为[batch_size, max_seq_len] 的矩阵,其实就是真实标签序列。
- sequence_lengths:一个形状为[batch_size] 的向量,表示batch中每个序列的长度。这是一个样本真实的序列长度,因为为了对齐长度会做些padding,但是可以把真实的长度放到这个参数里
- transition_params: 形状为[num_tags, num_tags] 的转移矩阵,可以没有,没有的话这个函数也会算出来。
返回:
- log_likelihood: 标量,log-likelihood
- transition_params: 形状为[num_tags, num_tags] 的转移矩阵,转移概率,如果输入没输,它就自己算个给返回。
示例代码:https://www.cnblogs.com/lovychen/p/8490397.html
(2)tf.contrib.crf.viterbi_decode
viterbi_decode(score,transition_params)
通俗一点,作用就是返回最好的标签序列,这个函数只能够在测试时使用,在tensorflow外部解码。
参数:
-
score: 一个形状为[seq_len, num_tags] matrix of unary potentials. transition_params: 形状为[num_tags, num_tags] 的转移矩阵
返回:
-
viterbi: 一个形状为[seq_len] 显示了最高分的标签索引的列表. viterbi_score: A float containing the score for the Viterbi sequence.
(3)tf.contrib.crf.crf_decode
crf_decode(potentials,transition_params,sequence_length)
在tensorflow内解码
参数:
- potentials: 一个形状为[batch_size, max_seq_len, num_tags] 的tensor,
- transition_params: 一个形状为[num_tags, num_tags] 的转移矩阵
- sequence_length: 一个形状为[batch_size] 的 ,表示batch中每个序列的长度
返回:
- decode_tags:一个形状为[batch_size, max_seq_len] 的tensor,类型是tf.int32,表示最好的序列标记。
- best_score: 一个形状为[batch_size] 的tensor,包含每个序列解码标签的分数。
13. Early stopping早停止
tf.contrib.estimator.stop_if_no_decrease_hook()
tf.contrib.estimator.stop_if_no_decrease_hook(
estimator,
metric_name,
max_steps_without_decrease,
eval_dir=None,
min_steps=0,
run_every_secs=60,
run_every_steps=None
)
其中metric_name用来指明监控的变量(比如loss或者accuracy)
二. tf 常用函数
1.tf.argmax
()
tf.argmax
是一个非常有用的函数,它能给出某个tensor对象在某一维上的其数据最大值所在的索引值。
2. tf.cast()
把布尔值转换成浮点数,如
tf.cast(correct_prediction, "float")
[True, False, True, True]
会变成 [1,0,1,1]
3.tf.truncated_normal()
tf.truncated_normal
初始函数将根据所得到的均值和标准差,生成一个随机分布,从截断的正态分布中输出随机值。
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
从截断的正态分布中输出随机值。 shape表示生成张量的维度,mean是均值,stddev是标准差。这个函数产生正太分布,均值和标准差自己设定。这是一个截断的产生正太分布的函数,就是说产生正太分布的值如果与均值的差值大于两倍的标准差,那就重新生成。和一般的正太分布的产生随机数据比起来,这个函数产生的随机数与均值的差距不会超过两倍的标准差,但是一般的别的函数是可能的。
4. tf.reverse反序
import tensorflow as tf
import numpy as np
t=[[1,2,3],[4,5,6]]
t0=tf.reverse(t,[0])
t1=tf.reverse(t,[1])
t21=tf.reverse(t,[0,1])
t22=tf.reverse(t,[1,0])
sess=tf.Session()
print(sess.run(t0))
print(sess.run(t1))
print(sess.run(t21))
print(sess.run(t22))
运行结果如下:
按行(axis=0)变换,上下行交换位置
[[4 5 6]
[1 2 3]]
axis=1按照横轴变换,前后列交换位置
[[3 2 1]
[6 5 4]]
先纵轴变换,后横轴变换
[[6 5 4]
[3 2 1]]
先横轴后纵轴变换
[[6 5 4]
[3 2 1]]
5. tf.concat()
tensorflow中用来拼接张量的函数tf.concat(),用法:
tf.concat([tensor1, tensor2, tensor3,...], axis)
先给出tf源代码中的解释:
t1 = [[1, 2, 3], [4, 5, 6]]
t2 = [[7, 8, 9], [10, 11, 12]]
tf.concat([t1, t2], 0) # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
tf.concat([t1, t2], 1) # [[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]]
# tensor t3 with shape [2, 3]
# tensor t4 with shape [2, 3]
tf.shape(tf.concat([t3, t4], 0)) # [4, 3]
tf.shape(tf.concat([t3, t4], 1)) # [2, 6]
这里解释了当axis=0和axis=1的情况,怎么理解这个axis呢?其实这和numpy中的np.concatenate()用法是一样的。
- axis=0 代表在第0个维度拼接
- axis=1 代表在第1个维度拼接
对于一个二维矩阵,第0个维度代表最外层方括号所框下的子集,第1个维度代表内部方括号所框下的子集。维度越高,括号越小。
对于这种情况,我可以再解释清楚一点:
对于[ [ ], [ ]]和[[ ], [ ]],低维拼接等于拿掉最外面括号,高维拼接是拿掉里面的括号(保证其他维度不变)。注意:tf.concat()拼接的张量只会改变一个维度,其他维度是保存不变的。比如两个shape为[2,3]的矩阵拼接,要么通过axis=0变成[4,3],要么通过axis=1变成[2,6]。改变的维度索引对应axis的值。
这样就可以理解多维矩阵的拼接了,可以用axis的设置来从不同维度进行拼接。
对于三维矩阵的拼接,自然axis取值范围是[0, 1, 2]。
对于axis等于负数的情况:
负数在数组索引里面表示倒数(countdown)。比如,对于列表ls = [1,2,3]而言,ls[-1] = 3,表示读取倒数第一个索引对应值。
axis=-1表示倒数第一个维度,对于三维矩阵拼接来说,axis=-1等价于axis=2。同理,axis=-2代表倒数第二个维度,对于三维矩阵拼接来说,axis=-2等价于axis=1。
一般在维度非常高的情况下,我们想在最'高'的维度进行拼接,一般就直接用countdown机制,直接axis=-1就搞定了。
6. tf.app.run()
解析命令行参数,调用main 函数 main(sys.argv)
7. tf.ConfigProto()
主要的作用是配置tf.Session的运算方式,比如gpu运算或者cpu运算
https://blog.csdn.net/u012436149/article/details/53837651
https://blog.csdn.net/qq_31261509/article/details/79746114
8. tf.train.get_checkpoint_state
函数功能:找出训练时保存的模型,其中有model_checkpoint_path和all_model_checkpoint_paths两个属性
ckpt.model_checkpoint_path:可以找出所有模型中最新的模型
ckpt.all_model_checkpoint_paths:可以找出所有模型
tf.train.checkpoint_exists(...)
: 检查是否存在具有指定前缀的V1或V2检查点(弃用)。
9. tensorflow之计算梯度minimize和梯度修剪:compute_gradients与apply_gradients
9.1 minimize的使用
opt = tf.tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_op = opt.minimize(loss)
minimize的内部存在两个操作:(1)计算各个变量的梯度 (2)用梯度更新这些变量的值
def minimize(self, loss, global_step=None, var_list=None, name=None):
grads_and_vars = self.compute_gradients(loss, var_list=var_list)
vars_with_grad = [v for g, v in grads_and_vars if g is not None]
if not vars_with_grad:
raise ValueError(
"No gradients provided for any variable, check your graph for ops"
" that do not support gradients, between variables %s and loss %s." %
([str(v) for _, v in grads_and_vars], loss))
return self.apply_gradients(grads_and_vars, global_step=global_step, name=name)
9.2 梯度修剪:主要避免训练梯度爆炸和消失问题
tf.train.XXXOptimizer
apply_gradients
和compute_gradients
是所有的优化器都有的方法。
(1)computer_gradients(loss, val_list)
计算出各个变量的偏导数(梯度),是为了防止梯度爆炸和梯度消失。通过对gradient的修正,来进行避免。
val_list:进行求偏导的变量的列表,默认为graph中收集的变量列表
compute_gradients(
loss,
var_list=None,
gate_gradients=GATE_OP,
aggregation_method=None,
colocate_gradients_with_ops=False,
grad_loss=None
)
计算loss
中可训练的var_list
中的梯度,相当于minimize()
的第一步,返回(gradient, variable)
对的list。
(2)apply_gradients(grads_and_vars, global_step=None, name=None)
该函数的作用是将compute_gradients()
返回的值作为输入参数对variable进行更新。
apply_gradients(
grads_and_vars,
global_step=None,
name=None
)
minimize()
的第二部分,返回一个执行梯度更新的ops。
(3)tf.clip_by_value
输入一个张量t,把t中的每一个元素的值都压缩在clip_value_min和clip_value_max之间。小于min的让它等于min,大于max的元素的值等于max。
tf.clip_by_value(
t, # grad
clip_value_min,
clip_value_max,
name=None # val
)
例子:
#Now we apply gradient clipping. For this, we need to get the gradients,
#use the `clip_by_value()` function to clip them, then apply them:
threshold = 1.0
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(loss)
#list包括的是:梯度和更新变量的元组对
capped_gvs = [(tf.clip_by_value(grad, -threshold, threshold), var)
for grad, var in grads_and_vars]
#执行对应变量的更新梯度操作
training_op = optimizer.apply_gradients(capped_gvs)
(4)tf.clip_by_norm
指对梯度进行裁剪,通过控制梯度的最大范式,防止梯度爆炸的问题,是一种比较常用的梯度规约的方式。
tf.clip_by_norm(
t,
clip_norm, # 裁剪率
axes=None,
name=None
)
其作用在于将传入的梯度张量t
的L2范数进行了上限约束,约束值即为clip_norm
,如果t
的L2范数超过了clip_norm
,则变换为t * clip_norm / l2norm(t)
,如此一来,变换后的t
的L2范数便小于等于clip_norm
了。
10. tf.reduce_sum()之类函数
(1)tf.reduce_sum() 求和函数,在 tensorflow 里面,计算的都是 tensor,可以通过调整 axis =0,1 的维度来控制求和维度
reduce_sum (
input_tensor ,
axis = None ,
keep_dims = False ,
name = None ,
reduction_indices = None
)
- input_tensor:要减少的张量,应该有数字类型。
- axis:表示在那个维度进行sum操作。
- keep_dims:如果为true,则保留长度为1的缩小尺寸。表示是否保留原始数据的维度,False相当于执行完后原始数据就会少一个维度
- name:操作的名称(可选)。
- reduction_indices:axis的废弃的名称。为了跟旧版本的兼容,现在已经不使用了。
tf.reduce_sum函数中reduction_indices参数表示函数的处理维度。
reduction_indices参数的值默认的时候为None,默认把所有的数据求和,即结果是一维的。
reduction_indices参数的值为0,是第0维对应位置相加。
reduction_indices参数的值为1,是第1维对应位置相加。
返回值及注意:
此函数计算一个张量的各个维度上元素的总和。v
函数中的input_tensor是按照axis中已经给定的维度来减少的;除非 keep_dims 是true,否则张量的秩将在axis的每个条目中减少1;如果keep_dims为true,则减小的维度将保留为长度1。
如果axis没有条目,则缩小所有维度,并返回具有单个元素的张量.
11. tf.assign()
tf.assign(A, new_number): 这个函数的功能主要是把A的值变为new_number
12.logging模块
参考:https://www.cnblogs.com/liujiacai/p/7804848.html
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:
- 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
- print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出。
13. model.char_lookup.read_value()、model.char_lookup.assign(emb_weights)
read_value()、assign()是tf.Variable的函数
参考:变量常量类型 https://blog.csdn.net/xierhacker/article/details/53103979
assign(value, use_locking=False)
作用:为变量指定一个新的值
read_value()
作用:返回这个变量的值,在当前的上下文中读取。返回的是一个含有这个值的Tensor
14. tf.train.import_meta_graph
import_meta_graph(
meta_graph_or_file,
clear_devices=False,
import_scope=None,
**kwargs
)
从文件中将保存的graph的所有节点加载到当前的default graph中,并返回一个saver。也就是说,我们在保存的时候,除了将变量的值保存下来,其实还有将对应graph中的各种节点保存下来,所以模型的结构也同样被保存下来了。
最后
以上就是能干溪流为你收集整理的TensorFlow:常用函数介绍一、tensorflow框架笔记二. tf 常用函数的全部内容,希望文章能够帮你解决TensorFlow:常用函数介绍一、tensorflow框架笔记二. tf 常用函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复