技術分享 | 你真的懂tf.transpose()函數與Tensor轉置操作嗎?

2021-02-21 策撲智能

大家上午好!

今天向各位分享TensorFlow中張量Tensor的轉置函數tf.transpose()的用法,重點介紹其參數perm及原理。

Tensor 的階

在開始介紹轉置函數之前,我們先來看一下Tensor的階

當張量Tensor為一個標量時,即不帶方向的純量,其階為0;

x0 = tf.constant(1)
print(x0) # 輸出 tf.Tensor(1, shape=(), dtype=int32)

當Tensor為一個向量時,如[1, 2, 3]時,其階為1;

x1 = tf.constant([1, 2, 3])
print(x1) # 輸出 tf.Tensor([1 2 3], shape=(3,), dtype=int32)

當Tensor為矩陣時,其階為2,如

x2 = tf.constant([[1, 2], [3, 4]])
print(x2) # 輸出 tf.Tensor([[1 2] [3 4]], shape=(2, 2), dtype=int32)

而3階Tensor可以被認為是一個立方體的數字集合,由多個小立方體組成,每個小立方體上存放了一個數字,如下圖所示:

x3 = tf.constant([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print(x3) # 輸出 tf.Tensor([[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [10 11 12]]], shape=(2, 2, 3), dtype=int32)

Tensor 的轉置

接下來我們對Tensor的轉置進行討論

0階,1階Tensor的轉置,可以說沒有意義;2階Tensor轉置就相當於矩陣轉置,比如

的轉置就為 

屬於大學線性代數部分,也無需過多介紹;

我們重點來討論3階Tensor的轉置,這時就需要用到tf.transpose()函數了

tf.transpose()函數的官方文檔中,介紹了該函數存在一個參數perm,通過指定perm的值,來完成的Tensor的轉置。

perm表示張量階的指定變化。假設Tensor是2階的,且其shape=(x, y),此狀態下默認perm = [0, 1]。當對2階Tensor進行轉置時,如果指定tf.transpose(perm=[1, 0]),就直接完成了矩陣的轉置,此時Tensor的shape=(y, x).

x2_ = tf.transpose(x2)
print(x2_) # 輸出 tf.Tensor([[1 3] [2 4]], shape=(2, 2), dtype=int32)

而處理對象為3階Tensor時,在下方例子中,官方文檔中給出了這麼一句話:
(https://tensorflow.google.cn/api_docs/python/tf/transpose)

# 'perm' is more useful for n-dimensional tensors, for n > 2

於是問題來了,為什麼要設置perm=[0, 2, 1]?當參數perm=[0, 2, 1]設置完成後,為什麼會得到這樣的轉置結果呢?

tf.transpose()函數及perm參數詳解

這就要和原Tensor本身的shape有關了。

首先看Tensor x3是如何組成的。該Tensor中,最外層1個中括號包含了2個中括號,這兩個中括號又分別包含了2個中括號,這兩個中括號又包含了3個int型數值,所以其shape值為(2, 2, 3)。當我們將這個3維Tensor畫成立體圖時,如下圖所示。

x3 = tf.constant([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print(x3) # 輸出 tf.Tensor([[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [10 11 12]]], shape=(2, 2, 3), dtype=int32)

關鍵來了,這裡我們可以將perm理解為切割該立方體的切割順序。我們已知Tensor x3的shape是(2, 2, 3),它對應著原perm的切割順序。這個順序就是,先豎著與側邊平行切一次再橫著切一次再豎著平行於橫邊切一次,如下圖所示,就得到了Tensor原本的形狀。

我們將這種切割順序依次定義為0,1,2,於是perm=[0, 1, 2],如下圖所示:

在搞懂這個對應關係後。再來看如果不通過代碼結果,我們如何確定轉置後的Tensor形狀。

當我們對這個3維Tensor x3進行轉置,並設定perm值為[0, 2, 1]時,則此時對應的shape形狀就會轉化為(2, 3, 2)。為什麼呢?

perm=[0, 2, 1]就意味著,對立方體要按照如下順序進行切割:先豎著與側邊平行切一次再豎著平行於橫邊切一次再橫著切一次,如下圖所示,就得到了轉置後Tensor的形狀。



這時,我們使用函數語句 tf.transpose(x3, perm = [0, 2, 1]) 進行驗證,轉置結果與推演結果一致。也就是說,shape=(2, 2, 3) 的Tensor經過perm=[0, 2, 1]轉置後,變為shape=(2, 3, 2)的Tensor。

x3_ = tf.transpose(x3, perm = [0, 2, 1])
print(x3_) # 輸出 tf.Tensor([[[1 4] [2 5] [3 6]] [[7 10] [8 11] [9 12]]], shape=(2, 3, 2), dtype=int32)

這也是為什麼在TensorFlow2.0官網教程中,官方推薦在Tensor維度大於2時,使用perm參數進行轉置操作,會更方便的達到效果。當然前提是你要明確原Tensor shape及你想要的變形後的Tensor shape,根據後續需求確定參數perm的值

希望這篇文章對大家理解張量Tensor有幫助!畫圖排版不易,歡迎【在看】和【打賞】!

相關焦點

  • Tensorflow常用函數使用說明及實例簡記
    (4) tf.contrib.rnn.GRUCell再關注的是此函數的輸出output, state = tf.nn.dynamic,其中output是函數包含了每層的結果輸出,如果cell是單向的,則output只包含一個,output的維度是[batch_size, steps, Units],可以通過tf.transpose(output, [1, 0, 2]),得到
  • excel的轉置操作TRANSPOSE函數詳解
    TRANSPOSEhan's有的時候,我們需要將數據從列轉置到行,或將數據從行轉置到列。 可以通過複製、粘貼或者使用「轉置」選項來執行此操作。 但這樣做會創建重複的數據。如果不希望產生重複數據,可選擇鍵入公式,而不是用 TRANSPOSE 函數。 例如,在下圖中,公式 =TRANSPOSE(A1:B4) 會選取單元格 A1 到 B4,並將它們水平排列。
  • 基於TensorFlow的深度學習實戰
    我們不用關心這張圖具體代表什麼,但你需要知道,其中的橢圓和正方形代表節點,節點就是一些數學函數,你可以將節點分組形成各種數學計算,並得到輸出。箭頭代表流動到各個節點的數據。所以TensorFlow也被成為數據流庫。TensorFlow從入門到應用安裝TensorFlow一般來講,使用Python工作時最好用virtualenv虛擬環境。
  • TensorFlow 的簡單例子 | Linux 中國
    比如:◈ 機器學習技術。你往其中輸入一組數據樣本用以訓練,接著給出另一組數據樣本基於訓練的數據而預測結果。這就是人工智慧了!◈ 支持 GPU 。你可以使用 GPU(圖像處理單元)替代 CPU 以更快的運算。TensorFlow 有兩個版本: CPU 版本和 GPU 版本。開始寫例子前,需要了解一些基本知識。什麼是張量?
  • 開源 | TensorFlow官方工具TF-Coder,自動生成代碼
    與上一個問題不同,這裡不存在可執行該計算的 TensorFlow 函數。在文檔中搜索「max」,你可能找到 tf.reduce_max、tf.argmax 和 tf.maximum,但也不清楚到底該用哪一個?
  • tensorflow的數據輸入
    比較惱火的是第二種方法,直接從文件中讀取數據(其實第一種也可以我們自己從文件中讀出來之後使用feed_dict傳進去,但方法二tf提供很完善的一套類和函數形成一個類似pipeline一樣的讀取線):1.使用tf.train.string_input_producer函數把我們需要的全部文件打包為一個tf內部的queue類型,之後tf開文件就從這個queue中取目錄了,要注意一點的是這個函數的
  • TensorFlow基本概念整理
    the logarithmtf.maximumreturns the maximumtf.minimumreturns the minimumtf.coscalculates the cosinetf.sincalculates the sine④張量其它操作:OperationDescriptiontf.shapeTo find a shape of a tensortf.sizeTo
  • TensorFlow 2.0 常用模塊6:tf.TensorArray
    我們知道在入門一項新的技術時有許多挑戰與困難需要克服。如果您有關於 TensorFlow 的相關問題,可在本文後留言,我們的工程師和 GDE 將挑選其中具有代表性的問題在下一期進行回答~在上一篇文章《TensorFlow 2.0 常用模塊5:@tf.function》中,我們對於部分具有代表性的問題回答如下:Q1.
  • TensorFlow 2.0 常用模塊5:@tf.function
    警告並不是任何函數都可以被 @tf.function 修飾!@tf.function 使用靜態編譯將函數內的代碼轉換成計算圖,因此對函數內可使用的語句有一定限制(僅支持 Python 語言的一個子集),且需要函數內的操作本身能夠被構建為計算圖。
  • 手寫GRU-[TensorFlow]
    import tensorflow as tfimport configimport numpy as npclass GRU_Cell(object): def __init__(self,incoming,reverse=False): """        :param incoming
  • Excel中行列轉置的5種方法,你會幾種?
    文 |  雷哥  編輯 |  小西瓜今天雷哥跟大家分享5種行列轉置的方法。
  • TensorFlow layers模塊用法
    概覽layers 模塊的路徑寫法為 tf.layers,這個模塊定義在 tensorflow/python/layers/layers.py,其官方文檔地址為:https://www.tensorflow.org/api_docs/python/tf/layers,TensorFlow 版本為 1.5。這裡面提供了多個類和方法以供使用,下面我們分別予以介紹。
  • 這篇基於TensorFlow的實例教程為你解惑!(附開原始碼)
    =[1, 2, 2, 1], padding="SAME") + b         return conv實現卷積層的函數我們使用get_variable()而不是通常的Variable(),在tensorflow上創建一個變量,以便以後在不同的函數調用之間共享權重和偏差。
  • 教程 | 維度、廣播操作與可視化:如何高效使用TensorFlow
    下面就定義了這樣一個函數:def get_shape(tensor):  static_shape = tensor.get_shape().as_list()  dynamic_shape = tf.unstack(tf.shape(tensor))  dims = [s[1] if s[0] is None else s[0]          for s in zip
  • 端智能: Swift for TensorFlow, First Class Machine Learning in Swift
    ([[1,2,3], [4,5,6]])xt = tf.transpose(x)y = tf.matmul(x, xt)with tf.Session() as sess:    print sess.run(y)圖模式的一個重要特點就是:Lazy Evaluation。
  • [阿里DIN]從模型源碼梳理TensorFlow的形狀相關操作
    0x01 reduce_sum因為 reduce_sum 中有降維可能,所以在這裡一起講解1.1 reduce_sum函數reduce_sum() 用於計算張量tensor沿著某一維度的和,可以在求和後降維。
  • TensorFlow筆記:高級封裝—tf.Estimator
    tf.Estimator的特點是:既能在model_fn中靈活的搭建網絡結構,也不至於像原生tensorflow那樣複雜繁瑣。相比於原生tensorflow更便捷、相比與keras更靈活,屬於二者的中間態。實現一個tf.Estimator主要分三個部分:input_fn、model_fn、main三個函數。
  • Excel中輕鬆實現橫縱單元格內容轉置
    橫縱單元格的「乾坤大挪移」Excel中的橫縱列內容互換聽說過嗎?特別是每天都在製作表格的同學,通過excel自帶的轉置功能,可以快速實現表格的橫縱列內容互換。具體如何使用呢?接下來跟著小超老師一起來學習下。首先,選中你要進行轉置的數據,然後進行複製。
  • 機器學習|tf.nn整理(一)
    Linear Unit, ReLU線性整流函數,有很多相關的函數,但是常用的有兩個tf.nn.relu(tensor, name = None)tf.nn.relu6(tensor, name = None)其中relu是用來計算max(tensor, 0),而relu6時用來計算min(max(tensor, 0), 6)。