2016-04-08 11 views
0

Theano'da iki tensör ve bir ağırlık matrisi var. Tensor A boyutuna sahiptir (k, 5, 40). Tensor B'nin boyutu vardır (k, 5, 40). Ağırlık matrisinin W boyutu vardır (40,40). Bunu elde etmek için doğru Theano tensör işlem sırası nedir? A W B. K'nin çalışma süresi içinde değişebileceğini, ancak diğer boyutların sabit olduğunu unutmayın. k (5,40) matrisleri topluluğu olarak A'nınTheano'da Tensörler nasıl çoğaltılabilir

Think: semantik biz bir W B'den istiyorum şudur. Onları A_1, ..., A_k B'yi (k) (5,40) matrisler topluluğu olarak düşünün. Onlara B_1, ..., B_k. Tüm i için 1'den k'ye A_ {i} * W * B_ {i}^{T} bulmak istiyoruz. Theano.tensor.dot kullanmayı denedim ama oldukça kafa karıştırıcı görünüyor.

Bunu yapmanın verimli olmayan bir yolu tarama işlevini kullanmaktır. Ama bu doğal olarak paralel bir kod sıralaması yapar.

cevap

1

Üzgünüm, ama "kafa karıştırıcı" derken ne demek istediniz bilmiyorum?

Küçük harf kullanmayı denedim, umarım vakanı temsil edebilir. theano.tensor.dot üç ila boyutlu tensörünü ve iki boyutlu matris kullanarak Dot-ürün:

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) 

çıkışı:

Bu sizin mantık gibi çalışır
[[[ 3 8] 
    [ 4 11]] 

[[ 4 10] 
    [ 2 5]]] 

, matris c yalnızca ikinci ve üçüncü boyutta dot-ürünü yapmak .

GÜNCELLEME

yukarıdaki ilk kod, kendi halinde birinci operasyonda (A * B) için kullanabileceği. Maalesef dikkatlice hesaplamıyorum, tabiki bu operasyondan sonra çıktı üç boyutlu tensör haline geldi. Yani, (AW) * B'yi gerçekleştirmek için farklı bir yaklaşım kullanmalısınız. Genellikle taramayı kullanarak iki üç boyutlu tensörlerle arasındaki çarpma işlemini gerçekleştirmek için:

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) 

ama ben theano.tensor.batched_dot (theano.tensor.dot sadece 2D ve 1D dizisi için düşünüyorum) kullanarak başka bir yaklaşım olduğunu biliyoruz. Senin durumunda böyle kodlamak için basit:

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

kod yukarıdaki aynı sonuçları verir. Umarım yardımcı olur.

+0

Merhaba Malioboro! Bunu da yapabildim! Sorun ikinci çarpma ile geliyor. Soru, üç yönlü bir çarpma, iki değil ister. A ve W ile (A * W) ve (B) sayılarını (A * W * B) elde etmek için çarpmamız gerekiyor. Bu almıyorum A * W * B adımı. Cevabınızda (A * W) * B'ye ulaştığınız A * W'den nasıl geçeceğiz? Teşekkürler! – Sahil

+2

oh Üzgün ​​@Sahil, boyutu yanlış hesapladım, cevabımı güncelledim – malioboro

+0

Merhaba Malioboro, Yukarıdaki örnekte, 3D tensörü bir matris nokta çarpısıyla çarpmak istiyorum. C = T. matris ('c'), y = np.array ([[1,2], [3,4]]) 'gibi. Tarama fonksiyonunu kullanarak döngü yapmak iyidir. Ancak T.batched_dot (a, c) kullanılarak, ValueError: get_scalar_constant_value saptanan determinist IndexError: 'gibi bir hatayla doğru değer verilir. Yardım edebilir misin ? – Shyamkkhadka

İlgili konular