Как умножить каждый столбец матрицы на вектор по элементам?

У меня есть Теано dvectorсо 100 элементами. У меня также есть матрица с 5 столбцами и 100 строками (другими словами, каждый столбец содержит 100 элементов).

Теперь мне нужно применить элементарное умножение каждого столбца на вектор. Как правильно это сделать в Теано?

Должен ли я создать новую матрицу, повторив свой вектор 5 раз и транспонировав его, а затем умножить две матрицы одной и той же формы по элементам?

ДОБАВЛЕН

Я узнал, что в numpy для достижения желаемого поведения мне просто нужно объявить мой вектор как 2D массив с одним столбцом. Другими словами, Мне нужно заменить»строку» -вектор на»столбец» -векторы (или мне нужно записать значения по вертикали, а не по горизонтали). В этом случае numpy будет транслировать вектор (столбец) по желанию (каждый столбец моей матрицы будет умножен на мой векторный элемент мудро). Однако, похоже, Theo не наследует это поведение numpy:

X = T.dmatrix('X')

w = np.array([
    [10.0, 0.0, 0.0, 0.0, 0.0], 
    [0.0, 10.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, 10.0, 0.0, 0.0]
    ], dtype=th.config.floatX)
w = np.transpose(w)

W = th.shared(w, name='W', borrow=True)

R = W + X

f = th.function([X], R)

x = np.array([[1.0], [2.0], [3.0], [4.0], [5.0]])
print f(x)

Это ошибка, которую я получаю:

ValueError: Input dimension mis-match. (input[0].shape[1] = 3, input[1].shape[1] = 1)
Apply node that caused the error: Elemwise{add,no_inplace}(W, X)
Toposort index: 0
Inputs types: [TensorType(float64, matrix), TensorType(float64, matrix)]
Inputs shapes: [(5, 3), (5, 1)]
Inputs strides: [(8, 40), (8, 8)]

Кстати, код работает, если я определяю xследующим образом:

x = np.array([[1.0, 1.0, 1.0], [2.0, 2.0, 2.0], [3.0, 3.0, 3.0], [4.0, 4.0, 4.0], [5.0, 5.0, 5.0]])

1 ответ

  1. «Родное» решение, которое я нашел, это использовать theano.тензор.extra_ops.повторите операцию. Более подробно, мне нужно использовать

    Xr = T.extra_ops.repeat(X, 3, axis=1)
    

    Эта операция повторит столбец-вектор 3 раза. Таким образом, в результате мы получим матрицу с 3 (идентичными) столбцами и эта матрица может быть умножена (или суммирована) с Wматричным элементом wise.