点击“机器学习算法与Python实战”,“置顶”公众号

重磅干货,第一时间送达

TensorFlow2.0(1):基本数据结构——张量

1 基本运算:(+、-、*、/、//、%)

基本运算中所有实例都以下面的张量a、b为例进行:

import tensorflow as tfa = tf.random.uniform([2, 3], minval=1, maxval=6,dtype=tf.int32)b = tf.random.uniform([2, 3], minval=1, maxval=6,dtype=tf.int32)
a
array([[1, 4, 5],       [5, 1, 4]])>
b
array([[1, 3, 5],       [3, 5, 2]])>

(1)加(+)

tf.add(a,b)  # 通过add方法执行加操作
array([[ 2,  7, 10],       [ 8,  6,  6]])>
a + b  # 也可以通过操作符进行
array([[ 2,  7, 10],       [ 8,  6,  6]])>

(2)减(-)

tf.subtract(a,b)
array([[ 0,  1,  0],       [ 2, -4,  2]])>
a - b
array([[ 0,  1,  0],       [ 2, -4,  2]])>

(3)乘法(*)

tf.multiply(a,b)
array([[ 1, 12, 25],       [15,  5,  8]])>
a * b
array([[ 1, 12, 25],       [15,  5,  8]])>

(4)除法(/)

tf.divide(a,b)
array([[1.        , 1.33333333, 1.        ],       [1.66666667, 0.2       , 2.        ]])>
a/b
array([[1.        , 1.33333333, 1.        ],       [1.66666667, 0.2       , 2.        ]])>

(5)地板除法(//)

tf.floor_div(a,b)
array([[1, 1, 1],       [1, 0, 2]])>
a // b
array([[1, 1, 1],       [1, 0, 2]])>

(6)取余(%)

tf.mod(b,a)
array([[[0, 1, 2],        [0, 0, 2]],

       [[0, 1, 2],        [0, 0, 2]]])>
b % a
array([[[0, 1, 2],        [0, 0, 2]],

       [[0, 1, 2],        [0, 0, 2]]])>

可以看出,对于基本运算加(+)、减(-)、点乘(*)、除(/)、地板除法(//)、取余(%),都是对应元素进行运算。

2 指数、开方、对数

(1)对数运算

TensorFlow提供tf.math.log()方法来求对数,当然,求的是以自然常数为底的对数:

e = 2.71828183a = tf.constant([e, e*e, e*e*e])tf.math.log(a)
c = tf.fill([2,2],1.)tf.math.log(c)
array([[0., 0.],       [0., 0.]], dtype=float32)>

注意:TensorFlow中没有提供函数实现以其他数值为底的对数运算,例如, 。不过,我们可以通过其他方式来求取,记得下面这个高中时学过的公式吗:

所以有:

f = tf.constant([[1., 9.], [16., 100.]])g = tf.constant([[2., 3.], [2., 10.]])
tf.math.log(f) / tf.math.log(g)
array([[0., 2.],       [4., 2.]], dtype=float32)>

(2)指数运算

g = tf.constant([[2, 3], [2, 10]])
tf.pow(g, 2)
array([[  4,   9],       [  4, 100]])>

也可以直接通过运算符来完成:

g ** 2
array([[  4,   9],       [  4, 100]])>

(3)开方

f = tf.constant([[1., 9.], [16., 100.]])
tf.sqrt(f)
array([[ 1.,  3.],       [ 4., 10.]], dtype=float32)>

自然常数的指数运算:

d = tf.constant([[1.,2.],[3.,4.]])
tf.exp(d)
array([[ 2.7182817,  7.389056 ],       [20.085537 , 54.598152 ]], dtype=float32)>

注意:对数运算函数log()与指数运算函数在不同的模块中。

在我看来,上面提到的指数运算与对数运算不在通知模块以及没有提供以其他自然数为底的对数运算,应该应该是TensorFlow中的遗留问题,希望能够在正式版中得到修正。

3 矩阵相乘

import numpy as npa = tf.constant(np.arange(6),shape=(2,3))b = tf.constant(np.arange(6),shape=(3,2))
a
array([[0, 1, 2],       [3, 4, 5]])>
b
array([[0, 1],       [2, 3],       [4, 5]])>
tf.matmul(a,b)
array([[10, 13],       [28, 40]])>

矩阵相乘也可以通过符号来操作进行,用“@”表示:

a @ b
array([[10, 13],       [28, 40]])>

这里的张量a和b都是二维的,但在实际应用中,数据往往高于二维,这时候怎么应算呢?

a = tf.constant(np.arange(12),shape=(2,2,3))b = tf.constant(np.arange(12),shape=(2,3,2))
a
array([[[ 0,  1,  2],        [ 3,  4,  5]],

       [[ 6,  7,  8],        [ 9, 10, 11]]])>
b
array([[[ 0,  1],        [ 2,  3],        [ 4,  5]],

       [[ 6,  7],        [ 8,  9],        [10, 11]]])>
a @ b
array([[[ 10,  13],        [ 28,  40]],

       [[172, 193],        [244, 274]]])>

可以看到,当高于二维的张量进行矩阵相乘时,最终的实现还是二维矩阵相乘,只不过分成了多个二维矩阵,四维张量也是一样的:

a = tf.constant(np.arange(24),shape=(2,2,2,3))b = tf.constant(np.arange(24),shape=(2,2,3,2))
a @ b
array([[[[  10,   13],         [  28,   40]],

        [[ 172,  193],         [ 244,  274]]],

       [[[ 550,  589],         [ 676,  724]],

        [[1144, 1201],         [1324, 1390]]]])>

4 Broadcasting机制

上面的所有实例中所用到的张量都是在维度数和形状相同情况下进行,那么,当两个张量维度数或者形状不一样时能不能进行运算呢?

a = tf.constant([1,2,3])b = tf.constant(np.arange(12),shape=(2,2,3))
b
array([[[ 0,  1,  2],        [ 3,  4,  5]],

       [[ 6,  7,  8],        [ 9, 10, 11]]])>
a + b
array([[[ 1,  3,  5],        [ 4,  6,  8]],

       [[ 7,  9, 11],        [10, 12, 14]]])>
a * b
array([[[ 0,  2,  6],        [ 3,  8, 15]],

       [[ 6, 14, 24],        [ 9, 20, 33]]])>

可以看到,一个一维的张量与一个三维张量进行运算是完全没有问题的,从运算结果上可以看出,相当于是三维张量中的每一行数据与张量a进行运算,为什么可以这样运输呢?这就得益于TensorFlow中的Broadcasting机制。

Broadcasting机制解除了只能维度数和形状相同的张量才能进行运算的限制,当两个数组进行算术运算时,TensorFlow的Broadcasting机制首先对维度较低的张量形状数组填充1,从后向前,逐元素比较两个数组的形状,当逐个比较的元素值(注意,这个元素值是指描述张量形状数组的值,不是张量的值)满足以下条件时,认为满足 Broadcasting 的条件:

(1)相等

(2)其中一个张量形状数组元素值为1。

当不满足时进行运算则会抛出 ValueError: frames are not aligne 异常。算术运算的结果的形状的每一元素,是两个数组形状逐元素比较时的最大值。

回到上面张量a与b相乘的例子,a的形状是(3,),b的形状是(2, 2, 3),在Broadcasting机制工作时,首先比较维度数,因为a的维度为1,小于b的维度3,所以填充1,a的形状就变成了(1,1,3),然后从最后端的形状数组元素依次往前比较,先是就是3与3比,结果是相等,接着1与2相比,因为其中一个为1,所以a的形状变成了(1,2,3),继续1与2比较,因为其中一个为1,所以a的形状变成了(2,2,3),a中的数据每一行都填充a原来的数据,也就是[1,2,3],然后在与b进行运算。

当然,在TensorFlow的Broadcasting机制运行过程中,上述操作只是理论的,并不会真正的将a的形状变成(2,2,3,),更不会将每一行填充[1,2,3],只是虚拟进行操作,真正计算时,依旧是使用原来的张量a。这么做的好处是运算效率更高,也更节省内存。

再举一些例子加深理解:

  • [ ] A:(2d array): 5 x 4
  • [ ] B:(1d array): 1
  • [ ] Result:(2d array): 5 x 4

  • [ ] A:(2d array): 5 x 4
  • [ ] B:(1d array): 4
  • [ ] Result:(2d array): 5 x 4

  • [ ] A:(3d array): 15 x 3 x 5
  • [ ] B:(3d array): 15 x 1 x 5
  • [ ] Result:(3d array): 15 x 3 x 5

  • [ ] A:(3d array): 15 x 3 x 5
  • [ ] B:(2d array): 3 x 5
  • [ ] Result:(3d array): 15 x 3 x 5

  • [ ] A:(3d array): 15 x 3 x 5
  • [ ] B:(2d array): 3 x 1
  • [ ] Result:(3d array): 15 x 3 x 5

一些反例(不满足 Broadcasting 规则 ):

  • [ ] A (1d array): 3
  • [ ] B (1d array): 4

  • [ ] A (2d array): 2 x 1
  • [ ] B (3d array): 8 x 4 x 3

5 范数

范数是泛函分析中的概念,指的是一种更宽泛的长度(距离)概念,只要满足非负、自反、三角不等式就可以称之为距离。向量的范数可以使用下面公式进行计算:

当时分别叫做1范数,2范数。除此以外,还有无穷范数:

import tensorflow as tf
a = tf.constant([[1.,2.],[1.,2.]])
tf.norm(a, ord=1)  # 1范数
tf.norm(a, ord=2)  # 2范数
tf.norm(a)  # ord不指定时,默认是2

我们也可以全手动地实现范数:

tf.sqrt(tf.reduce_sum(tf.square(a)))

指定维度求范数:

tf.norm(a, ord=2, axis=0)
tf.norm(a, ord=2, axis=1)

参考

https://lufficc.com/blog/tensorflow-and-numpy-broadcasting

作者博客:

https://www.cnblogs.com/chenhuabin

作者github:

https://github.com/ChenHuabin321/tensorflow2_tutorials

戳一下右下角在看,小小举动,大大支持~

加入机器学习微信群,请后台回复「入群

推荐阅读:

深度研究:回归模型评价指标R2_score爬取拉勾网数据,看互联网寒冬下,数据分析师还吃香吗?手把手教你如何在阿里云ECS搭建Python TensorFlow Jupyter

取余运算怎么算_TensorFlow2.0(2):数学运算相关推荐

  1. Python之数据分析(Numpy中的除法和取余、三角函数、ufunc对象的位运算)

    文章目录 一.四种除法 二.取余运算 三.斐波那契数的四种求法 四.坐标变化的三角函数 五.ufunc对象位运算 一.四种除法 1.真除: 结果完全保留,小数部分也保留 1)numpy.true_di ...

  2. math python 向上取整_Python的数值基本运算和其它数学运算方法

    数值基本运算 支持最基本的数学运算符号:+ - * / % **.取正负+x -x,地板除法//,除法和取模divmod(x, y): 12345678910111213141516171819202 ...

  3. lua4.0中实现% 取余操作

    相信大家对%取余很熟悉,lua5.0以上也完美的支持了,但是我最新的项目服务器使用%却莫名的报错,最后终于找到了罪魁祸首, #define LUA_VERSION "Lua 4.0" ...

  4. 深度理解取余/取模运算

    日常编程经常会接触到取余/取模运算,那么计算机中取余/取模运算究竟是怎么定义的? P1:四种"取整"方式 数学取整 1.1 向0取整 parseInt() 注意接受参数是strin ...

  5. C语言符号-取余\取模运算

    目录 前言 取整 向0取整 向-∞取整 向+∞取整 四舍五入取整 汇总 取模\余 对于正数取模 对于负数取模 取余和取模的理解 前言 本文主要讲解并真正理解取余\取模运算是怎样的! 取整 首先取整有四 ...

  6. 蓝桥杯Fibonacci数列第n项模10007取余问题

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...

  7. 解决对整数取余的问题

    文章目录 前言 问题 什么是取余 解决方案 总结 参考链接 前言 通过这篇文章,您将学到以下两个知识点: 什么是余数,如何取余? 如何创建Notification ID? 下面我们先了解问题的上下文背 ...

  8. MaxCompute SQL函数详解 ODPS SQL函数详解---之常用数学运算相关函数

    MaxCompute SQL函数详解 ODPS SQL函数详解---之常用数学运算相关函数 MaxCompute/ODPS SQL常用数学运算相关函数 ABS函数-计算绝对值 sql:select A ...

  9. Stewart平台及其数学运算

    Stewart平台及其数学运算 Stewart平台 Stewart平台的数学运算 使用RC舵机控制Stewart平台 本文用于记录自己学习Stewart平台的过程,并分享自己的学习经验.我在做本科毕业 ...

最新文章

  1. Py之albumentations:albumentations库函数的简介、安装、使用方法之详细攻略
  2. c语言程序设计风筝图案,《C语言程序设计》作业答案
  3. SAP Spartacus中使用到的Angular ModuleWithProviders类型
  4. JUnit4参数化和理论示例
  5. Ferguson游戏
  6. 川职院单招计算机考什么专业,四川单招考什么科目
  7. Mysql把查询的列作为判断条件(case函数)
  8. AcWing 1987. 粉刷栅栏(离散化+差分)
  9. 利用H5开发微信公众号
  10. 统计单词个数 状态机方法
  11. mysql卸载注意问题_mysql卸载注意事项
  12. 非主流字体输入法_魏大勋更博晒非主流自拍,粉丝的关注点却在他的字体上,太复杂了...
  13. 【内网安全】445端口的入侵与扫描
  14. Cisco 路由器作业1.1 路由器初始化配置
  15. 做图片用的计算机配置文件,电脑如何显示照片色域为DCI-P3标准的拍摄照片
  16. 安卓开发学习之锁屏的实现
  17. English Study
  18. Hoodoop-MapReduce学习
  19. 电视机和机顶盒等焦点问题
  20. 小白学 Python(1):开篇

热门文章

  1. s-sed替换或者修改文件指定行,同时匹配多个字符串,替换换行符为指定字符
  2. Linux服务器安装配置JDK
  3. Scrapy shell
  4. [树形dp] Jzoj P5233 概率博弈
  5. 【转】《iOS7 by Tutorials》系列:iOS7的设计精髓(上)
  6. 转载LINQ优点 自己学习用的
  7. SLAM笔记(五)光束平差法(Bundle Adjustment)
  8. JavaScript跨域总结与解决办法
  9. Dynamo 以及一致性哈希简介
  10. 将Session值储存于SQL Server中