【问题标题】:is there a way to transpose a tensor without using the transpose function in tensorflow?有没有办法在不使用张量流中的转置函数的情况下转置张量?
【发布时间】:2021-07-08 03:55:10
【问题描述】:

我有一个模型,我想移植到 tflite micro。但是,当我运行代码时,它给了我以下错误:

没有找到内置操作码“TRANSPOSE”版本“2”的操作
操作码d注册失败

我假设 tflite micro 不支持转置功能。我也尝试用 PERMUTE 层替换它,但它似乎在引擎盖下使用 tf.transpose。这是我尝试转换的模型的一部分:

output = tf.reshape(output, (img_width // B, B, img_height // B, B), name="reshape_in")
output = Permute((2, 1, 3), name="transpose_in")(output)

有没有其他方法可以在不调用 tf.transpose 的情况下执行此转置?也许使用重塑?

【问题讨论】:

  • 如果我可能会问,为什么你不想使用 tf.transpose?
  • 您使用哪个 TensorFlow 版本将模型转换为 TFLite?

标签: tensorflow keras deep-learning tensor tensorflow-lite


【解决方案1】:

我在尝试使用不支持转置操作的 TFLite 的 GPU 委托运行模型时遇到了类似的问题。

一种可能性是使用跨步切片、tf.reshapeconcat 操作的组合:

shape = (3,4,5)
a = tf.random.uniform(shape)
a_t = tf.transpose(a,(1,0,2)) # permuting first and second axis
a_concat = tf.concat([tf.reshape(a[i:i+1,:,:],(shape[1],1,shape[2])) for i in range(shape[0])],axis=1)
tf.debugging.assert_equal(a_t,a_concat)

注意事项:

  • 需要提前知道张量的形状。
  • 它使用tf.concat,因为PACK/tf.stack 在 GPU 委托上不可用
  • 它使用 a[i:i+1,:] 而不是 a[i],因为 GPU 委托不支持删除轴的跨步切片
  • 性能可能很差,尤其是在循环通过的维度很大的情况下:此技巧的作用本质上是在一个维度上展开操作,在图中创建与维度大小一样多的重塑节点。

【讨论】:

    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2021-03-13
    • 2021-04-28
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多