美文网首页
TensorFlow中常见的数学运算

TensorFlow中常见的数学运算

作者: 酵母小木 | 来源:发表于2020-02-03 13:33 被阅读0次

    【遐思】一转眼初十了。最近社会上的各种事情有点魔幻,人民日报上2015年的一篇文章《因循疲玩》总是跳到自己的显示屏上,关于“周期律”的事情我也一直再思考,2019年是建国70周年,而在汉朝建国70周年正是汉武帝时期。我就在思考为何这么多年过去了,中华民族没有一点进步呢?特别是在思想素养,精神追求上,没有危机感,没有上进心,得过且过,认为“中国梦”是少数人的事情。

    这个问题的答案思考的还不是那么彻底,思考也还不到位!只当初步且片面的见解,整体原因在疆域广阔,人口众多,人们在短暂的一生中看不到自己的地位和重要性。中国人太多了,要想在其中脱颖而出真的很难,天时(家庭背景)地利(工作领域)人和(个人性格)缺一不可。于是整天无所事事,得过且过,学习成为了“年轻人”,“少数人”的事,没有危机感,从来不未雨绸缪,事情发生了再想办法。只有少数人在奋斗,在拼搏,在奉献,甚至这少部分人还被别人嫉妒,被别人陷害嘲讽,乃至拉下水。如果一开始就陷入了一个满是“闲人”的环境中,估计这辈子也就那样了,变成另外一个“闲人”。但是在一些小体量的国家,除了人口少之外,他们天生地知道自己的国家处在一个什么样的境地,人外有人,天外有天,有危机感,加之人口少,一旦你表现出点滴优秀,就会有众多资源来奖励你的付出。但是在中国不同,中国太大了,你会总感觉跳不出中国这个地域,不知道外面的世界是怎么样的,你的那丁点优秀对整个国家来说不值一提,因为类似你这样的人太多了,无论什么领域。

    【史悟】唯有“恒”可得之,始终保持学习,始终保持优秀,方可不沦为凡尘。这是刘邦八个儿子的名字告诉我的。另外如果想成为优秀的人,就必须和优秀的人为伍。

    1. 矩阵基本运算

    【注】进行运算的两个元素类型必须是一致的,int32 * int32float32 * float32

    • 【+】:加
    • 【-】:减
    • 【*】:乘
    • 【/】:除
    • 【%】:整除
    • 【//】:取余
    //ipython实战练习,【a】【b】进行运算的【shape】是一致的
    //对应位置进行标量操作
    In [3]: b = tf.fill([2, 2], 2.)
    
    In [4]: a = tf.ones([2, 2])
    
    In [5]: a + b
    Out[5]: <tf.Tensor: id=9, shape=(2, 2), dtype=float32, numpy=
    array([[3., 3.],
           [3., 3.]], dtype=float32)>
    
    In [6]: a - b
    Out[6]: <tf.Tensor: id=10, shape=(2, 2), dtype=float32, numpy=
    array([[-1., -1.],
           [-1., -1.]], dtype=float32)>
    
    In [7]: a * b
    Out[7]: <tf.Tensor: id=11, shape=(2, 2), dtype=float32, numpy=
    array([[2., 2.],
           [2., 2.]], dtype=float32)>
    
    In [8]: a / b
    Out[8]: <tf.Tensor: id=12, shape=(2, 2), dtype=float32, numpy=
    array([[0.5, 0.5],
           [0.5, 0.5]], dtype=float32)>
    
    In [9]: b//a
    Out[9]: <tf.Tensor: id=13, shape=(2, 2), dtype=float32, numpy=
    array([[2., 2.],
           [2., 2.]], dtype=float32)>
    
    In [10]: b % a
    Out[10]: <tf.Tensor: id=14, shape=(2, 2), dtype=float32, numpy=
    array([[0., 0.],
           [0., 0.]], dtype=float32)>
    

    2. 指数和对数运算

    • 【tf.math.log()】:以e为底的对数运算,数据格式为单精度浮点数
    • 【tf.exp()】:以e为底的指数运算
    //ipython实战练习,【a】【b】进行运算的【shape】是一致的
    In [11]: a = tf.ones([2, 2])
    
    In [12]: a
    Out[12]: <tf.Tensor: id=17, shape=(2, 2), dtype=float32, numpy=
    array([[1., 1.],
           [1., 1.]], dtype=float32)>
    
    In [13]: tf.math.log(a)
    Out[13]: <tf.Tensor: id=18, shape=(2, 2), dtype=float32, numpy=
    array([[0., 0.],
           [0., 0.]], dtype=float32)>
    
    In [14]: tf.exp(a)
    Out[14]: <tf.Tensor: id=19, shape=(2, 2), dtype=float32, numpy=
    array([[2.7182817, 2.7182817],
           [2.7182817, 2.7182817]], dtype=float32)>
    //利用换底公式,实现以不同数为底的对数运算
    In [15]: tf.math.log(8.)/tf.math.log(2.)
    Out[15]: <tf.Tensor: id=24, shape=(), dtype=float32, numpy=3.0>
    
    In [16]: tf.math.log(100.)/tf.math.log(10.)
    Out[16]: <tf.Tensor: id=29, shape=(), dtype=float32, numpy=2.0>
    

    3. 指数幂运算和开方运算

    • 【tf.square()】:对tensor进行平方
    • 【tf.pow(tensor, N)】:对tensor进行N次方
    • 【tf.sqrt()】:开方,数据要为单精度浮点数
    In [29]: b = tf.fill([2, 2], 2.)
    
    In [30]: tf.pow(b, 3)
    Out[30]: <tf.Tensor: id=74, shape=(2, 2), dtype=float32, numpy=
    array([[8., 8.],
           [8., 8.]], dtype=float32)>
    //**可以实现指数幂运算
    In [31]: b**3
    Out[31]: <tf.Tensor: id=76, shape=(2, 2), dtype=float32, numpy=
    array([[8., 8.],
           [8., 8.]], dtype=float32)>
    //根号2
    In [32]: tf.sqrt(b)
    Out[32]: <tf.Tensor: id=77, shape=(2, 2), dtype=float32, numpy=
    array([[1.4142135, 1.4142135],
           [1.4142135, 1.4142135]], dtype=float32)>
    

    4. 矩阵运算

    • 【@ | tf.matmul()】:矩阵乘法
    In [33]: a = tf.ones([2, 2])
    In [34]: b = tf.fill([2, 2], 2.)
    
    In [35]: a
    Out[35]: <tf.Tensor: id=80, shape=(2, 2), dtype=float32, numpy=
    array([[1., 1.],
           [1., 1.]], dtype=float32)>
    
    In [36]: b
    Out[36]: <tf.Tensor: id=83, shape=(2, 2), dtype=float32, numpy=
    array([[2., 2.],
           [2., 2.]], dtype=float32)>
    
    In [37]: a @ b
    Out[37]: <tf.Tensor: id=84, shape=(2, 2), dtype=float32, numpy=
    array([[4., 4.],
           [4., 4.]], dtype=float32)>
    
    In [38]: tf.matmul(a, b)
    Out[38]: <tf.Tensor: id=85, shape=(2, 2), dtype=float32, numpy=
    array([[4., 4.],
           [4., 4.]], dtype=float32)>
    //高维的矩阵运算
    In [39]: a = tf.ones([4, 2, 3])
    In [40]: b = tf.fill([4, 3, 5], 2.)
    【2x3】@【3x5】==>【2x5】,而前面的【4】则是进行并行运算的【batch】
    In [41]: a@b
    Out[41]: <tf.Tensor: id=92, shape=(4, 2, 5), dtype=float32, numpy=
    array([[[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]],
    
           [[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]],
    
           [[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]],
    
           [[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]]], dtype=float32)>
    
    In [42]: tf.matmul(a, b)
    Out[42]: <tf.Tensor: id=93, shape=(4, 2, 5), dtype=float32, numpy=
    array([[[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]],
    
           [[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]],
    
           [[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]],
    
           [[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]]], dtype=float32)>
    
    //如果整体shape不同,则需要进行【broadcasting】操作
    In [44]: a = tf.ones([4, 2, 3])
    
    In [45]: a
    Out[45]: <tf.Tensor: id=96, shape=(4, 2, 3), dtype=float32, numpy=
    array([[[1., 1., 1.],
            [1., 1., 1.]],
    
           [[1., 1., 1.],
            [1., 1., 1.]],
    
           [[1., 1., 1.],
            [1., 1., 1.]],
    
           [[1., 1., 1.],
            [1., 1., 1.]]], dtype=float32)>
    
    In [46]: b = tf.fill([3, 5], 2.)
    
    In [47]: b
    Out[47]: <tf.Tensor: id=99, shape=(3, 5), dtype=float32, numpy=
    array([[2., 2., 2., 2., 2.],
           [2., 2., 2., 2., 2.],
           [2., 2., 2., 2., 2.]], dtype=float32)>
    //由于【shape】不一样,需要进行相应的数据维度扩充,当然也可以自动扩充
    In [50]: a@b
    Out[50]: <tf.Tensor: id=103, shape=(4, 2, 5), dtype=float32, numpy=
    array([[[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]],
    
           [[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]],
    
           [[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]],
    
           [[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]]], dtype=float32)>
    
    In [48]: bb = tf.broadcast_to(b, [4, 3, 5])
    
    In [49]: a@bb
    Out[49]: <tf.Tensor: id=102, shape=(4, 2, 5), dtype=float32, numpy=
    array([[[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]],
    
           [[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]],
    
           [[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]],
    
           [[6., 6., 6., 6., 6.],
            [6., 6., 6., 6., 6.]]], dtype=float32)>
    

    5. 矩阵运算实例设计

    • 【Y = X@W + B】
    In [51]: x = tf.ones([4, 2])
    
    In [52]: w = tf.ones([2, 1])
    
    In [53]: b = tf.constant(0.1)
    
    In [54]: x @ w + b
    Out[54]: <tf.Tensor: id=112, shape=(4, 1), dtype=float32, numpy=
    array([[2.1],
           [2.1],
           [2.1],
           [2.1]], dtype=float32)>
    //加入非线性因子
    In [55]: out = x @ w + b
    In [56]: out = tf.nn.relu(out)
    //引入【relu】函数
    In [57]: out
    Out[57]: <tf.Tensor: id=115, shape=(4, 1), dtype=float32, numpy=
    array([[2.1],
           [2.1],
           [2.1],
           [2.1]], dtype=float32)>
    

    参考资料

    相关文章

      网友评论

          本文标题:TensorFlow中常见的数学运算

          本文链接:https://www.haomeiwen.com/subject/ntuqxhtx.html