字节缓冲区的大小和形状不匹配(以前没有回答)
Posted
技术标签:
【中文标题】字节缓冲区的大小和形状不匹配(以前没有回答)【英文标题】:The size of byte buffer and the shape do not match (previously not answered) 【发布时间】:2021-08-15 15:13:01 【问题描述】:我正在尝试创建一个使用 tensorflow 模型的应用程序。当inputFeature0.loadBuffer(byteBuffer)
被执行时,我的应用程序崩溃了。 (通过评论了解)
var img=Bitmap.createScaledBitmap(bmp,229,229,true)
val model = SkinDiseasesDetectionFitSizeFinal24120210504.newInstance(this)
val inputFeature0 = TensorBuffer.createFixedSize(intArrayOf(1, 229, 229, 3), DataType.FLOAT32)
var tensorimage=TensorImage.fromBitmap(img)
var byteBuffer=tensorimage.buffer
inputFeature0.loadBuffer(byteBuffer)
这是错误
FATAL EXCEPTION: main
Process: com.azsky.skincancerdetection, PID: 31954
java.lang.IllegalArgumentException: The size of byte buffer and the shape do not match.
有人可以帮我解决这个问题吗?
【问题讨论】:
【参考方案1】:我有同样的问题。我不知道为什么会发生这种情况,但可能是因为DataType.FLOAT32
。我打印了两个缓冲区,发现总大小不同。
Log.d("shape", byteBuffer.toString())
Log.d("shape", inputFeature0.buffer.toString())
我的inputFeature0.buffer
比4-times
大byteBuffer
。通过划分两个缓冲区找到它。我从某个地方得到的解决方案是
您应该将缓冲区乘以 4。
根据他们的解释,我的缓冲区应该是这样的
buffer = image.width x image.height x colorChanels x 4
但我不知道如何更改总缓冲区,而是将 width
和 height
加倍以产生相同的效果。
尝试使用458
x 458
图像大小。
【讨论】:
【参考方案2】:在将 tensorflow 转换为 TfLite 的过程中,如果您使用优化,那么您应该先从这里阅读 https://www.tensorflow.org/lite/performance/post_training_quantization。据说优化版本要小 4 倍,因此您需要创建字节缓冲区以 [4 * 229 * 229 * 3] 所以它可以与 inputfeature0 匹配
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 请将其表述为一个解释性的有条件的答案,以避免给人一种提出澄清问题而不是回答的印象(应该使用评论而不是答案,比较meta.stackexchange.com/questions/214173/…)。例如像“如果你的问题是......那么解决方案是......因为......。”以上是关于字节缓冲区的大小和形状不匹配(以前没有回答)的主要内容,如果未能解决你的问题,请参考以下文章
字节缓冲区的大小和形状不匹配。我在将我的 Ml 模型集成到 android 应用程序时遇到了这个错误
非阻塞方式socket send()返回大小和实际发送大小不一致
在C和/或C ++中创建和管理内存中的字节缓冲区,可以根据需要自动调整大小
VS警告:C6386 写入到“xxx”时缓冲区溢出: 可写大小为“xxx”个字节,但可能写入了“4294967295”个字节