TensorFlow重训练模型在Android设备上表现异常的技术咨询
解决TensorFlow重训练模型在Android端运行异常的问题
我之前也碰到过一模一样的情况——电脑上测试模型分类准得一批,放到Android里就各种出问题。结合TensorFlow for Poets的教程逻辑,给你梳理几个最可能的排查方向:
1. 别直接用.pb文件!先转成TensorFlow Lite格式
电脑端的retrained_graph.pb是标准TensorFlow GraphDef模型,Android端更适配**TensorFlow Lite(.tflite)**格式,直接丢.pb文件进去大概率会加载失败或者输出乱码。
赶紧转个格式试试,执行这条命令:
tflite_convert --output_file=tf_files/retrained_graph.tflite --graph_def_file=tf_files/retrained_graph.pb --input_arrays=Placeholder --output_arrays=final_result
把生成的retrained_graph.tflite和标签文件(retrained_labels.txt)一起放到assets文件夹里,替换原来的.pb文件。
2. 核对Android代码的输入输出配置
模型的输入输出节点、尺寸必须和训练/转换时完全匹配:
- 输入尺寸:教程默认是224x224像素,代码里预处理图片时必须缩放到这个尺寸,不能随便改
- 节点名称:转换模型时指定的
input_arrays是Placeholder,output_arrays是final_result,Android代码里调用模型时要对应上 - 标签顺序:
retrained_labels.txt里的类别顺序必须和训练时的类别顺序完全一致,多一个空格、换行都可能导致分类错位
3. 确认assets文件被正确打包
有时候Android Studio会抽风,没把assets里的文件打包进去,检查下build.gradle的配置:
android { sourceSets { main { assets.srcDirs = ['src/main/assets'] } } }
然后执行Build > Clean Project再Rebuild Project,清掉缓存重新编译。
4. 对齐图片预处理逻辑
电脑端的label_image.py有一套固定的预处理流程,Android端必须1:1复刻,差一点都不行:
- 颜色通道:要转成RGB(别用Android默认的BGR)
- 归一化:把像素值除以255.0转成0-1之间的float值
- 尺寸:严格缩放到224x224,不能拉伸变形
给你贴个Java版的预处理示例,你对照着改:
// 缩放图片到模型要求的224x224 Bitmap resizedBitmap = Bitmap.createScaledBitmap(originalBitmap, 224, 224, true); float[] inputArray = new float[224 * 224 * 3]; int idx = 0; for (int y = 0; y < 224; y++) { for (int x = 0; x < 224; x++) { int pixel = resizedBitmap.getPixel(x, y); // 按RGB顺序归一化 inputArray[idx++] = Color.red(pixel) / 255.0f; inputArray[idx++] = Color.green(pixel) / 255.0f; inputArray[idx++] = Color.blue(pixel) / 255.0f; } }
5. 打印输出调试
如果还是不行,就在Android代码里把模型输出的所有类别概率都打印出来,和电脑端的结果对比:
- 如果输出概率完全乱序,说明标签文件读错了
- 如果概率值都接近0或者1,说明预处理有问题
- 如果模型直接加载失败,检查.tflite文件是否损坏
内容的提问来源于stack exchange,提问作者tetedp
相关产品推荐
相关产品推荐

