我正在使用tensorflow 2.5.0。我取一个四维Tensor,并在lambda函数中执行argmax:
def activate_postprocess(tensor):
res = []
for i in range(k):
res.append(tf.argmax(tensor[i]))
return res
post_processe_layer = tf.keras.layers.Lambda(activate_postprocess)
post_processed_output = post_processed_layer(model.outputs)
然后,我将TFLITE_BUILTINS
和SELECT_TF_OPS
相加,进行转换:
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS,
tf.lite.OpsSet.SELECT_TF_OPS
]
tflite_model = converter.convert()
然后我在Android应用程序中运行,使用GPU代理
val options = Interpreter.Options()
val compatList = CompatibilityList()
val delegateOptions = compatList.bestOptionsForThisDevice
gpuDelegate = GpuDelegate(delegateOptions)
options.addDelegate(gpuDelegate)
运行模型后,我收到以下错误:
Failed for 'img.jpg' with error: Internal error: Failed to apply delegate: Following operations are not supported by GPU delegate:
ARG_MAX: Operation is not supported.
在创建解释器之前,我也尝试了options.setUseNNAPI(true)
,但它没有帮助。
我该怎么解决呢?
我看到这个:https://www.tensorflow.org/lite/guide/ops_custom
但我不明白如何注册运营商(https://www.tensorflow.org/lite/guide/ops_custom#create_and_register_the_operator)
有argmax的例子吗?
谢谢
2条答案
按热度按时间sd2nnvve1#
是的,我不记得我们的团队实现了
ARG_MAX
操作。我们拥有的最接近的操作可能是带索引的MAX_POOL
。着色器代码应该在存储库中。向委托添加自定义操作需要大量的管道。
GraphFloat32
中表示它,GraphFloat32
是GPU代理使用的内部数据结构。可能涉及到属性的定义。pkwftd7m2#
@yonatanbitton NNAPI支持ArgMax。但是,tf.argmax的默认输出数据类型为
int64
,NNAPI's argmax不支持此类型。如果int32
足以满足您的使用要求,请使用tf.argmax(tensor[i], output_type=tf.dtypes.int32)
。