Я могу создать модель, используя предварительно построенные высокоуровневые функции, такие как FullyConnected
. Например:
X = mx.sym.Variable('data')
P = mx.sym.FullyConnected(data = X, name = 'fc1', num_hidden = 2)
Таким образом, я получаю символическую переменную P
, которая зависит от символической переменной X
. Другими словами, у меня есть вычислительный граф, который можно использовать для определения модели и выполнения таких операций, как fit
и predict
.
Теперь я хотел бы выразить P
через X
по-другому. Более подробно, вместо использования высокоуровневой функциональности (например, FullyConnected
), я хотел бы явно указать отношения между P
и X
", используя низкоуровневые тензорные операции (например, матричное умножение) и символические переменные, представляющие параметры модели (матрица веса озера).
Например, чтобы достичь того же, что и выше, я попробовал followig:
W = mx.sym.Variable('W')
B = mx.sym.Variable('B')
P = mx.sym.broadcast_plus(mx.sym.dot(X, W), B)
Однако полученный таким образом P
не эквивалентен ранее полученному P
. Я не могу использовать его таким же образом. В частности, насколько я понимаю, MXNet жалуется, что W
и B
не имеют значений (что имеет смысл).
Я также попытался объявить W
и B
другим способом (чтобы они имели значения):
w = np.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
b = np.array([7.0, 8.0])
W = mx.nd.array(w)
B = mx.nd.array(b)
Это не работает. Я предполагаю, что MXNet жалуется, потому что он ожидает символическую переменную, но вместо этого получает nd-массивы.
Итак, мой вопрос заключается в том, как построить модель с использованием низкоуровневых тензорных операций (например, матричное умножение) и явных объектов, представляющих параметры модели (например, матричные весы).