一、維度變換
多維張量在物理上以一維的方式連續存儲,通過定義維度和形狀,在邏輯上把它理解為多維張量。
當對多維張量進行維度變換時,只是改變了邏輯上索引的方式,沒有改變內存中的存儲方式。
1、改變張量形狀
使用函數:tf.reshape(tensor, shape)
shape參數=-1:表示自動推導出長度
2、增加和刪除維度
多維張量的軸,就是張量的維度,張量中軸的概念和用法,和 numpy 中一樣。
軸也可以是負數,表示從后向前索引。
(1)增加維度
使用函數:tf.expand_dims(tensor, axis):增加指定軸axis的維度,長度為 1。axis 的取值可為正,可為負。
(2)刪除維度
tf.squeeze(tensor, asix=None) :tensor 原始張量,axis 要刪除的維度(只能刪除長度為1的維度,省略時刪除所有長度為1的維度)
增加和刪除維度,只是改變了張量的視圖,不會改變張量的存儲。
3、交換維度
tf.transpose(tensor, perm) : perm 調整張量中各個軸的順序,例如perm=[1,0,2],即表示將tensor張量按照axis為1,0,2的順序調整。
對於二維張量,不指明perm就是求其轉置。
4、拼接張量
將多個張量在某個維度上合並
拼接不會產生新的維度
tf.concat(tensor, axis):tensor 所有需要拼接的張量列表,axis 指定在那個軸上進行拼接。
5、分割張量
將一個張量拆分成多個張量,分割后維度不變。
tf.split(tensor, num_or_size_splits, axis=0)
- tensor:待分割張量
- num_or_size_splits:分割方案
-
是一個數值時,表示等長分割,數值是切割的份數;
-
是一個列表時,表示不等長切割,列表中是切割后每份的長度
-
- axis:指明分割的軸
分割后的多個tensor張量以列表形式返回。
6、堆疊張量
在合並張量時,創建一個新的維度,和numpy中的堆疊完全一樣。
tf.stack(tensors, axis) :tensors 要堆疊的多個張量 ,axis 指定插入新維度的位置
7、分解張量
是張量堆疊的逆運算,張量分解為多個張量,分解后得到的每個張量,和原來的張量相比,維數都少了一維。
tf.unstack(tensor, axis)
二、數據采樣
獲取張量指定位置的值,和 numpy 操作幾乎完全一樣。
1、索引
2、切片
使用如下格式取得一定范圍內的值。
[起始位置:結束位置:步長]
起始位置、結束位置 是前閉后開的,切片中不包含結束位置
起始位置、結束位置、步長都可以省略
步長可以是負數,這時起始位置的索引號,應該大於結束位置
二維以上的張量維度之間用逗號間隔
3、數據提取
根據索引,抽取出沒有規律的、特定的數據,用一個索引列表,將給定張量中對應索引值的元素提取出來
使用函數 gather(tensor. indices) 參數為 輸入張量 和 索引值列表
如果是對 多維張量 進行取值,可以在 gather函數中指定維度:axis
同時采取多個點的值
使用函數 gather_nd(tensor, position)
也可以對部分維度進行采用,例如對一個三維張量,給出的位置列表中元素為二維等。
三、張量數字運算
1、基本數學運算
(1)加減乘除運算
參數x,y是參加運算的兩個張量,並且要求各個張量中的元素數據類型必須一致。
(2)冪指對數運算
pow 函數也可對二維張量進行運算,例如:
對於求對數運算注意:tensorflow中只有以 e 為底的對數運算函數
注意:sqrt、exp、math.log等函數中的張量的數據類型都必須是浮點型
(5)其他運算
(6)三角函數和反三角函數運算
2、重載運算符
為了方便簡潔,tensorflow重載了常用的運算符,如下表所示。
3、廣播機制
可以實現不同維度的張量的運算,要求兩個張量的最后一個維度必須相等。
當張量和一個數字值運算時,會將這個值廣播到張量的各個元素。
4、張量和numpy之間的相互轉換
當張量 和 numpy的ndarray 共同參與運算時,他們之間會自動的轉換。
例如,若一個張量和一個 ndarray 執行 tf 下的函數操作,則 ndarray自動轉換為張量,然后進行計算;反之亦然。
當使用運算符計算時,只要操作數中有張量對象,就都轉換為張量,然后進行計算。
四、張量乘法運算
我們上面介紹的乘法是元素乘法,即對應元素相乘。實際中,我們更多使用的是張量乘法運算,即矩陣的乘法。在tensor中,用二維張量表示矩陣。使用方法如下:
向量乘法:tf.matmul() 函數 或 @運算符
例如 :張量 a 的形狀為 (2, 3),張量 b 的形狀為 (3, 2),使用 tf.matmul(a, b) 或 a@b 得到向量乘法結果。
五、常用數據統計函數
求張量在某個維度上、或者全局的統計值。
reduce表示降維,input_tensor表示輸入的張量,axis表示對哪個維度進行計算,不指定則默認為全局。
注意:在求值時,為求得精確結果,可以指定數據類型為浮點型,或者使用 tf.cast(tensor, dtype) 函數轉換為浮點型。
求最值的索引
使用 tf.argmax(input_tensor, axis) 和 tf.argmin(input_tensor, axis) 求最大值和最小值的索引。
注意:沒有指定 axis 時,默認 axis=0,和上面的reduce 有區別。
其他常用函數
1、tf.data.Dataset.from_tensor_slices
data = tf.data.Dataset.from_tensor_slices((輸入特征, 標簽))
numpy 和 tensor 都適用於該語句的輸入
feature = tf.constant([12, 23, 10, 17]) labels = tf.constant([0, 1, 1, 0]) dataset = tf.data.Dataset.from_tensor_slices((feature, labels))
2、enumerate
enumerate 是python 的內建函數,他可遍歷每個元素,常在for循環中使用,得到的是一個元組 (索引,元素)
seq = ['one', 'two', 'three'] for i, element in enumerate(seq): print(i, element) for i in enumerate(seq): print(i)
結果:
0 one 1 two 2 three (0, 'one') (1, 'two') (2, 'three')
3、tf.one_hot
獨熱編碼:在分類問題中,常用獨熱編碼做標簽
tf.one_hot(待轉換數據,depth=幾分類)
classes = 3 labels = tf.constant([1, 0, 2]) output = tf.one_hot(labels, depth=classes) print(output)
結果
tf.Tensor( [[0. 1. 0.] [1. 0. 0.] [0. 0. 1.]], shape=(3, 3), dtype=float32)
4、tf.nn.softmax
當n分類的n個輸出通過softmax()函數,便符合概率分布。也就是使輸出的每個值在0~1之間,而這些值的和為1.
y = tf.constant([1, 2, 3,4], dtype=tf.float32) # 必須是浮點型 y_pro = tf.nn.softmax(y) print(y_pro)
結果:
tf.Tensor([0.0320586 0.08714432 0.23688284 0.6439143 ], shape=(4,), dtype=float32)
5、assign_sub
賦值操作,更新參數的值並返回。調用 assign_sub前,要先用 tf.Variable 指定為可訓練變量(可自更新)
w.assign_sub(w要自減的內容)
w = tf.Variable(4) w.assign_sub(1) # w -= 1 print(w)
6、np.random.RandomState
import numpy as np # 返回一個 [0, 1) 的隨機值 rdm = np.random.RandomState(seed=1) # 設置隨機數種子 a = rdm.rand() # 返回一個隨機標量 b = rdm.rand(2, 3) # 返回維度為2行3列隨機數矩陣 print(a, "\n", b)
7、
綜上。