我是靠谱客的博主 能干溪流,最近开发中收集的这篇文章主要介绍TensorFlow:常用函数介绍一、tensorflow框架笔记二. tf 常用函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

学习网址: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_gradientscompute_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,具备如下优点:

  1. 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
  2. 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 常用函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部