paddle中的LoDTensor


簡介

LoDTensor是一個具有LoD(Level of Details)信息的張量(Tensor),可用於表示變長序列。

LoDTensor可以通過 np.array(lod_tensor) 方法轉換為numpy.ndarray。

下面以兩個例子說明如何用LoDTensor表示變長序列。

示例

示例1:

假設x為一個表示變長序列的LoDTensor,它包含2個邏輯子序列,第一個序列長度是2(樣本數量為2),第二個序列長度是3,總序列長度為5。 第一個序列的數據為[1, 2], [3, 4],第二個序列的數據為[5, 6], [7, 8], [9, 10],每個樣本數據的維度均是2,該LoDTensor最終的shape為[5, 2],其中5為總序列長度,2為每個樣本數據的維度。

在邏輯上,我們可以用兩種方式表示該變長序列,一種是遞歸序列長度的形式,即x.recursive_sequence_length = [[2, 3]];另一種是偏移量的形式,即x.lod = [[0, 2, 2+3]]。 這兩種表示方式是等價的,您可以通過LoDTensor的相應接口來設置和獲取recursive_sequence_length或LoD。

在實現上,為了獲得更快的序列訪問速度,Paddle采用了偏移量的形式來存儲不同的序列長度。因此,對recursive_sequence_length的操作最終將轉換為對LoD的操作。

x.data = [[1, 2], [3, 4],
          [5, 6], [7, 8], [9, 10]]

x.shape = [5, 2]

x.recursive_sequence_length = [[2, 3]]

x.lod  =  [[0, 2, 5]]

 

 

示例2:

LoD可以有多個level(例如,一個段落可以有多個句子,一個句子可以有多個單詞)。假設y為LoDTensor ,lod_level為2。從level=0來看有2個邏輯序列,序列長度分別為2和1,表示第一個邏輯序列包含2個子序列,第二個邏輯序列包含1個子序列。從level=1來看,第一個邏輯序列包含的2個子序列長度分別為2和2,第二個邏輯序列包含的1個子序列長度為3。

因此,該LoDTensor以遞歸序列長度形式表示為 y.recursive_sequence_length = [[2, 1], [2, 2, 3]];相應地,以偏移量形式表示為 y.lod = [[0, 2, 3], [0, 2, 4, 7]]。

y.data = [[1, 2], [3, 4],
          [5, 6], [7, 8],
          [9, 10], [11, 12], [13, 14]]

y.shape = [2+2+3, 2]

y.recursive_sequence_length = [[2, 1], [2, 2, 3]]

y.lod = [[0, 2, 3], [0, 2, 4, 7]]

 

示例代碼

具體解釋看注釋

import paddle.fluid as fluid
def loDTensor_test():

    a = fluid.create_lod_tensor(np.array([[1],[1],[1],
                                  [1],[1],
                                  [1],[1],[1],[1],
                                  [1],
                                  [1],[1],
                                  [1],[1],[1]]).astype('int64') ,
                          [[3,2,4,1,2,3]],
                          fluid.CPUPlace())
    # 2-level,第一個level指代一篇文章有多少個句子,第二個level表示一個句子有多少個單詞
    b=fluid.create_lod_tensor(np.array([[1.], [3.], [2.], [4.], [6.], [5.], [1.]]).astype('float64') ,
                          [[2, 0, 3], [1, 2, 1, 0, 3]],
                          fluid.CPUPlace())
    c = fluid.create_lod_tensor(np.array([[1.], [3.], [2.], [4.], [6.], [5.], [1.]]).astype('float32'),
                                [[2, 3, 2]],
                                fluid.CPUPlace())
    # 查看lod-tensor嵌套層數
    print(len(b.recursive_sequence_lengths()))# 2
    print(b.lod())# [[0, 2, 2, 5], [0, 1, 3, 4, 4, 7]]

    # 查看lod-tensor嵌套層數
    print(len(c.recursive_sequence_lengths()))
    print(c.lod())#[[0, 2, 5, 7]]
loDTensor_test()

 


免責聲明!

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



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