我們在深度學習框架(4)-TensorFlow中執行計算,不同激活函數各有妙用中學習了TensorFlow中執行張量的計算,并重點討論一下不同的激活函數。
今天我們在TensorFlow中對Tensor進行“拆”和“裝”。
說明
(1)張量創建、轉化請參考深度學習框架(3)-TensorFlow中張量創建和轉化,妙用“稀疏性”提升效率(2)張量計算請參考深度學習框架(4)-TensorFlow中執行計算,不同激活函數各有妙用
1、矩陣運算的必要性
(1)Tensor是基礎的數據結構
我們在深度學習框架(1)-各顯神通提升Tensor效率,讓Tensor流動還靠深度學習框架中討論過深度學習依賴Tensor運算,我們再補充一點背景知識。
Tensor是深度學習中廣泛使用的數據結構,TensorFlow雖然形象的把它加入到命名中,但它并不是TensorFlow特有的,在Pytroch、PaddlePaddle等眾多深度學習框架中Tensor也是基本的數據結構。
Tensor本質上就是一個高維的矩陣,在深度學習領域中,以它作為基本數據結構是出于實際應用的需求。
深度學習當前最成熟的應用方向有計算機視覺(CV,Compute Vision)和自然語言處理(NLP,Natural Language Processing)兩大領域。其中CV對象主要是圖像和視頻,NLP的對象以語音和文本為主;CV的基礎模塊是卷積神經網絡(CNN,Convolutional Neural Network),NLP的基礎模塊是循環神經網絡(RNN,Recurrent Neural Network)。這兩個應用中標準的輸入數據集都至少是三維以上,例如:
圖像數據:包含三個維度,N×H×W,即樣本數×圖像高×圖像寬;如果是彩色圖像,那么還要增加一個通道C,變為N×C×H×W;如果是視頻圖像,那么可能還要再增加一個維度T,N×C×H×W×T。
文本數據:包含三個維度:N×L×H,即樣本數×序列長度×特征數。
源于應用需要,深度學習模型的輸入數據結構一般都要三維以上,而Tensor是好的選擇,用于支撐深度學習模型和訓練時更為便利。
(2)矩陣運算是基礎
我們在深度學習框架(4)-TensorFlow中執行計算,不同激活函數各有妙用用TensorFlow中的不同函數執行了加法、乘法等各種運算。
加法:矩陣的加法只有同型矩陣之間才可以進行加法,所謂同型矩陣是兩個矩陣的行數、列數必須相等。
轉置:把矩陣的行和列互相交換所產生的矩陣稱轉置矩陣。
乘法:兩個矩陣乘法的必要條件是,第一個矩陣A的列數和另一個矩陣B的行數相等時才能相乘。如矩陣A是m×n矩陣和B是n×p矩陣,它們的乘積C是一個m×p矩陣。
分解:矩陣分解是將一個矩陣分解為簡單的或具有某種特性的若干矩陣的和或乘積 ,矩陣分解法有三角分解、譜分解、奇異值分解、滿秩分解等。
我們可以把矩陣的各種操作想象為它在一定空間內,按照一定的規則進行的運動(或變換)。比如一個向量和一個矩陣相乘,我們可以想象為在線性空間中,向量刻畫了對象,矩陣刻畫了對象的運動,用矩陣與向量的乘法施加了運動。因此,“矩陣的本質是運動的描述”,而想要執行運動必須要要有約束,包括自身的形狀,運動的規則等等。
(3)從英偉達的Tensor Core了解Tenosr索引、重構、切片的價值
我們在深度學習框架(1)-各顯神通提升Tensor效率,讓Tensor流動還靠深度學習框架中討論過,為滿足深度學習激增的計算量,英偉達在volta架構上推出了第一代TensorCore,以后每一代產品都對TensorCore不斷升級優化。
TensorCore是專為深度學習而設計的,它在Tensor場景下算得更快,對于特定大小和精度的矩陣乘法實現了性能的突破,與前一代Pascal相比,Volta用于訓練的峰值性能提升12倍,用于推理的峰值性能提升了6倍。
TensorCore改進的方向就是針對矩陣乘法(GEMM,General Matrix Mulitiplicaiton)運算進行優化。矩陣運算是神經網絡訓練和推理的核心,下圖以4×4矩陣為例,每個TensorCore都在重復執行以下操作 D = A×B + C
Tensor Core在執行矩陣乘法和加法運算時整個裝置可簡化為下圖,我們在前面幾章中討論的Tensor的convert,matual,add等操作這里均包含了,我們要注意的是,比如上圖D =A×B+C是以4×4矩陣為基礎的,那么在執行這個指令前,矩陣必須通過裁剪或者整型成為一個4×4矩陣,標準的input才能在這個裝置結構中完成指令。
Tensor的索引、切片、重構、填充等操作非常常見,因為整個計算系統中從實際應用的輸入數據轉為了Tensor形式的數據結構,到轉化為適合放置于內存中的數據模塊,再到轉化為計算裝置執行計算指令的數據單元,這每個步驟中都涉及到了Tensor的“拆”和“裝”的操作。對Tensor進行索引、重構、切片都是程序員的必備技能。
2、如何對一個Tensor進行“拆”和“裝”?
(1)導入TensorFlow,創建tensor
import tensorflow as tf importnumpyasnp rank_1_tensor = tf.constant([0, 1, 1, 2, 3, 5, 8, 13, 21, 34]) rank_2_tensor=tf.constant([[1,2], [3,4], [5,6]]) rank_3_tensor=tf.constant([ [[0, 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]],])
(2)索引(indexing)
通過索引我們可以在Tensor中提取數據,包括單軸索、多軸索引等。
單軸索引(single-axis indexing)
print("First:", rank_1_tensor[0].numpy()) print("From 4 to the end:", rank_1_tensor[4:].numpy()) print("From2,before7:",rank_1_tensor[2:7].numpy())
打印結果>>>
First: 0 From 4 to the end: [ 3 5 8 13 21 34] From 2, before 7: [1 2 3 5 8]
多軸索引(muti-axis indexing)
print(rank_3_tensor[:,:,4])
打印結果>>>
tf.Tensor( [[ 4 9] [14 19] [24 29]], shape=(3, 2), dtype=int32)
(3)切片(Slice)
通過tf.slice()函數可以對不同維度的張量進行切片,通過tf.gather_nd()函數可以從多個軸中提取切片。
Tensorslice
print(tf.slice(rank_3_tensor, begin=[1,1,0],size=[1,1,2]))
打印結果>>>
tf.Tensor([[[1516]]],shape=(1,1,2),dtype=int32)
Tensor gather
print(tf.gather_nd(rank_3_tensor,indices=[[2],[0]]))
打印結果>>>
tf.Tensor( [[[20 21 22 23 24] [2526272829]] [[ 0 1 2 3 4] [ 5 6 7 8 9]]], shape=(2, 2, 5), dtype=int32)
(4)形狀的整理變換(Reshaping)
通過tf.reshape()可改變張量形狀,重構速度快,資源消耗低。
reshape matrix
var_x = tf.Variable(tf.constant([[1], [2], [3]])) print(var_x.shape.as_list) reshaped = tf.reshape(var_x, [1,3]) print(var_x.shape) print(reshaped.shape)
打印結果>>>
(3, 1) (1, 3)
reshape tensor
print(tf.reshape(rank_3_tensor,[3*2,5]),"n")
打印結果>>>
tf.Tensor( [[ 0 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]], shape=(6, 5), dtype=int32)
reshape tensor
print(tf.reshape(rank_3_tensor,[3,-1]))
打印結果>>>
tf.Tensor( [[ 0 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]], shape=(3, 10), dtype=int32)
(5)數據的插入(insert)
通過tf.tensor_scatter_nd()可實現在不同維度的張量中插入數據。
insert data into vector
t1 = tf.constant([10]) indices = tf.constant([[1], [3], [5], [7], [9]]) data = tf.constant([2, 4, 6, 8, 10]) print(tf.scatter_nd(indices=indices, updates=data, shape=t1))
打印結果>>>
tf.Tensor([ 0 2 0 4 0 6 0 8 0 10], shape=(10,), dtype=int32)
insert data into tensor
t2 = tf.constant([[2, 7, 0], [9, 0, 1], [0, 3, 8]]) print(tf.tensor_scatter_nd_add(t2, indices=[[0,2],[1,1],[2,0]], updates=[6,5,4]))
打印結果>>>
tf.Tensor( [[2 7 6] [9 5 1] [4 3 8]], shape=(3, 3), dtype=int32)
今天我們學習了如何在TensorFlow中對Tensor進行“拆”和“裝”,掌握對Tensor進行索引、重構、切片等操作非常重要。到這里我們張量部分知識討論了很多了,下一步我們學習如何使用TensorFlow中的變量
審核編輯:劉清
-
神經網絡
+關注
關注
42文章
4764瀏覽量
100542 -
tensorflow
+關注
關注
13文章
329瀏覽量
60499 -
nlp
+關注
關注
1文章
487瀏覽量
22012
原文標題:深度學習框架(5)-TensorFlow中對Tensor進行“拆”和“裝”
文章出處:【微信號:Hardware_10W,微信公眾號:硬件十萬個為什么】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論