2016-04-08 5 views
0

У меня есть два тензора и весовая матрица в Theano. Тензор A имеет размерность (k, 5, 40). Тензор B имеет размерность (k, 5, 40). Весовая матрица W имеет размерность (40,40). Я хотел бы вычислить A W B. Какова правильная последовательность операций тензора Теано для достижения этого? Обратите внимание, что k может меняться во время выполнения, но другие измерения фиксированы. Семантика мы хотим от W B является следующее:Как размножить тензоры в Theano

Придумайте А как совокупность К (5,40) матриц. Назовите их A_1, ..., A_k Подумайте, что B является набором матриц k (5,40). Назовите их B_1, ..., B_k. Мы хотим найти A_ {i} * W * B_ {i}^{T} для всех i от 1 до k. Я пробовал использовать theano.tensor.dot, но это кажется довольно запутанным.

Обратите внимание, что это неэффективный способ использования функции сканирования. Но это сделает последовательный параллельный код последовательным.

ответ

1

Извините, но я не знаю, что вы имели в виду «сбивать с толку»?

Я попробовал использовать маленький футляр, надеюсь, он может представлять ваш случай. Dot-продукт с использованием theano.tensor.dot между трехмерный тензором и двумерный матрицы:

import numpy as np 
import theano 
import theano.tensor as T 

a = T.tensor3('a', dtype='int64') 
c = T.matrix('c',dtype='int64') 
d = T.dot(a,c) 

g = theano.function([a,c],d) 

x = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int) 
y = np.array([[1,2],[1,3]], dtype=int) 
print g(x,y) 

выход:

[[[ 3 8] 
    [ 4 11]] 

[[ 4 10] 
    [ 2 5]]] 

Он работает как ваша логика, матрица c сделать скалярное произведение только во втором и третьем измерения ,

UPDATE

что первый код выше, вы можете использовать для первой операции в вашем случае (A * W). Извините, я не рассчитываю тщательно, конечно, после этой операции выход становится трехмерным тензором. Итак, чтобы выполнить (AW) * B, вы должны использовать другой подход. Для выполнения умножения между двумя тремя мерными тензорами Я обычно с помощью сканирования:

import numpy as np 
import theano 
import theano.tensor as T 

a = T.tensor3('a', dtype='int64') 
c = T.tensor3('c',dtype='int64') 
d, b = theano.scan(lambda i: T.dot(a[i,:], c[i,:]),sequences=T.arange(2)) 
g = theano.function([a,c],d) 

x = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int) 
y = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int) 
print g(x,y) 

но я знаю, что есть другой подход, использующий theano.tensor.batched_dot (theano.tensor.dot Я думаю, что только для 2D и 1D массива). В вашем случае прописать код можно следующим образом:

e = T.batched_dot(a,c) 
g = theano.function([a,c],e) 

приведенный выше код дает те же результаты. Надеюсь, поможет.

+0

Hi Malioboro! Я тоже смог это сделать! Проблема связана со вторым умножением. Вопрос задает трехстороннее умножение, а не два. Нам нужно умножить A и W, а затем (A * W) и (B) получить (A * W * B). Этот шаг A * W * B, который я не получаю. Как перейти от A * W, который вы создали в своем ответе (A * W) * B. Благодаря! – Sahil

+2

oh sorry @Sahil, я просчитаю измерение, я обновляю свой ответ – malioboro

+0

Hi Malioboro. В приведенном выше примере я хочу умножить трехмерный тензор на матричный точечный продукт. Подобно 'c = T.matrix ('c'), y = np.array ([[1,2], [3,4]]). Это нормально с циклом с использованием функции сканирования. Но использование T.batched_dot (a, c) дает правильное значение с ошибкой, например 'ValueError: get_scalar_constant_value, обнаруженным детерминированным IndexError:'. Не могли бы вы помочь? – Shyamkkhadka

Смежные вопросы