成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Tensorflow快餐教程(2) - 標(biāo)量運算

gggggggbong / 2459人閱讀

摘要:在機器學(xué)習(xí)中,用途最廣泛的是向量和矩陣的運算。同樣,也提供了到各種數(shù)據(jù)類型的轉(zhuǎn)換函數(shù)。定義這么多函數(shù)太麻煩了,還有一個通用的轉(zhuǎn)換函數(shù)格式為類型名。這在機器學(xué)習(xí)的計算中是件可怕的事情。只有是例外,它會立即返回這兩個是否是同一對象的結(jié)果。

Tensorflow的Tensor意為張量。一般如果是0維的數(shù)組,就是一個數(shù)據(jù),我們稱之為標(biāo)是Scalar;1維的數(shù)組,稱為向量Vector;2維的數(shù)組,稱為矩陣Matrics;3維及以上的數(shù)組,稱為張量Tensor。
在機器學(xué)習(xí)中,用途最廣泛的是向量和矩陣的運算。這也是我們學(xué)習(xí)中的第一個難關(guān)。
不過,這一節(jié)我們先打標(biāo)量的基礎(chǔ)。

上節(jié)我們學(xué)過,Tensorflow的運行需要一個Session對象。下面代碼中所用的sess都是通過

sess = tf.Session()

獲取的Session對象,以下就都省略不寫了。

標(biāo)量Scalar

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

  >>> a10 = 1
   >>> b10 = tf.constant(a10)
   >>> print(b10) Tensor("Const_6:0", shape=(), dtype=int32)
   >>> sess.run(b10) 1

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

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

>>> b11 = tf.sin(b10)
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/lib/python3.6/site-packages/tensorflow/python/ops/gen_math_ops.py", line 6862, in sin
    "Sin", x=x, name=name)
  File "/usr/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 609, in _apply_op_helper
    param_name=input_name)
  File "/usr/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 60, in _SatisfiesTypeConstraint
    ", ".join(dtypes.as_dtype(x).name for x in allowed_list)))
TypeError: Value passed to parameter "x" has DataType int32 not in list of allowed values: 

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

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

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

整型:

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

浮點型:

tf.float32: 32位浮點數(shù)
tf.float64: 64位浮點數(shù)

復(fù)數(shù):

tf.complex64: 64位復(fù)數(shù)
tf.complex128: 128位復(fù)數(shù)
在Tensorflow的很多運算中,都支持通過dtype=的方式來指定數(shù)據(jù)類型。
例:

>>> b01 = tf.constant(1,dtype=tf.uint8)
>>> print(b01)
Tensor("Const_7:0", shape=(), dtype=uint8)
>>> b02 = tf.constant(1,dtype=tf.float64)
>>> print(b02)
Tensor("Const_8:0", shape=(), dtype=float64)
>>> sess.run(b01)
1
>>> sess.run(b02)
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)
Tensor("ToInt32:0", shape=(), dtype=int32)
>>> sess.run(b03)
1
>>> b04 = sess.run(b03)
>>> print(b04)
1

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

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

>>> b05 = tf.cast(b02, tf.complex128)
>>> sess.run(b05)
(1+0j)
飽和轉(zhuǎn)換

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

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

>>> b06 = tf.constant(65536,dtype=tf.int64)
>>> print(b06)
Tensor("Const_9:0", shape=(), dtype=int64)
>>> sess.run(b06)
65536
>>> b07 = tf.saturate_cast(b06,tf.int8)
>>> sess.run(b07)
127
標(biāo)量算術(shù)運算

標(biāo)量Tensor常量可以進行算術(shù)運算。本質(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)
Tensor("add:0", shape=(), dtype=int32)
>>> d_sub = d01 - d02
>>> print(d_sub)
Tensor("sub:0", shape=(), dtype=int32)
>>> d_mul = d01 * d02
>>> print(d_mul)
Tensor("mul:0", shape=(), dtype=int32)
>>> d_div = d01 / d02
>>> print(d_div)
Tensor("truediv:0", shape=(), dtype=float64)
>>> d_mod = d01 % d02
>>> print(d_mod)
Tensor("mod:0", shape=(), dtype=int32)
>>> d_minus = -d01
>>> print(d_minus)
Tensor("Neg:0", shape=(), dtype=int32)

對于除法多說兩句,Tensor有兩種除法,一種是"/",另一種是"http://"。"/"是浮點除法,對應(yīng)的是tf.truediv,而"http://"是計算整除,對應(yīng)tf.floordiv。

>>> d_div = d01 / d02
>>> print(d_div)
Tensor("truediv:0", shape=(), dtype=float64)
>>> d_div2 = d01 // d02
>>> print(d_div2)
Tensor("floordiv:0", shape=(), dtype=int32)
標(biāo)量邏輯運算

對于>, <, >=, <=等關(guān)系,都會生成一個需要Session來運算的Tensor對象。只有==是例外,它會立即返回這兩個Tensor是否是同一對象的結(jié)果。

>>> d11 = d01 > d02
>>> d12 = d01 < d02
>>> d13 = d01 == d02
>>> d14 = d01 >= d02
>>> d15 = d01 <= d02
>>> print(d11)
Tensor("Greater_1:0", shape=(), dtype=bool)
>>> print(d12)
Tensor("Less:0", shape=(), dtype=bool)
>>> print(d13)
False
>>> print(d14)
Tensor("GreaterEqual:0", shape=(), dtype=bool)
>>> print(d15)
Tensor("LessEqual:0", shape=(), dtype=bool)
>>> d11 = d01 > d02
常用標(biāo)量數(shù)學(xué)函數(shù)

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

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

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

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

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

>>> d42 = tf.cos(0.5+0.3j)
>>> sess.run(d42)
(0.917370851271881-0.14599480570180629j)
常量、占位符和變量

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

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

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

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

變量

變量與占位符不同的一點是,變量在使用之前需要做初始化。
初始化不但要在變量定義時寫,還要調(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()
>>> sess.run(init_op)
>>> sess.run(d61)
1.5574077

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

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

  >>> d62 = d60.assign(d60 * 2)
    >>> sess.run(d62)
    2.0
    >>> sess.run(d61)
    -2.1850398
小結(jié)

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

詳情請閱讀原文

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41589.html

相關(guān)文章

  • Tensorflow快餐教程(3)- 向量

    摘要:向量雖然簡單,高效,且容易理解??焖偕上蛄康姆椒ê瘮?shù)生成等差數(shù)列函數(shù)用來快速生成一個等差數(shù)列。例拼瓷磚就是將一段向量重復(fù)若干次。向量操作將向量反序可以使用函數(shù)。向量計算向量加減法同樣長度的向量之間可以進行加減操作。 摘要: Tensorflow向量操作 向量 向量在編程語言中就是最常用的一維數(shù)組。二維數(shù)組叫做矩陣,三維以上叫做張量。 向量雖然簡單,高效,且容易理解。但是與操作0維的標(biāo)...

    draveness 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<