Как превратить массив во входные данные модели?

Я преобразовал модель нейронной сети keras для предсказания последовательности в mlmodel с помощью coremltools в python.

Модель ожидает ввода типа [1, [2], [3], [ 4]] и дает результат [5]. На питоне я бы написал:

model.predict ([1, [2], [3], [4] ])

[5]

Когда я пытаюсь сделать то же самое быстро:

пусть модели = модель ()

var array: [[Int]] = [1, [2], [3 ], [4]]

печать (models.prediction (ввод: массив))

Это дает мне эту ошибку:

Невозможно преобразовать значение типа «[[Int]]» в ожидаемый тип аргумента «modelInput»

Я не смог найти ничего дома, чтобы отформатировать данные, подобные моим, чтобы они работали в core ml.

Если нужно, вот изображение архитектуры:

введите здесь описание изображения

Наконец, как мне отформатировать свои собственные данные, чтобы они работали с core ml


person kimo26    schedule 18.11.2019    source источник
comment
Я не уверен, была ли это опечатка, это должно быть [[1],[2],[3],[4]], а это [[Int]]. Думаю, вы пропустили дебют [[   -  person user1046037    schedule 18.11.2019
comment
@ user1046037 Да, это опечатка, извините, stackoverflow изменил его на это   -  person kimo26    schedule 19.11.2019


Ответы (2)


Вам нужно поместить ваши входные данные в 15 (!) Разных MLMultiArray объектов.

Первый MLMultiArray (с именем lists) - это один для вашей последовательности. Требуется только один элемент.

Остальные 14 входов - это ваши скрытые переменные состояния LSTM. Вам необходимо явно передать их.

Чтобы обработать последовательность чисел, вы должны запустить модель Core ML один раз для каждого элемента последовательности, каждый раз передавать текущее скрытое состояние и считывать новое скрытое состояние из выходных данных модели.

Работы намного больше, чем в Керасе. ;-)

person Matthijs Hollemans    schedule 18.11.2019
comment
Извините, но у меня есть пара вопросов. Зачем мне нужно 14 различных входных данных, если я обучил свой вход размером 4 (форма обучающего массива была (, 4,1))? Куда я мог бы обратиться, чтобы узнать больше? - person kimo26; 19.11.2019
comment
В Keras модули LSTM сами отслеживают свое внутреннее состояние. В Core ML их нет, и вам нужно управлять этим состоянием. Ваша модель имеет 7 единиц LSTM, и каждая единица принимает два вектора состояния, что составляет 7 x 2 = 14 векторов состояния. Вам необходимо предоставить их в качестве входных данных для модели, а также получить новое состояние из выходных данных модели. - person Matthijs Hollemans; 19.11.2019

Для массива с одинарной глубиной в Swift вам нужно настроить его следующим образом:

var array: [Int] = [1,2,3,4]

Я не думаю, что это так, но если бы вы пытались получить структуру данных, в которой у вас есть «массив массивов», где каждый из вложенных массивов является массивом с одним целым членом, то это будет примерно так:

var array: [[Int]] = [[1], [2], [3], [4]]
person flanker    schedule 18.11.2019