对tensorflow lite模式中稀疏参数的理解

对tensorflow lite模式中稀疏参数的理解,tensorflow,flatbuffers,tensorflow-lite,Tensorflow,Flatbuffers,Tensorflow Lite,我试图用tensorflow lite模式理解稀疏张量,但这对我来说很难做到 幸运的是,这个模式中只有一个json示例(tensorflow/lite/testdata/sparse\u tensor.json) “稀疏性”:{ “遍历顺序”:[0,1,2,3], “块映射”:[0,1], “dim_元数据”:[ { “格式”:“密集”, “密度大小”:2 }, { “格式”:“稀疏”, “数组\段\类型”:“Uint8Vector”, “数组_段”:{“值”:[0,2,3]},

我试图用tensorflow lite模式理解稀疏张量,但这对我来说很难做到

幸运的是,这个模式中只有一个json示例(
tensorflow/lite/testdata/sparse\u tensor.json

“稀疏性”:{
“遍历顺序”:[0,1,2,3],
“块映射”:[0,1],
“dim_元数据”:[
{   
“格式”:“密集”,
“密度大小”:2
},  
{   
“格式”:“稀疏”,
“数组\段\类型”:“Uint8Vector”,
“数组_段”:{“值”:[0,2,3]},
“数组索引类型”:“Uint8Vector”,
“数组_索引”:{“值”:[0,1,1]}
},  
{   
“格式”:“密集”,
“密度大小”:2
},  
{   
“格式”:“密集”,
“密度大小”:2
}   
]   
}   
“缓冲区”:[
{   
},  
{
“数据”:[
1, 0, 0, 4,
2, 3, 0, 0,
5, 0, 0, 6
]
}
]
这就是我提到的模式(
tensorflow/lite/schema/schema.fbs

好了,如果我想生成上面这样的稀疏张量,我必须编写下面这样的代码

st1=tf.compat.v1.sparse.SparseTensor(
索引=[[0,0],[0,3],[1,0],[1,1],[2,0],[2,2]],值=缓冲区,密集形状=[4,4])
但是,上面的json示例与我的理解完全不符

  • 我认为
    array\u index
    应该是[0,3,0,1,0,3]而不是[0,1,1],而
    array\u segments
    应该是[0,2,2,4,4,6]而不是[0,2,3]
  • 此外,实际上,模式中的注释都不理解

  • 密集格式的元数据代表什么
  • {
    “格式”:“密集”,
    “密度大小”:2
    },
    
    正如shcema的评论所说,它是一个存储维度大小的字段

    但是,哪个维度的值为“2”?形状是[4,4]。我甚至不能推断数字2是从哪里来的

  • 什么是“积木”
  • 好的,block是一个包含非零值的框。但是,我认为上面的缓冲区中有很多块

    如果有这样的街区

    1 2 0
    3 4 0
    0 0 0
    
    我会说,它有一个2x2街区

    但上面的缓冲区中有六个1x1块

    那么,我怎样才能把这些东西做成块地图呢

    实际上,我也不知道遍历顺序,但是如果我知道上面的事情,我也会理解的


    请有人帮帮我。

    目前TFLite使用了与Tensorflow不同的稀疏张量表示。它使用的格式称为TACO。有关更多详细信息,请参阅本文:第3节

    由于tf.SparseTensor使用的是COO格式,因此它不适用于此


    块是需要存储在一起的张量的内部子单元。它可以包含0值元素。示例flatbuffer显示了一个具有2-D 2x2内部块的2-D 4x4张量。TFLite使用阻塞稀疏张量来利用NEON SIMD指令。

    谢谢您的回答。我已经理解了你上面提到的论文的模式和格式。有没有办法制作一个包含备用张量的tflite文件,除了手工?我发现了
    tensorflow/lite/tools/optimize/sparsity/format\u converter
    ,但它看起来像一个库,可以将密集转换为稀疏,或者将密集转换为稀疏,用于内部计算。
    1 2 0
    3 4 0
    0 0 0