挑选出tensor中等于0的索引_NLP实战篇之tf2中tensor、variable、gradient、ops

54daa00afa3f53bfaeff423e7cde6f3f.png

本文是基于tensorflow2.2.0版本,介绍了tf中变量、张量的概念,tf中梯度的计算方式和tensor相关的操作。

实战系列篇章中主要会分享,解决实际问题时的过程、遇到的问题或者使用的工具等等。如问题分解、bug排查、模型部署等等。相关代码实现开源在:https://github.com/wellinxu/nlp_store ,更多内容关注知乎专栏(或微信公众号):NLP杂货铺。

3b293a2a8a514b3340a8f9146e516a7f.png
  • 变量
  • 张量
    • 张量的创建
    • 形状
    • 索引
  • 其他张量
    • 非矩阵张量
    • 稀疏张量
  • 梯度计算
    • GradientTape的参数与方法
    • Gradient tapes
    • 模型中的梯度
  • operations
    • 数组操作
    • 检查操作
    • 裁剪操作
    • 流程控制操作
    • 函数操作
    • 数学操作
    • 其他操作
  • 参考

变量

TensorFlow2中可以使用tf.Variable来创建变量,变量与张量(tensor)很接近,拥有tensor的很多属性,以及操作(加减乘除等)。但张量是不可改变的,而变量是可以重新赋值的。变量的创建以及再赋值方法如下:

import 

张量

tensor(张量)是具有统一类型的多位数组,跟Python中数字、字符串类似,张量是不可改变的,只能创建一个新张量而不能更新张量的值(变量则可以更新)。

张量的创建

tensor可以直接从各种类型的数组(list或numpy)来创建,也能转成numpy数据。

# 创建

形状

tensor形状相关的有这么几个概念:

  1. 形状:shape,tesor中每个维度的长度
  2. 秩,rank,tensor维度的个数,标量的秩是0,向量是1,矩阵是2
  3. 维度,axis/dimension
  4. 大小,size,tensor中所有元素的个数

下面代码中展示了一个4维tensor的几个概念:

rank_4_tensor 

tf中可以使用reshape或者transpose操作来改变形状,reshape操作非常快捷并且消耗资源很小,下面代码演示了这两种操作的简单使用:

# 改变形状

索引

TensorFlow遵循标准的python索引规则,类似于在python中索引列表或字符串,以及numpy索引的基本规则。

  1. 索引开始于 0
  2. 负索引从末尾开始倒数
  3. 冒号:用于切片start:stop:step
# 索引

其他张量

tf中除了提供了标准的张量之外,还提供了一些其他张量,比如非矩阵张量和系数矩阵张量。下面就简单介绍了这两种张量的定义方式。

非矩阵张量

# 非矩阵张量

稀疏张量

# 稀疏张量

梯度计算

为了能够进行自动微分计算,tf需要记录在前向过程中都有哪些操作,然后在后向过程中,tf以相反的顺序遍历操作列表来计算梯度。

GradientTape的参数与方法

  1. persistent:控制tape的gradient()方法是否可以多次被调用,默认是False
  2. watch_accessed_variables:控制tape是否自动记录可训练的变量,默认是True
  3. watch():手动添加被tape记录的变量(tensor)
  4. watched_variables():按照构造顺序返回tape中被记录的变量
  5. gradient():计算被tape记录的操作的梯度

Gradient tapes

tf中提供了tf.GradientTape接口来进行自动微分计算,如下面代码所示,先将前向计算的操作过程记录在tape上,然后就可以用tape进行梯度计算。

w 

模型中的梯度

在很多时候,我们需要计算模型中可训练变量的梯度。因为tf.Module的子类都会将所有变量放在Module.trainable_variables中,所以我们可以比较方便的计算模型中变量的梯度。

# 模型中的梯度计算

operations

本小节简单列举了tf中可以对tensor进行的一些操作,知道某些操作的存在,可以较快地实现某些模型、结构,当然具体使用过程中,还需要仔细研究各api的使用方式、适用范围。

数组操作

  1. boolean_mask:根据布尔型mask返回一个新的tensor
  2. concat:根据某个维度,横向拼接多个tensor
  3. edit_distance:计算序列间的编辑距离
  4. expand_dims:在指定的维度上增加一维
  5. fill:使用一个标量填充来创建一个tensor
  6. gather:根据索引获取tensor值
  7. identity:复制一个跟输入形状、内容一样的tensor
  8. meshgrid:将1xN维tensor广播成NxN维tensor
  9. one_hot:将索引变成one-hot值
  10. ones:生成全1tensor
  11. ones_like:生成一个跟输入形状一样的全1tensor
  12. pad:pad一个tensor
  13. rank:获取tensor的秩
  14. repeat:重复输入的tensor
  15. reshape:改变tensor形状
  16. sequence_mask:生成一个mask tensor
  17. shape:获取tensor的形状
  18. size:获取tensor的大小
  19. slice:从tensor中获取一个切片
  20. split:切分tensor
  21. squeeze:去除大小为1的维度
  22. stack:根据某个维度,纵向拼接多个tensor
  23. tile:通过平铺一个给定的tensor来创建一个新tensor
  24. transpose:对tensor进行转置
  25. unique:从向量(1维tensor)中找出唯一值
  26. where:判断tensor中哪些元素符合条件
  27. zeros:生成全0的tensor
  28. zeros_like:生成跟输入形状一样的全0tensor

检查操作

  1. assert_equal:判断两个tensor的元素是否相等
  2. assert_greater:判断第一个tensor的元素是否大于第二个
  3. assert_less:判断第一个tensor的元素是否小于第二个
  4. assert_rank:判断tensor的秩

裁剪操作

  1. clip_by_norm:根据范数裁剪tensor的值
  2. clip_by_global_norm:根据范数裁剪多个tensor的值
  3. clip_by_value:根据最大最小值限制裁剪tensor的值

流程控制操作

  1. Assert:验证给定的条件是否正确
  2. case:创建一个case操作
  3. cond:类似三元运算
  4. group:创建一个集合多个操作的操作
  5. switch_case:创建一个switch case操作
  6. tuple:创建tensor元组
  7. while_loop:while循环

函数操作

  1. foldl:在tensor第0维上进行函数操作,类似reduce
  2. foldr:flodl的逆序,即从最后一个元素到第一个元素
  3. scan:扫描tensor第0维上的数据进行函数操作
  4. map_fn:在tensor第0维上进行函数操作,类似map

数学操作

  1. acos:acos三角函数计算
  2. acosh:acosh三角函数计算
  3. add:加法计算
  4. asin:asin三角函数计算
  5. asinh:asinh三角函数计算
  6. atan:atan三角函数计算
  7. atanh:atanh三角函数计算
  8. cos:cos三角函数计算
  9. cosh:cosh三角函数计算
  10. floor:去尾法近似计算
  11. greater:大于运算
  12. greater_equal:大于等于运算
  13. less:小于运算
  14. less_equal:小于等于运算
  15. linspace:根据开始、结束、间隔生成值
  16. logical_and:逻辑与运算
  17. logical_not:逻辑非运算
  18. logical_or:逻辑或运算
  19. maximum:计算最大值
  20. minimum:计算最小值
  21. negative:计算负tensor值
  22. realdiv:除法计算
  23. sin:sin三角函数计算
  24. sinh:sinh三角函数计算
  25. square:平方计算
  26. tan:tan三角函数计算
  27. tanh:tanh三角函数计算
  28. truncatediv:除法计算
  29. truncatemod:取余计算
  30. eig:矩阵特征分解计算
  31. eigvals:矩阵特征值计算
  32. eye:构造单位矩阵
  33. norm:计算tensor的范数
  34. abs:绝对值计算
  35. add_n:加法计算,多个tensor
  36. argmax:获取最大值索引
  37. argmin:获取最小值索引
  38. cast:数据类型转换
  39. complex:构建复数
  40. cumsum:累计和计算
  41. divide:除法计算
  42. equal:等于运算
  43. exp:指数计算
  44. matmul:点积运算
  45. multiply:乘积计算
  46. not_equal:不等于运算
  47. pow:幂运算
  48. range:创建数字序列
  49. reduce_all:进行逻辑与的reduce操作
  50. reduce_any:进行逻辑或的reduce操作
  51. reduce_logsumexp:进行 指数后求和在对数化 的操作
  52. reduce_max:计算某个维度的最大值
  53. reduce_mean:计算某个维度的平均值
  54. reduce_min:计算某个维度的最小值
  55. reduce_prod:计算某个维度的连乘
  56. reduce_sum:计算某个维度的和
  57. round:四舍五入近似计算
  58. scalar_mul:标量与tensor相乘
  59. sigmoid:sigmoid计算
  60. sign:sign计算
  61. sqrt:开方计算
  62. tensordot:根据指定维度和外积做张量搜索
  63. truediv:除法计算
  64. argsort:获取排序后的索引值
  65. sort:排序操作
  66. einsum:爱因斯坦求和约定,强大的张量处理方式

其他操作

  1. print:日志打印
  2. py_function:将Python函数包装成tf操作
  3. numpy_function:将numpy函数包装成tf操作
  4. as_string:转为string
  5. timestamp:以秒为单位的时间

参考

https://www.tensorflow.org/guide/variablehttps://www.tensorflow.org/guide/tensorhttps://www.tensorflow.org/guide/autodiff
tensorflow/__init__.py

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值