You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中TensorFlow Lite模型‘ByteBuffer与形状不匹配’错误求助

解决TensorFlow Lite模型输入尺寸不匹配的错误

这个错误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. 确认模型的实际输入参数
    你的代码里假设模型输入是[1,256,256,3],但实际模型可能不是这个尺寸/类型。可以用Netron工具打开你的.tflite模型文件,查看输入张量的Shape和DataType,确保代码里的参数和模型完全一致。

  2. 确保Bitmap是ARGB_8888格式
    TensorImage.fromBitmap只支持ARGB_8888格式的Bitmap,否则可能导致通道数异常。加载或转换Bitmap时可以加个判断:

    if (bitmap.getConfig() != Bitmap.Config.ARGB_8888) {
        bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
    }
    
  3. 修复代码里的语法错误
    你代码里的result.setText(labels[getMax(outputFeature0.getFloatArray())]+"";少了一个闭合括号,应该改成:

    result.setText(labels[getMax(outputFeature0.getFloatArray())] + "");
    

内容的提问来源于stack exchange,提问作者Suneththra Dharshani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:06:20