CoreML: невозможно выполнить матричное умножение

Я пытаюсь реализовать в своей сети операцию умножения матриц с помощью NetworkBuilder. Я хочу умножить два тензора размера (20x50) и (50x100), чтобы получить тензор размера (20x100).

Как я могу это сделать? Я пытался использовать add_batched_mat_mul, но получаю следующую ошибку на coremltools == 3.0b3 и coremltools == 3.0b4

Как я могу выполнить операцию matmul с указанными выше тензорными размерностями?

Ошибка coremltools == 3.0b3

RuntimeWarning: You will not be able to run predict() on this Core ML model. Underlying exception message was: Error compiling model: "Error reading protobuf spec. validator error: Unsupported layer type (CoreML.Specification.NeuralNetworkLayer) for layer 'matmul'.".
  RuntimeWarning)

Ошибка coremltools == 3.0b4

  File "test2.py", line 28, in <module>
    out = model.predict({"matrix_left": np.zeros((20, 50, 1))})
  File "python2.7/site-packages/coremltools/models/model.py", line 345, in predict
    raise Exception('Unable to load CoreML.framework. Cannot make predictions.')
Exception: Unable to load CoreML.framework. Cannot make predictions.
exception loading model proxy: dlopen(python2.7/site-packages/coremltools/libcoremlpython.so, 2): Symbol not found: _objc_opt_class
  Referenced from: python2.7/site-packages/coremltools/libcoremlpython.so (which was built for Mac OS X 10.15)
  Expected in: /usr/lib/libobjc.A.dylib
 in python2.7/site-packages/coremltools/libcoremlpython.so

Используемый скрипт:

import coremltools.models.datatypes as datatypes
from coremltools.models.neural_network import NeuralNetworkBuilder
from coremltools.models import MLModel

import numpy as np

model_input_features = [
    ("matrix_left", datatypes.Array(20, 50, 1)),
]
model_output_features = [
    ("y", datatypes.Array(20, 100, 1)),
]

builder = NeuralNetworkBuilder(input_features=model_input_features, output_features=model_output_features)

np.random.seed(42)

matrix_right = np.random.rand(50, 100, 1)
builder.add_load_constant(name="matrix_right", output_name="y",
                          constant_value=matrix_right, shape=(50, 100, 1))


builder.add_batched_mat_mul(name="matmul", input_names=["matrix_left", "matrix_right"],
                            output_name="y")

model = MLModel(builder.spec)
out = model.predict({"matrix_left": np.zeros((20, 50, 1))})
y = out["y"]
print(y)
print(y.shape)

Я также пробовал использовать точечный продукт с помощью add_elementwise, но получил следующую ошибку:

RuntimeWarning: You will not be able to run predict() on this Core ML model. 
Underlying exception message was: Error compiling model: "compiler error:  Dot product layer: 'matmul': 
height dimension of the input blob must be 1.".

Сценарий:

matrix_right = np.random.rand(50, 100, 1)
builder.add_load_constant(name="matrix_right", output_name="matrix_right", constant_value=matrix_right, shape=(50, 100, 1))
builder.add_elementwise("matmul", input_names=["matrix_left", "matrix_right"], output_name="y", mode="DOT")

person nimbudew    schedule 13.08.2019    source источник


Ответы (1)


Попробуй это:

builder.add_load_constant(name="matrix_right", output_name="matrix_right",
                      constant_value=matrix_right, shape=(50, 100, 1))

Обратите внимание, что имя вывода теперь "matrix_right" вместо "y".

Модель по-прежнему не работает с 3.0b3 или 3.0b4, но, по крайней мере, сейчас она действительна. :-)

person Matthijs Hollemans    schedule 13.08.2019
comment
Спасибо за исправление модели, но разве я не могу выполнить операцию matmul в CoreML? Почему это так сложно? - person nimbudew; 13.08.2019
comment
Я пробовал использовать точечный продукт с помощью eadd_elementwise, но он тоже ломается. - person nimbudew; 13.08.2019
comment
Это сложно, потому что это бета-версия. Лучше всего отправить отчет об ошибке в Apple или дождаться следующей бета-версии и надеяться, что она будет исправлена. Кроме того, вы пробовали это в Xcode? Тот факт, что он не работает с coremltools, обычно связан с тем, что он связан с другой версией, чем та, которую предоставляет ваш Xcode, но запуск модели из проекта macOS / iOS не должен иметь этой проблемы. - person Matthijs Hollemans; 13.08.2019