Невозможно преобразовать тензор TensorFlowLite типа FLOAT32 и
объект Java типа [I (который совместим с типом TensorFlowLite
INT32).
Я не могу понять, что означает эта ошибка, и нет никакой документации по этому поводу.
Код Для целей ввода и вывода в официальном коде присутствуют следующие:
Это основной код, в котором определяются ввод и вывод:
Код: Выделить всё
/** Given a list of selected items, and returns the recommendation results. */
@WorkerThread
public synchronized List recommend(List selectedMovies) {
Object[] inputs = preprocess(selectedMovies);
// Run inference.
float[] outputIds = new float[config.outputLength];
float[] confidences = new float[config.outputLength];
Map outputs = new HashMap();
outputs.put(config.outputIdsIndex, outputIds);
outputs.put(config.outputScoresIndex, confidences);
tflite.runForMultipleInputsOutputs(inputs, outputs);
return postprocess(outputIds, confidences, selectedMovies);
}
Код: Выделить всё
int[] preprocessIds(List selectedMovies, int length) {
int[] inputIds = new int[length];
Arrays.fill(inputIds, config.pad); // Fill inputIds with the default.
int i = 0;
for (MovieItem item : selectedMovies) {
if (i >= inputIds.length) {
break;
}
inputIds[i] = item.id;
++i;
}
return inputIds;
}
int[] preprocessGenres(List selectedMovies, int length) {
// Fill inputGenres.
int[] inputGenres = new int[length];
Arrays.fill(inputGenres, config.unknownGenre); // Fill inputGenres with the default.
int i = 0;
for (MovieItem item : selectedMovies) {
if (i >= inputGenres.length) {
break;
}
for (String genre : item.genres) {
if (i >= inputGenres.length) {
break;
}
inputGenres[i] = genres.containsKey(genre) ? genres.get(genre) : config.unknownGenre;
++i;
}
}
return inputGenres;
}
/** Given a list of selected items, preprocess to get tflite input. */
@WorkerThread
synchronized Object[] preprocess(List selectedMovies) {
List inputs = new ArrayList();
// Sort features.
List sortedFeatures = new ArrayList(config.inputs);
Collections.sort(sortedFeatures, (Feature a, Feature b) -> Integer.compare(a.index, b.index));
for (Feature feature : sortedFeatures) {
if (Config.FEATURE_MOVIE.equals(feature.name)) {
inputs.add(preprocessIds(selectedMovies, feature.inputLength));
} else if (Config.FEATURE_GENRE.equals(feature.name)) {
inputs.add(preprocessGenres(selectedMovies, feature.inputLength));
} else {
Log.e(TAG, String.format("Invalid feature: %s", feature.name));
}
}
return inputs.toArray();
}
Изменить:
Мне удалось решить вышеуказанную проблему. Я обнаружил, что входные данные, необходимые для жанров, имели тип float , поэтому в качестве входных данных был передан массив жанров с плавающей запятой, и проблема была решена.
Однако возникла новая ошибка:
java.lang.IllegalStateException: Внутренняя ошибка: неожиданный сбой
при подготовке тензорных распределений:
tensorflow/lite/kernels/reshape.cc:66 num_input_elements !=
num_output_elements (10 != 32)
Не удалось подготовить узел номер 0 (RESHAPE).
Проблема связана с несовпадением входных и выходных элементов. Я не могу найти решение для той же проблемы.
Ссылку на model.tflite можно найти здесь:
https://drive.google.com/file/d/1CZxlJR ... sp=sharing
Подробнее здесь: https://stackoverflow.com/questions/700 ... -java-obje
Мобильная версия