TensorFlow核心概念之Tensor(1):張量創建

??張量(Tensor)是TensorFlow的基本數據結構。張量即多維數組,Tensorflow的張量和Numpy中的ndarray對象很類似,用來定義一個 n 維數組對象,它是一個一系列相同類型元素組成的數組集合。從操作行為角度來看,TensorFlow中定義了兩種類型的張量:常量(constant)變量(Variable)。其中常量的值在計算圖中不可以被重新賦值,而變量在計算圖中可以使用assign等算子進行重新賦值。一般在模型中需要被訓練的參數需要被設置成變量,而在整個訓練過程中保持不變的參數,則被設置程常量。下面用個簡單的實例來展示常量和變量的不同,代碼如下:

import tensorflow as tf
import numpy as np 

#創建一個常量tensor
a_c  = tf.constant([1,2,3], dtype = tf.int32)
#創建一個變量tensor
a_v = tf.Variable([1,2,3], dtype = tf.int32)
#打印兩個張量在內存中的id
print(id(a_c), id(a_v))

結果如下:

2979942624944 2979988437072

接下來我們分別對這兩個tensor進行操作,用他們加上另外一個tensor。代碼如下:

#分別修改常量和變量
a_c = a_c + tf.constant([1,1,1])
a_v.assign_add([1,1,1])
print("a_c:", a_c)
print("a_v:", a_v)
#打印兩個張量在內存中的id
print(id(a_c), id(a_v))

結果如下:

a_c: tf.Tensor([2 3 4], shape=(3,), dtype=int32)
a_v: <tf.Variable 'Variable:0' shape=(3,) dtype=int32, numpy=array([2, 3, 4])>
2979942625120 2979988437072

??通過對比我們發現,常量是不可修改的,每次對原常量的操作都會新建一個新的常量對象,而張量變量通過assign等操作在原內存空間中對值內容進行修改,并不創建新的對象。以上就是簡單的對TensorFlow中的Tensor數據結構的常量和變量的區別做了個簡單的展示,下面將詳細介紹張量上的結構操作和數學運算。其中結構操作包括:張量創建,索引切片,維度變換以及合并分割,數學運算包括:標量運算,向量運算,矩陣運算及廣播。

一,創建張量

??TensorFlow中張量的創建和Numpy中ndarray的創建很類似,而且很多方法的名稱和用法都基本一致,下面就幾種常見的張量常見方式進行演示,默認以Tensor常量的創建做為實例。
標量的創建,即0維張量的創建,代碼如下:

i = tf.constant(6) #創建一個數據類型默認為tf.int32的0維張量
l = tf.constant(6, dtype=tf.int64) #創建一個數據類型為tf.int64的0維張量
f = tf.constant(3.14) #創建一個數據類型默為tf.float32的0維張量
d = tf.constant(1.414, dtype=tf.double)#創建一個數據類型為tf.double的0維張量
s = tf.constant('Hello world~') #創建一個數據類型為tf.string的0維張量
b = tf.constant(False) #創建一個數據類型為tf.bool的0維張量

print(b)
print(tf.rank(b)) #打印張量b的維度
print(b.numpy().ndim)  # tf.rank的作用和ndarray的ndim方法相同

結果如下:

tf.Tensor(False, shape=(), dtype=bool)
tf.Tensor(0, shape=(), dtype=int32)
0

向量的創建,即1維張量的創建,代碼如下:

a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0]) #使用1維數組創建1維張量
b = tf.range(1, 5, delta = 1) #使用range方法創建1維張量
c = tf.linspace(1, 5, 5) #使用linspace方法創建1維張量
tf.random.set_seed(1.0)
d = tf.random.uniform([5], minval=0, maxval = 10)#使用均勻分布隨機創建1維張量

tf.print(a)
print("a.rank:", tf.rank(a))                   
tf.print(b)
print("b.rank:", tf.rank(b))                   
tf.print(c)
print("c.rank:", tf.rank(c))                   
tf.print(d)
print("d.rank:", tf.rank(d))

結果如下:

[1 2 3 4 5]
a.rank: tf.Tensor(1, shape=(), dtype=int32)
[1 2 3 4]
b.rank: tf.Tensor(1, shape=(), dtype=int32)
[1 2 3 4 5]
c.rank: tf.Tensor(1, shape=(), dtype=int32)
[1.65130854 9.01481247 6.30974197 4.34546089 2.9193902]
d.rank: tf.Tensor(1, shape=(), dtype=int32)

??多維張量的創建基本上類似于Numpy中的多維數組ndarray,創建方式也是大同小異,結果中一般幾層中括號就代表創建的幾維的張量,示例代碼如下:

tensor2_array = tf.constant([[1.0, 2.0, 3.0],[4.0, 5.0, 6.0]]) #利用二維數組創建矩陣
tensor3_array = tf.constant([[1.0, 2.0, 3.0],[4.0, 5.0, 6.0],[7.0, 8.0, 9.0]]) #利用三維數組,創建三維張量
tf.print("tensor2_array:\n", tensor2_array)
print("----------------------------------")
tf.print("\ntensor3_array:\n", tensor3_array)
print("----------------------------------")

tensor2_ones = tf.ones([2, 2]) #利用tf.ones創建默認值為1的二維張量
tensor3_ones = tf.ones([2, 2, 2]) #利用tf.ones創建默認值為1的三維張量
tf.print("\ntensor2_ones:\n", tensor2_ones)
print("----------------------------------")
tf.print("\ntensor3_ones:\n", tensor3_ones)
print("----------------------------------")

tensor2_fill = tf.fill([2, 2], 2) #利用tf.fill創建默認值為指定值的二維張量
tensor3_fill = tf.fill([2, 2, 2], 2)  #利用tf.fill創建默認值為指定值的三維張量
tf.print("\ntensor2_fill:\n", tensor2_fill)
print("----------------------------------")
tf.print("\ntensor3_fill:\n", tensor3_fill)
print("----------------------------------")

tf.random.set_seed(1.0)
tensor2_rand_uniform = tf.random.uniform([2, 2], minval=0, maxval=10) #利用均勻分布隨機創建二維張量
tensor3_rand_uniform = tf.random.uniform([2, 2, 2], minval=0, maxval=10) #利用均勻分布隨機創建三維張量
tf.print("\ntensor2_rand_uniform:\n", tensor2_rand_uniform)
print("----------------------------------")
tf.print("\ntensor3_rand_uniform:\n", tensor3_rand_uniform)
print("----------------------------------")

tensor2_rand_norm = tf.random.normal([2, 2], mean=0.0, stddev=1.0)#利用正態分布隨機創建二維張量
tensor3_rand_norm = tf.random.normal([2, 2, 2], mean=0.0, stddev=1.0)#利用正態分布隨機創建三維張量
tf.print("\ntensor2_rand_norm:\n", tensor2_rand_norm)
print("----------------------------------")
tf.print("\ntensor3_rand_norm:\n", tensor3_rand_norm)
print("----------------------------------")

# 特殊二維張量
I = tf.eye(2,2) #單位矩陣
tf.print("\nI:\n", I)
print("----------------------------------")
diag = tf.linalg.diag([1,2,3]) #對角陣
tf.print("\ndiag:\n", diag)
print("----------------------------------")

結果如下:

tensor2_array:
 [[1 2 3]
 [4 5 6]]
----------------------------------

tensor3_array:
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
----------------------------------

tensor2_ones:
 [[1 1]
 [1 1]]
----------------------------------

tensor3_ones:
 [[[1 1]
  [1 1]]

 [[1 1]
  [1 1]]]
----------------------------------

tensor2_fill:
 [[2 2]
 [2 2]]
----------------------------------

tensor3_fill:
 [[[2 2]
  [2 2]]

 [[2 2]
  [2 2]]]
----------------------------------

tensor2_rand_uniform:
 [[1.65130854 9.01481247]
 [6.30974197 4.34546089]]
----------------------------------

tensor3_rand_uniform:
 [[[5.1010704 4.43531752]
  [4.08533096 9.92492294]]

 [[6.8866396 3.45849633]
  [4.36067 6.01060963]]]
----------------------------------

tensor2_rand_norm:
 [[-0.457012236 -0.406867266]
 [0.728577733 -0.892977774]]
----------------------------------

tensor3_rand_norm:
 [[[1.6940167 0.119693168]
  [-1.15846 0.172604024]]

 [[-0.714496315 0.689600587]
  [-1.0908159 -1.18651032]]]
----------------------------------

I:
 [[1 0]
 [0 1]]
----------------------------------

diag:
 [[1 0 0]
 [0 2 0]
 [0 0 3]]
----------------------------------

??上面簡單介紹了一下幾種不同類型和維度的張量的創建方法,接下來我們將針對Tensor操作中的索引切片進行簡單的介紹。

TensorFlow系列文章:
  1. TensorFlow核心概念之Tensor(1):張量創建
  2. TensorFlow核心概念之Tensor(2):索引切片
  3. TensorFlow核心概念之Tensor(3):變換拆合
  4. TensorFlow核心概念之Tensor(4):張量運算
  5. TensorFlow核心概念之計算圖
  6. TensorFlow核心概念之Autograph
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375