深度转换张量分配失败

时间:2019-01-06 20:13:02

标签: android tensorflow conv-neural-network tensorflow-lite

系统信息

我是否编写了自定义代码(与使用TensorFlow中提供的股票示例脚本相对):是 操作系统平台和发行版(例如Linux Ubuntu 16.04):Mac OS Mojave 如果问题发生在行动装置上,则行动装置(例如iPhone 8,Pixel 2,三星Galaxy):不适用 从(源或二进制)安装的TensorFlow:二进制 TensorFlow版本(使用下面的命令):1.12 Python版本:3.6.4 Bazel版本(如果从源代码编译):N / A GCC /编译器版本(如果从源代码编译):N / A CUDA / cuDNN版本:N / A GPU型号和内存:N / A 描述当前行为

java.lang.IllegalStateException: Internal error: Unexpected failure when preparing tensor allocations: tensorflow/contrib/lite/kernels/depthwise_conv.cc:92 NumDimensions(input) != 4 (0 != 4)Node number 0 (DEPTHWISE_CONV_2D) failed to prepare.

我用以下方法构造模型:

interpreter = Interpreter(loadModelFile("model.tflite"), object: Interpreter.Options() { override fun setAllowFp16PrecisionForFp32(allow: Boolean): Interpreter.Options { return super.setAllowFp16PrecisionForFp32(true) } override fun setUseNNAPI(useNNAPI: Boolean): Interpreter.Options { return super.setUseNNAPI(true) } })

并使用以下命令调用它:

imgData = ByteBuffer.allocateDirect(4 * 100 * 100).apply { order(nativeOrder()) }.asFloatBuffer() labelProbArray = IntArray(1) interpreter.run(imgData, labelProbArray as Any)

描述预期的行为 预期的行为是,根据占位符op,字节缓冲区将在幕后转换为float32的张量。

1 个答案:

答案 0 :(得分:0)

您需要传递分配的ByteBuffer句柄,而不是返回的asFloatBuffer()句柄。该错误消息会引起误解,主要问题是API支持ByteBuffer类型,但尚不支持或不了解FloatBuffer类型。该错误消息将在下一个每晚构建中更清晰地显示(另请参见this fix),我们正在努力添加本机FloatBuffer支持。