Android端集成TFLite推荐模型遇类型转换及Reshape报错如何解决?
类型不匹配报错解决方案
你遇到的Cannot convert between a TensorFlowLite tensor with type FLOAT32 and a Java object of type [I报错,本质是TFLite模型期望输入为FLOAT32类型,但你传入了Java的int32数组([I为Java int数组的类型标识)。你排查到的流派特征需要传入float数组的结论正确,对应代码修改如下:
// 修改preprocessGenres方法的返回类型和内部逻辑,输出float数组 float[] preprocessGenres(List<MovieItem> selectedMovies, int length) { float[] inputGenres = new float[length]; Arrays.fill(inputGenres, (float) config.unknownGenre); int i = 0; for (MovieItem item : selectedMovies) { if (i >= inputGenres.length) break; for (String genre : item.genres) { if (i >= inputGenres.length) break; inputGenres[i] = (float) (genres.containsKey(genre) ? genres.get(genre) : config.unknownGenre); i++; } } return inputGenres; }
如果模型要求电影ID特征也为float类型,按照相同逻辑修改preprocessIds方法即可。
Reshape层元素数不匹配报错解决方案
你遇到的num_input_elements != num_output_elements (10 != 32)报错,是模型首个RESHAPE节点要求输入总元素数为32,但实际传入的输入总元素只有10导致的,按以下步骤修改即可解决:
- 确认模型输入规格:使用TFLite模型分析工具查看你训练好的模型两个输入(电影ID、流派)的要求长度,两者相加总长度需要等于32
- 同步App配置:检查App侧
config.inputs中两个Feature的inputLength参数,确保和模型要求的输入长度完全一致,你当前的配置总和只有10,需要调整到和模型要求匹配 - 对齐预处理逻辑:确保App侧对选中电影的截断、padding规则和模型训练时的规则完全一致,比如训练时要求输入最近10部电影+每部对应2个流派共32个元素,App侧也要按照相同规则处理输入
内容的提问来源于stack exchange,提问作者Karunesh Palekar
相关产品推荐
相关产品推荐

