Android Studio中TensorFlow Lite模型‘ByteBuffer与形状不匹配’错误求助
这个错误java.lang.IllegalArgumentException: The size of byte buffer and the shape do not match的核心原因是你创建的输入TensorBuffer数据类型,和从Bitmap转换来的TensorImage输出的ByteBuffer数据类型不匹配,导致字节数和模型期望的张量尺寸对不上。
直接修复代码的两种方案
方案1:让TensorBuffer和TensorImage数据类型保持一致
TensorImage.fromBitmap()默认生成的是UINT8类型的ByteBuffer,但你代码里创建的TensorBuffer是FLOAT32类型——前者每个像素通道占1字节,后者占4字节,这就导致buffer总大小差了4倍,自然不匹配。
修改创建TensorBuffer的代码,把数据类型改成UINT8:
// 修改前 // TensorBuffer inputFeature0 = TensorBuffer.createFixedSize(new int[]{1, 256, 256, 3}, DataType.FLOAT32); // 修改后 TensorBuffer inputFeature0 = TensorBuffer.createFixedSize(new int[]{1, 256, 256, 3}, DataType.UINT8);
方案2:将TensorImage转换为FLOAT32格式
如果你的模型确实要求输入是FLOAT32类型,那就需要把TensorImage的输出转换成对应格式后再加载:
bitmap = Bitmap.createScaledBitmap(bitmap, 256,256, true); // 先创建TensorImage并设置为FLOAT32类型 TensorImage tensorImage = new TensorImage(DataType.FLOAT32); tensorImage.load(bitmap); inputFeature0.loadBuffer(tensorImage.getBuffer());
额外需要检查的点
确认模型的实际输入参数
你的代码里假设模型输入是[1,256,256,3],但实际模型可能不是这个尺寸/类型。可以用Netron工具打开你的.tflite模型文件,查看输入张量的Shape和DataType,确保代码里的参数和模型完全一致。确保Bitmap是ARGB_8888格式
TensorImage.fromBitmap只支持ARGB_8888格式的Bitmap,否则可能导致通道数异常。加载或转换Bitmap时可以加个判断:if (bitmap.getConfig() != Bitmap.Config.ARGB_8888) { bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); }修复代码里的语法错误
你代码里的result.setText(labels[getMax(outputFeature0.getFloatArray())]+"";少了一个闭合括号,应该改成:result.setText(labels[getMax(outputFeature0.getFloatArray())] + "");
内容的提问来源于stack exchange,提问作者Suneththra Dharshani

