Как решить CoreML - Ошибка проверки входных данных - Shape не был в перечисленном наборе разрешенной формы
Попытка интегрировать машинное обучение в приложение голосового чата. На данный момент пользователь может сказать, сделать две вещи - Принять или Отклонить на основе голосового ввода (преобразованный в текст с помощью API Apple Speech to Text). Чтобы принять, ввод может быть Принять, Ладно, Подтвердить и т.д. и отклонить, ввод может быть Отклонить, Нет, Нет, я не согласен и т. Д.
У меня есть модель, которая была построена с помощью Keras и преобразована в mlmodel из формата модели Tensorflow, который я интегрировал в свое приложение.
Модель принимает вход MultiArray и обеспечивает вывод Array.
Файл JSON используется для обучения, в котором есть параметры для намерения (например, у намерения "Принять" будет "принять", "все в порядке", "подтвердить" в качестве параметров). Мешок слов создается с учетом уникальных слов в нижнем регистре по всем параметрам, и этот размер используется для создания MLMultiArray из входной строки, которая передается в метод предиката, как
пусть прогноз = попробуй! model.prediction(input1: mlMultiArray)
Это дает выходные данные [(от нуля до одного), (от нуля до одного)], где элемент с индексом 0 обозначает намерение Accept, а элемент с индексом 1 обозначает возможность отклонения намерения.
Это прекрасно работает, если файл json имеет меньшее количество параметров. Например, когда пакет слов (нет уникальных слов по всем параметрам) имел 17 элементов, программа работала нормально. Однако, когда я добавил больше параметров, а пакет слов теперь содержал 36 элементов, я получаю ошибку Неустранимая ошибка: 'попробуй!' В выражении неожиданно возникла ошибка: Ошибка Domain=com.apple.CoreML Code=0 "Shape (36) не был в перечисленном наборе разрешенных фигур" UserInfo={NSLocalizedDescription=Shape (36) не был в перечисленном наборе разрешенных фигур}:
Используя https://developer.apple.com/documentation/coreml/mlmultiarray/2879232-init этот метод для инициализации ML MultiArray
1 ответ
Модели Core ML предполагают, что входные данные всегда будут иметь фиксированный размер, скажем, вектор длины 17.
Вы также можете использовать "гибкость размера", которая говорит модели, что она должна ожидать входные данные в определенном диапазоне, например векторы между длинами от 10 до 40 элементов.
Похоже, вам нужно настроить модель, чтобы обеспечить гибкость размеров. Вы можете использовать flexible_shape_utils
из coremltools
за это.