随笔 - 1013,  文章 - 5,  评论 - 493,  阅读 - 656万

简介

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()
复制代码
posted on   风生水起  阅读(498)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2012-06-14 数据挖掘笔记(一)
2012-06-14 数据挖掘笔记(二)
2012-06-14 名词解释CPC、CPM、CPA.......[来源于网络]
2012-06-14 Chrome 插件 PageSpeed Insights
< 2025年3月 >
23 24 25 26 27 28 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
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示