Tensorflow02-張量操作


一、維度變換

多維張量在物理上以一維的方式連續存儲,通過定義維度和形狀,在邏輯上把它理解為多維張量。

當對多維張量進行維度變換時,只是改變了邏輯上索引的方式,沒有改變內存中的存儲方式。

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、

 

 

 

綜上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM