Невозможно выполнить преобразование между тензором TensorFlowLite типа FLOAT32 и объектом Java.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Невозможно выполнить преобразование между тензором TensorFlowLite типа FLOAT32 и объектом Java.

Сообщение Anonymous »

Я пытаюсь создать систему рекомендаций с помощью TFlite на Android. Я успешно создал модель, а также выполнил на ней вывод, который работает довольно хорошо. Но проблема заключается в попытке интегрировать приложение с моделью. Я пытаюсь интегрировать модель в официальное приложение, предоставленное командой tensorflow. Я выполнил все запрошенные ими шаги, но проблема, с которой я столкнулся, заключалась в вводе/выводе модели. Я столкнулся с ошибкой:

Невозможно преобразовать тензор 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»