Tensorflow快餐教程(3)- 向量

摘要: Tensorflow向量操做編程

向量

向量在編程語言中就是最經常使用的一維數組。
二維數組叫作矩陣,三維以上叫作張量。數組

向量雖然簡單,高效,且容易理解。可是與操做0維的標量數據畢竟仍是不一樣的。好比向量常常用於表示一個序列,生成序列像標量同樣一個一個手工寫就不划算了。固然能夠用循環來寫。在向量中這樣還好,若是是在矩陣或者是張量中就強烈建議不要用循環來作了。系統提供的函數通常都是通過高度優化的,並且可使用GPU資源來進行加速。
咱們一方面儘量地多使用系統的函數,另外一方面也不要迷信它們,代碼優化是一個實踐的過程,能夠實際比較測量一下。編程語言

快速生成向量的方法

range函數生成等差數列
tf.range函數用來快速生成一個等差數列。至關於以前咱們講numpy時的np.arange函數。函數

原型:學習

tf.range(start, limit, delta=1, dtype=None, name='range')

例:優化

>>> b11 = tf.range(1,100,1)
>>> b11
<tf.Tensor 'range:0' shape=(99,) dtype=int32>
>>> sess.run(b11)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
       18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
       35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
       52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
       69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
       86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99],
      dtype=int32)

linspace生成浮點等差數組

tf.linspace與tf.range的區別在於,數據類型不一樣。spa

tf.lin_space(
    start,
    stop,
    num,
    name=None
)

其中,start和stop必須是浮點數,且類型必須相同。num必須是整數。code

例:資源

>>> a2 = tf.linspace(1.0,10.0,4)  
>>> a2
<tf.Tensor 'LinSpace_2:0' shape=(4,) dtype=float32>
>>> sess.run(a2)
array([ 1.,  4.,  7., 10.], dtype=float32)

拼瓷磚

就是將一段向量重複若干次。原型

>>> a10 = tf.range(1,4,1)
>>> sess.run(a10)
array([1, 2, 3], dtype=int32)
>>> a11 = tf.tile(a10,[3])
>>> sess.run(a11)
array([1, 2, 3, 1, 2, 3, 1, 2, 3], dtype=int32)

向量操做

將向量反序
可使用tf.reverse函數。
原型:

tf.reverse(
    tensor,
    axis,
    name=None
)

tensor是向量,axis軸對於向量不重要,給個[-1]就能夠了。折騰軸是張量時間的事情,暫時還用不到。

>>> a2 = tf.linspace(1.0,10.0,4)
>>> a3 = tf.reverse(a2,[-1])
>>> sess.run(a3)
array([10.,  7.,  4.,  1.], dtype=float32)

切片

切片也是向量的經常使用操做之一,就是取數組的一部分。

例:

>>> a5 = tf.linspace(1.0,100.0, 10)
>>> sess.run(a5)
array([  1.,  12.,  23.,  34.,  45.,  56.,  67.,  78.,  89., 100.],
      dtype=float32)
>>> a6 = tf.slice(a5, [2],[4])
>>> sess.run(a6)
array([23., 34., 45., 56.], dtype=float32)

未來處理張量時,咱們從一個矩陣切一塊,或從一個張量中切一塊,就好玩得多了。可是原理跟向量上是同樣的。

鏈接

tf.concat也是須要給定軸信息的。對於兩個線性的向量,咱們給0或者-1就好。

>>> a20 = tf.linspace(1.0,2.0,10)
>>> sess.run(a20)
array([1.       , 1.1111112, 1.2222222, 1.3333334, 1.4444444, 1.5555556,
       1.6666667, 1.7777778, 1.8888888, 2.       ], dtype=float32)
>>> a21 = tf.linspace(2.0,3.0,5)
>>> sess.run(a22)
array([1.       , 1.1111112, 1.2222222, 1.3333334, 1.4444444, 1.5555556,
       1.6666667, 1.7777778, 1.8888888, 2.       , 2.       , 2.25     ,
       2.5      , 2.75     , 3.       ], dtype=float32)
>>> a23 = tf.concat([a20,a21],-1)
>>> sess.run(a23)
array([1.       , 1.1111112, 1.2222222, 1.3333334, 1.4444444, 1.5555556,
       1.6666667, 1.7777778, 1.8888888, 2.       , 2.       , 2.25     ,
       2.5      , 2.75     , 3.       ], dtype=float32)

向量計算

向量加減法
一樣長度的向量之間能夠進行加減操做。

例:

>>> a40 = tf.constant([1,1])
>>> a41 = tf.constant([2,2])
>>> a42 = a40 + a41
>>> sess.run(a42)
array([3, 3], dtype=int32)
>>> a43 = a40 - a41
>>> sess.run(a43)
array([-1, -1], dtype=int32)
>>> a43
<tf.Tensor 'sub:0' shape=(2,) dtype=int32>

向量乘除標量
向量乘除標量也很是好理解,就是針對向量中的每一個數都作乘除法。

例:

>>> a44 = a40 * 2
>>> sess.run(a44)
array([2, 2], dtype=int32)
>>> a45 = a44 / 2  
>>> sess.run(a45)
array([1., 1.])
>>> a44
<tf.Tensor 'mul:0' shape=(2,) dtype=int32>
>>> a45
<tf.Tensor 'truediv_1:0' shape=(2,) dtype=float64>

廣播運算
若是針對向量和標量進行加減運算,也是會對向量中的每一個數進行加減運算。這種操做稱爲廣播操做。

例:

**>>> a46 = a40 + 1

sess.run(a46)
array([2, 2], dtype=int32)
a46
<tf.Tensor 'add_1:0' shape=(2,) dtype=int32>**

小結

從上面咱們學習的函數咱們能夠看到,與普通語言中提供的函數可能是爲一維數組操做不一樣,Tensorflow中的切片、拼接等操做也是基於張量的。
當咱們後面學到張量遇到困難時,不妨回來看下這一節。無論後面張量多麼複雜,其實也只是從一維向二維和多維推廣而己。

詳情請閱讀原文

相關文章
相關標籤/搜索