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

2021-01-14 策撲智能

大家上午好!

今天向各位分享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初級必學算子
    在之前的文章中介紹過,tensorflow框架的核心是將各式各樣的神經網絡抽象為一個有向無環圖,圖是由tensor以及tensor變換構成;雖然現在有很多高階API可以讓開發者忽略這層抽象,但對於靈活度要求比較高的算法仍然需要開發者自定義網絡圖,所以建議開發者儘量先學習tf1.x
  • 輸入示例,自動生成代碼:TensorFlow官方工具TF-Coder已開源
    使用 TF-Coder,你只需提供一個輸入 - 輸出示例(M=3,N=4)即可完成該操作,無需逐行進行編程。與上一個問題不同,這裡不存在可執行該計算的 TensorFlow 函數。在文檔中搜索「max」,你可能找到 tf.reduce_max、tf.argmax 和 tf.maximum,但也不清楚到底該用哪一個?
  • NLP實戰篇之tf2中tensor、variable、gradient、ops
    本文是基於tensorflow2.2.0版本,介紹了tf中變量、張量的概念,tf中梯度的計算方式和tensor相關的操作。實戰系列篇章中主要會分享,解決實際問題時的過程、遇到的問題或者使用的工具等等。如問題分解、bug排查、模型部署等等。
  • 手寫GRU-[TensorFlow]
    import tensorflow as tfimport configimport numpy as npclass GRU_Cell(object): def __init__(self,incoming,reverse=False): """        :param incoming
  • 5個簡單的步驟掌握Tensorflow的Tensor
    第二步:創建張量→創建張量對象的函數第三步:張量對象的特徵第四步:張量操作→索引、基本張量操作、形狀操作、廣播第五步:特殊張量張量的定義:什麼是張量張量是TensorFlow的均勻型多維數組。它們非常類似於NumPy數組,並且它們是不可變的,這意味著一旦創建它們就不能被更改。只能使用編輯創建新副本。讓我們看看張量如何與代碼示例一起工作。
  • EXCEL轉置你是用公式還是選擇性粘貼?
    但選擇性粘貼轉置也有一個好處那就是快,CTRL+C需要粘貼的區域,在新區域的一個按下CTRL+ALT+V,選擇轉置就可以了。  後來學巧了,咱可以百度啊,果然Excel上有個非常簡單就能做到的函數,這個函數就是transpose,後來就一發不可收拾,只要是需要長期進行轉置的地方就用這個函數。  這個函數有個要注意的地方就是它是個數組函數,還有一個就是要求數組函數的區域要和被轉置的區域大小有要求。
  • Tensorflow 2.0的這些新設計,你適應好了嗎?
    但是,如果你和我們一樣是從0.x版本用起的,那麼你就可能得重寫所有代碼庫——雖然官方說會發布轉換工具方便老用戶,但這種工具肯定有很多bug,需要一定的手動幹預。而且,你也必須開始轉變思維模式。這做起來不容易,但真的猛士不就應該喜歡挑戰嗎?
  • Tensorflow基礎教程15天之創建Tensor
    如何操作我們將在這裡介紹創建Tensor的主要方法。通過類似於range()或者np.linespace的操作,來定義Tensor,例如:linear_tsr = tf.linspace(start=0, stop=1, start=3)輸出是:數組 [0.0, 0.5, 1.0].這個函數的輸出是包含兩頭的定義值得與之相區別的是:nteger_seq_tsr = tf.range(start=6, limit=15, delta=3)輸出是:數組[
  • 【乾貨】TensorFlow 2.0官方風格與設計模式指南(附示例代碼)
    如果你丟失了對某個變量的跟蹤,它會被垃圾回收機制回收。這樣的機制給用戶增加了額外的工作,但使用Keras對象會減輕用戶的負擔。函數,不是會話調用session.run()幾乎像是一個函數調用:你指定輸入和需要調用的函數,然後你得到輸出集合。
  • TensorFlow 2.1指南:keras模式、渴望模式和圖形模式(附代碼)
    如你所知,在Tensorflow中,存在這樣的範例:首先定義計算圖,然後進行編譯(或將其移至GPU),然後運行它。這種範例非常好,從技術上來講很有意義,但是,一旦在GPU中擁有了模型,幾乎就不可能對其進行調試。這就是為什麼,自從TensorFlow 2.0以其Alpha版本發布以來已經過去了大約一年,我決定在TensorFlow 2.1與大家分享使用的體驗。
  • TensorFlow極速入門
    熱衷於深度學習技術的探索,對新事物有著強烈的好奇心。tf.zeros是生成一個全零的tensor。之後將這個tensor的值賦值給Variable。(2)初始化實際在其初始化過程中做了很多的操作,比如初始化空間,賦初值(等價於tf.assign),並把Variable添加到graph中等操作。注意在計算前需要初始化所有的Variable。
  • 用TensorFlow 讓你的機器人唱首原創給你聽
    本文會用 TensorFlow 來寫一個音樂生成器。當你對一個機器人說:我想要一種能夠表達出希望和奇蹟的歌曲時,發生了什麼呢?計算機會首先把你的語音轉化成文字,並且提取出關鍵字,轉化成詞向量。然後會用一些打過標籤的音樂的數據,這些標籤就是人類的各種情感。接著通過在這些數據上面訓練一個模型,模型訓練好後就可以生成符合要求關鍵詞的音樂。
  • 深度學習的敲門磚:手把手教你TensorFlow初級入門
    objects out of the different typest1 = tf.convert_to_tensor(m1, dtype=tf.float32)t2 = tf.convert_to_tensor(m2, dtype=tf.float32)t3 = tf.convert_to_tensor(m3, dtype=tf.float32)# Notice that the types will
  • TensorFlow極簡教程:創建、保存和恢復機器學習模型
    構造函數(constructor)允許你控制以下 3 個事物:目標(target):在分布式架構的情況下用於處理計算。可以指定要計算的 TF 伺服器或「目標」。圖(graph):你希望會話處理的圖。對於初學者來說,棘手的事情是:TF 中總存在一個默認的圖,其中所有操作的設置都是默認的,所以你的操作範圍總在一個「默認的圖」中。
  • 深度學習筆記8:利用Tensorflow搭建神經網絡
    :    """    Implements the forward propagation for the model: LINEAR -> RELU -> LINEAR -> RELU -> LINEAR -> SOFTMAX    """    W1 = parameters['W1']    b1 = parameters['b1']    W2 = parameters
  • Keras和TensorFlow究竟哪個會更好?
    (conv2D),ReLU 激活函數和批規範化層 (batch normalization),以降低卷積操作後的空間維度。此外,我們還使用 Dropout 技術來防止模型的過擬合現象。 相反,更需要我們注意的是,如何在 Keras 模型內部,用 TensorFlow 的激活函數替換標準 Keras 激活函數! 此外,你也可以使用自定義的激活函數、損失/成本函數或圖層來執行以上相同的操作。
  • Tensorflow 2.0 即將入場
    tf.contrib退出歷史舞臺。其中有維護價值的模塊會被移動到別的地方,剩餘的都將被刪除。換言之,如果你在這之前從沒接觸過Tensorflow,你是幸運的。但是,如果你和我們一樣是從0.x版本用起的,那麼你就可能得重寫所有代碼庫——雖然官方說會發布轉換工具方便老用戶,但這種工具肯定有很多bug,需要一定的手動幹預。而且,你也必須開始轉變思維模式。
  • TensorFlow2.0(8):誤差計算——損失函數總結
    import tensorflow as tfy = tf.random.uniform((5,),maxval=5,dtype=tf.int32) # 假設這是真實值print(y)y = tf.one_hot(y,depth=5) # 轉為熱獨編碼print(y)tf.Tensor([2 4 4 0 2],
  • 步履不停:TensorFlow 2.4新功能一覽!
    變量的讀取和更新會在各工作節點上獨立進行,同時無需採取任何同步操作。由於工作節點互不依賴,因此該策略具有工作器容錯的優勢,並會在使用搶佔式伺服器時有所助益。如要開始使用此策略,請查閱參數伺服器訓練教程。此教程介紹了如何設置 ParameterServerStrategy,並說明了如何使用 ClusterCoordinator 類來創建資源、調度函數和處理任務失敗。