【遐思】一转眼初十了。最近社会上的各种事情有点魔幻,人民日报上2015年的一篇文章《因循疲玩》总是跳到自己的显示屏上,关于“周期律”的事情我也一直再思考,2019年是建国70周年,而在汉朝建国70周年正是汉武帝时期。我就在思考为何这么多年过去了,中华民族没有一点进步呢?特别是在思想素养,精神追求上,没有危机感,没有上进心,得过且过,认为“中国梦”是少数人的事情。
这个问题的答案思考的还不是那么彻底,思考也还不到位!只当初步且片面的见解,整体原因在疆域广阔,人口众多,人们在短暂的一生中看不到自己的地位和重要性。中国人太多了,要想在其中脱颖而出真的很难,天时(家庭背景)地利(工作领域)人和(个人性格)缺一不可。于是整天无所事事,得过且过,学习成为了“年轻人”,“少数人”的事,没有危机感,从来不未雨绸缪,事情发生了再想办法。只有少数人在奋斗,在拼搏,在奉献,甚至这少部分人还被别人嫉妒,被别人陷害嘲讽,乃至拉下水。如果一开始就陷入了一个满是“闲人”的环境中,估计这辈子也就那样了,变成另外一个“闲人”。但是在一些小体量的国家,除了人口少之外,他们天生地知道自己的国家处在一个什么样的境地,人外有人,天外有天,有危机感,加之人口少,一旦你表现出点滴优秀,就会有众多资源来奖励你的付出。但是在中国不同,中国太大了,你会总感觉跳不出中国这个地域,不知道外面的世界是怎么样的,你的那丁点优秀对整个国家来说不值一提,因为类似你这样的人太多了,无论什么领域。
【史悟】唯有“恒”可得之,始终保持学习,始终保持优秀,方可不沦为凡尘。这是刘邦八个儿子的名字告诉我的。另外如果想成为优秀的人,就必须和优秀的人为伍。
1. 矩阵基本运算
【注】进行运算的两个元素类型必须是一致的,int32 * int32
,float32 * 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)>
网友评论