中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
TensorFlow2.0(2):數(shù)學(xué)運(yùn)算

重磅干貨,第一時(shí)間送達(dá)

TensorFlow2.0(1):基本數(shù)據(jù)結(jié)構(gòu)——張量

1 基本運(yùn)算:(+、-、*、/、//、%)

基本運(yùn)算中所有實(shí)例都以下面的張量a、b為例進(jìn)行:

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
<tf.Tensor: id=3, shape=(2, 3), dtype=int32, numpy=
array([[1, 4, 5],
[5, 1, 4]])>
b
<tf.Tensor: id=7, shape=(2, 3), dtype=int32, numpy=
array([[1, 3, 5],
[3, 5, 2]])>

(1)加(+)

tf.add(a,b) # 通過add方法執(zhí)行加操作
<tf.Tensor: id=12, shape=(2, 3), dtype=int32, numpy=
array([[ 2, 7, 10],
[ 8, 6, 6]])>
a + b # 也可以通過操作符進(jìn)行
<tf.Tensor: id=16, shape=(2, 3), dtype=int32, numpy=
array([[ 2, 7, 10],
[ 8, 6, 6]])>

(2)減(-)

tf.subtract(a,b)
<tf.Tensor: id=18, shape=(2, 3), dtype=int32, numpy=
array([[ 0, 1, 0],
[ 2, -4, 2]])>
a - b
<tf.Tensor: id=20, shape=(2, 3), dtype=int32, numpy=
array([[ 0, 1, 0],
[ 2, -4, 2]])>

(3)乘法(*)

tf.multiply(a,b)
<tf.Tensor: id=22, shape=(2, 3), dtype=int32, numpy=
array([[ 1, 12, 25],
[15, 5, 8]])>
a * b
<tf.Tensor: id=24, shape=(2, 3), dtype=int32, numpy=
array([[ 1, 12, 25],
[15, 5, 8]])>

(4)除法(/)

tf.divide(a,b)
<tf.Tensor: id=28, shape=(2, 3), dtype=float64, numpy=
array([[1. , 1.33333333, 1. ],
[1.66666667, 0.2 , 2. ]])>
a/b
<tf.Tensor: id=32, shape=(2, 3), dtype=float64, numpy=
array([[1. , 1.33333333, 1. ],
[1.66666667, 0.2 , 2. ]])>

(5)地板除法(//)

tf.floor_div(a,b)
<tf.Tensor: id=34, shape=(2, 3), dtype=int32, numpy=
array([[1, 1, 1],
[1, 0, 2]])>
a // b
<tf.Tensor: id=38, shape=(2, 3), dtype=int32, numpy=
array([[1, 1, 1],
[1, 0, 2]])>

(6)取余(%)

tf.mod(b,a)
<tf.Tensor: id=115, shape=(2, 2, 3), dtype=int32, numpy=
array([[[0, 1, 2],
[0, 0, 2]],

[[0, 1, 2],
[0, 0, 2]]])>
b % a
<tf.Tensor: id=117, shape=(2, 2, 3), dtype=int32, numpy=
array([[[0, 1, 2],
[0, 0, 2]],

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

可以看出,對(duì)于基本運(yùn)算加(+)、減(-)、點(diǎn)乘(*)、除(/)、地板除法(//)、取余(%),都是對(duì)應(yīng)元素進(jìn)行運(yùn)算。

2 指數(shù)、開方、對(duì)數(shù)

(1)對(duì)數(shù)運(yùn)算

TensorFlow提供tf.math.log()方法來求對(duì)數(shù),當(dāng)然,求的是以自然常數(shù)為底的對(duì)數(shù):

e = 2.71828183a = tf.constant([e, e*e, e*e*e])tf.math.log(a)
<tf.Tensor: id=41, shape=(3,), dtype=float32, numpy=array([0.99999994, 2. , 3. ], dtype=float32)>
c = tf.fill([2,2],1.)tf.math.log(c)
<tf.Tensor: id=46, shape=(2, 2), dtype=float32, numpy=
array([[0., 0.],
[0., 0.]], dtype=float32)>

注意:TensorFlow中沒有提供函數(shù)實(shí)現(xiàn)以其他數(shù)值為底的對(duì)數(shù)運(yùn)算,例如。不過,我們可以通過其他方式來求取,記得下面這個(gè)高中時(shí)學(xué)過的公式嗎:

所以有:

f = tf.constant([[1., 9.], [16., 100.]])g = tf.constant([[2., 3.], [2., 10.]])
tf.math.log(f) / tf.math.log(g)
<tf.Tensor: id=52, shape=(2, 2), dtype=float32, numpy=
array([[0., 2.],
[4., 2.]], dtype=float32)>

(2)指數(shù)運(yùn)算

g = tf.constant([[2, 3], [2, 10]])
tf.pow(g, 2)
<tf.Tensor: id=66, shape=(2, 2), dtype=int32, numpy=
array([[ 4, 9],
[ 4, 100]])>

也可以直接通過運(yùn)算符來完成:

g ** 2
<tf.Tensor: id=59, shape=(2, 2), dtype=int32, numpy=
array([[ 4, 9],
[ 4, 100]])>

(3)開方

f = tf.constant([[1., 9.], [16., 100.]])
tf.sqrt(f)
<tf.Tensor: id=69, shape=(2, 2), dtype=float32, numpy=
array([[ 1., 3.],
[ 4., 10.]], dtype=float32)>

自然常數(shù)的指數(shù)運(yùn)算:

d = tf.constant([[1.,2.],[3.,4.]])
tf.exp(d)
<tf.Tensor: id=72, shape=(2, 2), dtype=float32, numpy=
array([[ 2.7182817, 7.389056 ],
[20.085537 , 54.598152 ]], dtype=float32)>

注意:對(duì)數(shù)運(yùn)算函數(shù)log()與指數(shù)運(yùn)算函數(shù)在不同的模塊中。

在我看來,上面提到的指數(shù)運(yùn)算與對(duì)數(shù)運(yùn)算不在通知模塊以及沒有提供以其他自然數(shù)為底的對(duì)數(shù)運(yùn)算,應(yīng)該應(yīng)該是TensorFlow中的遺留問題,希望能夠在正式版中得到修正。

3 矩陣相乘

import numpy as npa = tf.constant(np.arange(6),shape=(2,3))b = tf.constant(np.arange(6),shape=(3,2))
a
<tf.Tensor: id=76, shape=(2, 3), dtype=int32, numpy=
array([[0, 1, 2],
[3, 4, 5]])>
b
<tf.Tensor: id=79, shape=(3, 2), dtype=int32, numpy=
array([[0, 1],
[2, 3],
[4, 5]])>
tf.matmul(a,b)
<tf.Tensor: id=82, shape=(2, 2), dtype=int32, numpy=
array([[10, 13],
[28, 40]])>

矩陣相乘也可以通過符號(hào)來操作進(jìn)行,用“@”表示:

a @ b
<tf.Tensor: id=86, shape=(2, 2), dtype=int32, numpy=
array([[10, 13],
[28, 40]])>

這里的張量a和b都是二維的,但在實(shí)際應(yīng)用中,數(shù)據(jù)往往高于二維,這時(shí)候怎么應(yīng)算呢?

a = tf.constant(np.arange(12),shape=(2,2,3))b = tf.constant(np.arange(12),shape=(2,3,2))
a
<tf.Tensor: id=90, shape=(2, 2, 3), dtype=int32, numpy=
array([[[ 0, 1, 2],
[ 3, 4, 5]],

[[ 6, 7, 8],
[ 9, 10, 11]]])>
b
<tf.Tensor: id=93, shape=(2, 3, 2), dtype=int32, numpy=
array([[[ 0, 1],
[ 2, 3],
[ 4, 5]],

[[ 6, 7],
[ 8, 9],
[10, 11]]])>
a @ b
<tf.Tensor: id=96, shape=(2, 2, 2), dtype=int32, numpy=
array([[[ 10, 13],
[ 28, 40]],

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

可以看到,當(dāng)高于二維的張量進(jìn)行矩陣相乘時(shí),最終的實(shí)現(xiàn)還是二維矩陣相乘,只不過分成了多個(gè)二維矩陣,四維張量也是一樣的:

a = tf.constant(np.arange(24),shape=(2,2,2,3))b = tf.constant(np.arange(24),shape=(2,2,3,2))
a @ b
<tf.Tensor: id=104, shape=(2, 2, 2, 2), dtype=int32, numpy=
array([[[[ 10, 13],
[ 28, 40]],

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


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

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

4 Broadcasting機(jī)制

上面的所有實(shí)例中所用到的張量都是在維度數(shù)和形狀相同情況下進(jìn)行,那么,當(dāng)兩個(gè)張量維度數(shù)或者形狀不一樣時(shí)能不能進(jìn)行運(yùn)算呢?

a = tf.constant([1,2,3])b = tf.constant(np.arange(12),shape=(2,2,3))
b
<tf.Tensor: id=109, shape=(2, 2, 3), dtype=int32, numpy=
array([[[ 0, 1, 2],
[ 3, 4, 5]],

[[ 6, 7, 8],
[ 9, 10, 11]]])>
a + b
<tf.Tensor: id=111, shape=(2, 2, 3), dtype=int32, numpy=
array([[[ 1, 3, 5],
[ 4, 6, 8]],

[[ 7, 9, 11],
[10, 12, 14]]])>
a * b
<tf.Tensor: id=113, shape=(2, 2, 3), dtype=int32, numpy=
array([[[ 0, 2, 6],
[ 3, 8, 15]],

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

可以看到,一個(gè)一維的張量與一個(gè)三維張量進(jìn)行運(yùn)算是完全沒有問題的,從運(yùn)算結(jié)果上可以看出,相當(dāng)于是三維張量中的每一行數(shù)據(jù)與張量a進(jìn)行運(yùn)算,為什么可以這樣運(yùn)輸呢?這就得益于TensorFlow中的Broadcasting機(jī)制。

Broadcasting機(jī)制解除了只能維度數(shù)和形狀相同的張量才能進(jìn)行運(yùn)算的限制,當(dāng)兩個(gè)數(shù)組進(jìn)行算術(shù)運(yùn)算時(shí),TensorFlow的Broadcasting機(jī)制首先對(duì)維度較低的張量形狀數(shù)組填充1,從后向前,逐元素比較兩個(gè)數(shù)組的形狀,當(dāng)逐個(gè)比較的元素值(注意,這個(gè)元素值是指描述張量形狀數(shù)組的值,不是張量的值)滿足以下條件時(shí),認(rèn)為滿足 Broadcasting 的條件:

(1)相等

(2)其中一個(gè)張量形狀數(shù)組元素值為1。

當(dāng)不滿足時(shí)進(jìn)行運(yùn)算則會(huì)拋出 ValueError: frames are not aligne 異常。算術(shù)運(yùn)算的結(jié)果的形狀的每一元素,是兩個(gè)數(shù)組形狀逐元素比較時(shí)的最大值。

回到上面張量a與b相乘的例子,a的形狀是(3,),b的形狀是(2, 2, 3),在Broadcasting機(jī)制工作時(shí),首先比較維度數(shù),因?yàn)閍的維度為1,小于b的維度3,所以填充1,a的形狀就變成了(1,1,3),然后從最后端的形狀數(shù)組元素依次往前比較,先是就是3與3比,結(jié)果是相等,接著1與2相比,因?yàn)槠渲幸粋€(gè)為1,所以a的形狀變成了(1,2,3),繼續(xù)1與2比較,因?yàn)槠渲幸粋€(gè)為1,所以a的形狀變成了(2,2,3),a中的數(shù)據(jù)每一行都填充a原來的數(shù)據(jù),也就是[1,2,3],然后在與b進(jìn)行運(yùn)算。

當(dāng)然,在TensorFlow的Broadcasting機(jī)制運(yùn)行過程中,上述操作只是理論的,并不會(huì)真正的將a的形狀變成(2,2,3,),更不會(huì)將每一行填充[1,2,3],只是虛擬進(jìn)行操作,真正計(jì)算時(shí),依舊是使用原來的張量a。這么做的好處是運(yùn)算效率更高,也更節(jié)省內(nèi)存。

再舉一些例子加深理解:

  • [ ] 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 規(guī)則 ):

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

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

5 范數(shù)

范數(shù)是泛函分析中的概念,指的是一種更寬泛的長(zhǎng)度(距離)概念,只要滿足非負(fù)、自反、三角不等式就可以稱之為距離。向量范數(shù)可以使用下面公式進(jìn)行計(jì)算:

當(dāng)時(shí)分別叫做1范數(shù),2范數(shù)。除此以外,還有無(wú)窮范數(shù):

import tensorflow as tf
a = tf.constant([[1.,2.],[1.,2.]])
tf.norm(a, ord=1) # 1范數(shù)
<tf.Tensor: id=4, shape=(), dtype=float32, numpy=6.0>
tf.norm(a, ord=2) # 2范數(shù)
<tf.Tensor: id=10, shape=(), dtype=float32, numpy=3.1622777>
tf.norm(a) # ord不指定時(shí),默認(rèn)是2
<tf.Tensor: id=16, shape=(), dtype=float32, numpy=3.1622777>

我們也可以全手動(dòng)地實(shí)現(xiàn)范數(shù):

tf.sqrt(tf.reduce_sum(tf.square(a)))
<tf.Tensor: id=21, shape=(), dtype=float32, numpy=3.1622777>

指定維度求范數(shù):

tf.norm(a, ord=2, axis=0)
<tf.Tensor: id=27, shape=(2,), dtype=float32, numpy=array([1.4142135, 2.828427 ], dtype=float32)>
tf.norm(a, ord=2, axis=1)
<tf.Tensor: id=33, shape=(2,), dtype=float32, numpy=array([2.236068, 2.236068], dtype=float32)>

參考

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

作者博客:

https://www.cnblogs.com/chenhuabin

作者github:

https://github.com/ChenHuabin321/tensorflow2_tutorials

戳一下右下角在看小小舉動(dòng),大大支持~
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Tensor數(shù)據(jù)相關(guān)的運(yùn)算及函數(shù)講解
可視化NumPy、Torch和Tensorflow的基本操作
TensorFlow2學(xué)習(xí)(1)
人工智能|Tensorflow-2.0學(xué)習(xí)筆記:基礎(chǔ)操作篇一
深度學(xué)習(xí)
深度學(xué)習(xí)框架
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服