TensorFlow入門極簡(jiǎn)教程(三):標(biāo)量Scalar

TensorFlow入門極簡(jiǎn)教程(三):標(biāo)量運(yùn)算

Tensorflow的Tensor意為張量陵究。一般如果是0維的數(shù)組菱涤,就是一個(gè)數(shù)據(jù)苇倡,我們稱之為標(biāo)量Scalar锰镀;1維的數(shù)組躯喇,稱為向量Vector加袋;2維的數(shù)組哥艇,稱為矩陣Matrix谐腰;3維及以上的數(shù)組显设,稱為張量Tensor框弛。
在機(jī)器學(xué)習(xí)中,用途最廣泛的是向量和矩陣的運(yùn)算捕捂。這也是我們學(xué)習(xí)中的第一個(gè)難關(guān)瑟枫。
不過斗搞,這一節(jié)我們先打標(biāo)量的基礎(chǔ)。

上節(jié)我們學(xué)過慷妙,Tensorflow的運(yùn)行需要一個(gè)Session對(duì)象僻焚。下面代碼中所用的sess都是通過

sess = tf.Session()

獲取的Session對(duì)象,以下就都省略不寫了膝擂。

標(biāo)量Scalar

標(biāo)量是指只有一個(gè)數(shù)字的結(jié)構(gòu)虑啤。
我們嘗試將一個(gè)整數(shù)賦給一個(gè)Tensorflow的常量,看看是什么效果:

a10 = 1
b10 = tf.constant(a10)
print(b10)
print(sess.run(b10))

Tensor("Const_4:0", shape=(), dtype=int32)
1

我們可以看到架馋,tf.constant(a10)生成了一個(gè)shape為空的狞山,類型為int32的張量。

Tensorflow是一個(gè)經(jīng)過數(shù)據(jù)類型優(yōu)化的高性能系統(tǒng)叉寂,所以對(duì)于數(shù)據(jù)類型的要求比較高萍启。
比如我們想對(duì)上面的標(biāo)量b10進(jìn)行求正弦值的運(yùn)算,就會(huì)得到下面的錯(cuò)誤办绝,sin運(yùn)算只支持浮點(diǎn)數(shù)和復(fù)數(shù)類型:

b11 = tf.sin(b10)

TypeError: Value passed to parameter 'x' has DataType int32 not in list of allowed values: bfloat16, float16, float32, float64, complex64, complex128

后面我們還會(huì)多次遇到數(shù)據(jù)類型不符合要求伊约,以至于無法運(yùn)算的錯(cuò)誤。
所以我們首先要學(xué)習(xí)下Tensorflow的數(shù)據(jù)類型孕蝉。

Tensorflow的數(shù)據(jù)類型

Tensorflow主要支持以下數(shù)據(jù)類型
整型

  • tf.int8: 8位帶符號(hào)整數(shù)
  • tf.uint8: 8位無符號(hào)整數(shù)
  • tf.int16: 16位帶符號(hào)整數(shù)
  • tf.int32: 32位帶符號(hào)整數(shù)
  • tf.int64: 64位帶符號(hào)整數(shù)

浮點(diǎn)型

  • tf.float32: 32位浮點(diǎn)數(shù)
  • tf.float64: 64位浮點(diǎn)數(shù)

復(fù)數(shù):

  • tf.complex64: 64位復(fù)數(shù)
  • tf.complex128: 128位復(fù)數(shù)

在Tensorflow的很多運(yùn)算中屡律,都支持通過dtype=的方式來指定數(shù)據(jù)類型。

b01 = tf.constant(1,dtype=tf.uint8)
print(b01)

b02 = tf.constant(1,dtype=tf.float64)
print(b02)

print(sess.run(b01))
print(sess.run(b02))

Tensor("Const_4:0", shape=(), dtype=uint8)
Tensor("Const_5:0", shape=(), dtype=float64)
1
1.0

Tensor到某類型數(shù)據(jù)的轉(zhuǎn)換

通過tf.constant函數(shù)降淮,我們可以將數(shù)據(jù)轉(zhuǎn)換成Tensor超埋。同樣,Tensorflow也提供了Tensor到各種數(shù)據(jù)類型的轉(zhuǎn)換函數(shù)佳鳖。
例霍殴,將Tensor轉(zhuǎn)換成tf.int32:

b03 = tf.to_int32(b02)
print(b03)

print(sess.run(b03))
b04 = sess.run(b03)
print(b04)

Tensor("ToInt32:0", shape=(), dtype=int32)
1
1

從上面代碼可以看到,b03 run的結(jié)果就是一個(gè)整數(shù)系吩,不是Tensor.
類似的函數(shù)還有tf.to_int64, tf.to_float, tf.to_double等来庭。

定義這么多函數(shù)太麻煩了,還有一個(gè)通用的轉(zhuǎn)換函數(shù)tf.cast. 格式為:tf.cast(Tensor, 類型名)穿挨。
例:

b05 = tf.cast(b02, tf.complex128)
print(sess.run(b05))

(1+0j)

飽和轉(zhuǎn)換

如果是將大類型如int64轉(zhuǎn)成小類型int16月弛,tf.cast轉(zhuǎn)換可能會(huì)產(chǎn)生溢出。這在機(jī)器學(xué)習(xí)的計(jì)算中是件可怕的事情科盛。在這種情況下帽衙,我們就需要使用飽和類型轉(zhuǎn)換saturate_cast來保駕護(hù)航。

比如我們要把65536轉(zhuǎn)換成tf.int8類型:

b06 = tf.constant(65536, dtype=tf.int64)
print(b06)
print(sess.run(b06))

b07 = tf.saturate_cast(b06,tf.int8)
print(sess.run(b07))

Tensor("Const_4:0", shape=(), dtype=int64)
65536
127

標(biāo)量算術(shù)運(yùn)算

標(biāo)量Tensor常量可以進(jìn)行算術(shù)運(yùn)算贞绵。本質(zhì)上是調(diào)用tf.add, tf.sub, tf.mul, tf.truediv, tf.mod等重載函數(shù)厉萝。

例:

d01 = tf.constant(1)
d02 = tf.constant(2)
d_add = d01 + d02
print(d_add)

d_sub = d01 - d02
print(d_sub)

d_mul = d01 * d02
print(d_mul)

d_div = d01 / d02
print(d_div)

d_mod = d01 % d02
print(d_mod)

d_minus = -d01
print(d_minus)

Tensor("add:0", shape=(), dtype=int32)
Tensor("sub:0", shape=(), dtype=int32)
Tensor("mul:0", shape=(), dtype=int32)
Tensor("truediv:0", shape=(), dtype=float64)
Tensor("mod:0", shape=(), dtype=int32)
Tensor("Neg:0", shape=(), dtype=int32)

對(duì)于除法多說兩句,Tensor有兩種除法,一種是”/”谴垫,另一種是”//”章母。”/”是浮點(diǎn)除法弹渔,對(duì)應(yīng)的是tf.truediv胳施,而”//”是計(jì)算整除,對(duì)應(yīng)tf.floordiv肢专。

d01 = tf.constant(1)
d02 = tf.constant(2)

d_div = d01 / d02
print(d_div)

d_div2 = d01 // d02
print(d_div2)

Tensor("truediv:0", shape=(), dtype=float64)
Tensor("floordiv:0", shape=(), dtype=int32)

標(biāo)量邏輯運(yùn)算

對(duì)于>, <, >=, <=等關(guān)系舞肆,都會(huì)生成一個(gè)需要Session來運(yùn)算的Tensor對(duì)象。只有==是例外博杖,它會(huì)立即返回這兩個(gè)Tensor是否是同一對(duì)象的結(jié)果椿胯。

d01 = tf.constant(1)
d02 = tf.constant(2)

d11 = d01 > d02
d12 = d01 < d02
d13 = d01 == d02
d14 = d01 >= d02
d15 = d01 <= d02

print(d11)
print(d12)
print(d13)
print(d14)
print(d15)

Tensor("Greater:0", shape=(), dtype=bool)
Tensor("Less:0", shape=(), dtype=bool)
False
Tensor("GreaterEqual:0", shape=(), dtype=bool)
Tensor("LessEqual:0", shape=(), dtype=bool)

常用標(biāo)量數(shù)學(xué)函數(shù)

首先還是強(qiáng)調(diào)一下注意類型,比如整形剃根,一定要先轉(zhuǎn)換成浮點(diǎn)型才能進(jìn)行sqrt哩盲,sin等數(shù)學(xué)函數(shù)計(jì)算。
例:

d31 = tf.constant(100, dtype=tf.float64)
d32 = tf.sqrt(d31)
print(sess.run(d32))

10.0

另外不要忘了狈醉,像sin, cos, tan這些函數(shù)是支持復(fù)數(shù)的哦廉油。
例:

d40 = tf.constant(1+2j)
d41 = tf.sin(d40)
print(sess.run(d41))

(3.165778513216168+1.9596010414216063j)

中間結(jié)果也可以不用Tensor保存,直接用立即數(shù)苗傅,例:

d42 = tf.cos(0.5+0.3j)
print(sess.run(d42))

(0.917370851271881-0.14599480570180626j)

常量抒线、占位符和變量

前面我們主要使用立即數(shù)和常量。常量是通過tf.constant定義的渣慕,一旦定義就不能改變值的Tensor嘶炭。如果要想改變Tensor的值,有兩種變法:一種是根本就不賦值逊桦,先放個(gè)占位符眨猎;另一種是初始化成一個(gè)帶值的變量,將來再改變值强经。
下面簡(jiǎn)單介紹一下占位符和變量睡陪。

placeholder占位符

在算法計(jì)算時(shí),有很多公式需要的數(shù)值是需要從外部拿到的匿情,隨時(shí)替換的兰迫。這時(shí)候我們就可以用一個(gè)占位符來寫Tensor,需要計(jì)算時(shí)再把真數(shù)據(jù)通過feed_dict給填充進(jìn)去就可以码秉。
我們來看個(gè)例子:

d50 = tf.placeholder(tf.float32, name="input1")
d51 = tf.sin(d50)
print(sess.run(d51, feed_dict={d50: 0.2}))

0.19866933

d50開始只用個(gè)placeholder逮矛,這樣的話是沒有辦法通過之前不加feed_dict參數(shù)的sess.run來運(yùn)行的鸡号。通過指定feed_dict={d50: 0.2}转砖,我們就用數(shù)據(jù)替換掉了placeholder,就可以正常運(yùn)行了。

變量

變量與占位符不同的一點(diǎn)是府蔗,變量在使用之前需要做初始化晋控。
初始化不但要在變量定義時(shí)寫,還要調(diào)用相應(yīng)的函數(shù)在使用前執(zhí)行才可以姓赤。
我們還是舉例說明:

d60 = tf.Variable(1, dtype=tf.float32, name='number1')
d61 = tf.tan(d60)
init_op = tf.global_variables_initializer()

print(sess.run(init_op))
print(sess.run(d61))

None
1.5574077

在使用變量之前赡译,我們可以一次性調(diào)用tf.global_variables_initializer函數(shù)去初始化所有變量,并且通過Session去執(zhí)行不铆。在此之后才能使用變量蝌焚。

變量初始化之后,就可以通過assign函數(shù)來賦新值誓斥,例:

d62 = d60.assign(d60 * 2)
print(sess.run(d62))

print(sess.run(d61))

2.0
-2.1850398

小結(jié)

小結(jié)一下只洒,這節(jié)主要介紹了數(shù)據(jù)類型,標(biāo)量常用的計(jì)算函數(shù)劳坑,還有使用占位符和變量的方法毕谴。
下一節(jié)我們正式開始線性代數(shù)之旅,走進(jìn)向量距芬、矩陣和張量涝开。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市框仔,隨后出現(xiàn)的幾起案子舀武,更是在濱河造成了極大的恐慌,老刑警劉巖存和,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奕剃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捐腿,警方通過查閱死者的電腦和手機(jī)纵朋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茄袖,“玉大人操软,你說我怎么就攤上這事∠芟椋” “怎么了聂薪?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蝗羊。 經(jīng)常有香客問我藏澳,道長,這世上最難降的妖魔是什么耀找? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任翔悠,我火速辦了婚禮业崖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蓄愁。我一直安慰自己双炕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布撮抓。 她就那樣靜靜地躺著妇斤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丹拯。 梳的紋絲不亂的頭發(fā)上站超,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音乖酬,去河邊找鬼顷编。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剑刑,可吹牛的內(nèi)容都是我干的媳纬。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼施掏,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼钮惠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起七芭,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤素挽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后狸驳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體预明,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年耙箍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撰糠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辩昆,死狀恐怖阅酪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情汁针,我是刑警寧澤术辐,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站施无,受9級(jí)特大地震影響辉词,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猾骡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一瑞躺、第九天 我趴在偏房一處隱蔽的房頂上張望隧魄。 院中可真熱鬧,春花似錦隘蝎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至顽悼,卻和暖如春曼振,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔚龙。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國打工冰评, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人木羹。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓甲雅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坑填。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抛人,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361