как преобразовать 3d массив, представляющий данные временных рядов для tensorflowlite…. примечание. модель работает на python и теперь переносится на swift

#ios #swift #time-series #lstm #tensorflow-lite

Вопрос:

Я создал модель в python tensorflow, а затем преобразовал модель в модель tensorflowlite. Я протестировал эту «облегченную» модель на python со следующим кодом, и она работает:

 for s in range(X_new.shape[0]):
    m=np.float32(X_new[s])
    input_data=m.reshape(1,140,6)
    interpreter.set_tensor(input_details[0]['index'], input_data)

    interpreter.invoke()
    tflite_results = interpreter.get_tensor(output_details[0]['index'])
 

Обратите внимание, что модель предназначена для временных рядов, а форма X_new-это (количество выборок, задержка, особенности). Я передаю его в обычную модель, и по какой-то причине мне пришлось индивидуально обрабатывать его по одной строке за раз (1,140,6) для lite….

Моя проблема в том, что сейчас я пытаюсь заставить модель работать на IOS (Swift). Мне пришлось создать 3-мерный массив данных в Swift

 [[[Float]]]
 

и сейчас я нахожусь на том этапе, когда пытаюсь создать тензор и вызвать его.

К сожалению, я не могу найти тот же API для Swift, поэтому, глядя на другой код RNN (пример Bert), я не могу найти тот же API для Swift. Я столкнулся с таким подходом

 let inputIdsData = Data(copyingBufferOf: features.inputIds)
let inputMaskData = Data(copyingBufferOf: features.inputMask)
let segmentIdsData = Data(copyingBufferOf: features.segmentIds)

// Assign input `Data` to the `interpreter`.
try interpreter.copy(inputIdsData, toInputAt: 0)
try interpreter.copy(inputMaskData, toInputAt: 1)
try interpreter.copy(segmentIdsData, toInputAt: 2)

// Run inference by invoking the `Interpreter`.
os_log("[BertQAHandler] Runing inference..")
try interpreter.invoke()
 

Предполагая, что это «правильный» подход (которым он может и не быть) Я пытаюсь понять, как получить интерпретатор строки
.скопируйте
для компиляции. Сначала ему нужен объект данных, и когда я пытаюсь создать объект данных из моего 3d-массива, он выдает ошибку
«Нет точных совпадений в вызове инициализатора». Я попытался выровнять 3d-объект с помощью .joined (), но затем ошибка стала

 "Initializer 'init(_:)' requires the types 'FlattenSequence<[[Float]]>.Element' (aka 'Float') and 'UInt8' be equivalent"
 

На данный момент я в растерянности. Я бы наивно предположил, что выравнивание не требовалось, так как мне не нужно было делать ничего особенного для python. Я подозреваю, что моя проблема в том, как создать тензор в swift (эквивалент того, что я смог сделать с set_tensor в python), но, похоже, не могу найти правильный способ создания объекта данных.

Есть какие-либо предложения по правильному подходу и примеры того, как вызвать модель tensorflow lite с 3-мерным набором данных?