2015-10-15 13 views
6

Theano paylaşılan satırı oluşturun, ancak bir 1xN matrisi, bir matris ancak bir satır olur:bir satır Bir 1D numpy dizide dayalı paylaşılan değişken oluşturur Theano bulunan bu uygun bir vektör olur fark ettim

shared_vector = theano.shared(numpy.zeros((1,10,))) 
print(shared_vector.type) 
# TensorType(float64, matrix) 
print(shared_vector.broadcastable) 
# (False, False) 

ortak vektörü broadcastable değildir, çünkü, bir 1 XN satır vektörüne bir M x N matrisi eklemek istediğinizde zahmetli birinci boyut. Her şeyden önce, bu işe yaramaz:

row = T.row('row') 
mat=T.matrix('matrix') 
f=theano.function(
    [], 
    mat + row, 
    givens={ 
     mat: numpy.zeros((20,10), dtype=numpy.float32), 
     row: numpy.zeros((10,), dtype=numpy.float32) 
    }, 
    on_unused_input='ignore' 
) 

hata olarak:

TypeError: Cannot convert Type TensorType(float32, vector) (of Variable <TensorType(float32, vector)>) into Type TensorType(float32, row). You can try to manually convert <TensorType(float32, vector)> into a TensorType(float32, row). 

Tamam, çok açık, biz satırlara vektörleri atanamıyor. Ne yazık ki, bu değil ince de geçerli: hatası ile

row = T.matrix('row') 
mat=T.matrix('matrix') 
f=theano.function(
    [], 
    mat + row, 
    givens={ 
     mat: numpy.zeros((20,10), dtype=numpy.float32), 
     row: numpy.zeros((1,10,), dtype=numpy.float32) 
    }, 
    on_unused_input='ignore' 
) 
f() 

:

ValueError: Input dimension mis-match. (input[0].shape[0] = 20, input[1].shape[0] = 1) 
Apply node that caused the error: Elemwise{add,no_inplace}(<TensorType(float32, matrix)>, <TensorType(float32, matrix)>) 
Inputs types: [TensorType(float32, matrix), TensorType(float32, matrix)] 
Inputs shapes: [(20, 10), (1, 10)] 
Inputs strides: [(40, 4), (40, 4)] 
Inputs values: ['not shown', 'not shown'] 

Backtrace when the node is created: 
    File "<ipython-input-55-0f03bee478ec>", line 5, in <module> 
    mat + row, 

HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node. 

Yani sadece yanı bir satır olarak bir 1 x N matrisi kullanamazsınız (çünkü ilk boyutu 1 x N matris yayınlanamaz).

Soru şu ki, ne yapabiliriz? Matrix-satır ekini kullanarak yayınlanabilir olan bir tür satırın paylaşılan değişkeni nasıl oluşturabilirim?

+0

ben öğrendim görünüyor, yazdıktan sonra saniye. Bir vektör üzerinde .reshape kullanabilirim, yayınlanabilir (True, False) – Herbert

cevap

2

reshape(1, N) kullanmanın alternatifi, dimshuffle('x', 0)'u described in the documentation olarak kullanmaktır.

İşte iki yaklaşımın bir demo:

import numpy 
import theano 

x = theano.shared(numpy.arange(10)) 
print x 
print x.dimshuffle('x', 0).type 
print x.dimshuffle(0, 'x').type 
print x.reshape((1, x.shape[0])).type 
print x.reshape((x.shape[0], 1)).type 

f = theano.function([], outputs=[x, x.dimshuffle('x', 0), x.reshape((1, x.shape[0]))]) 
theano.printing.debugprint(f) 

Bu reshape daha az iş karıştırmak gibi dimshuffle muhtemelen tercih edilebilir kanıtlayan Türk

<TensorType(int32, vector)> 
TensorType(int32, row) 
TensorType(int32, col) 
TensorType(int32, row) 
TensorType(int32, col) 
DeepCopyOp [@A] '' 2 
|<TensorType(int32, vector)> [@B] 
DeepCopyOp [@C] '' 4 
|InplaceDimShuffle{x,0} [@D] '' 1 
    |<TensorType(int32, vector)> [@B] 
DeepCopyOp [@E] '' 6 
|Reshape{2} [@F] '' 5 
    |<TensorType(int32, vector)> [@B] 
    |MakeVector{dtype='int64'} [@G] '' 3 
    |TensorConstant{1} [@H] 
    |Shape_i{0} [@I] '' 0 
     |<TensorType(int32, vector)> [@B] 

yazdırır.

+0

olan bir 1 x N matrisi oluşturmak için her zaman okunabilirlik nedenleriyle yeniden şekillendirmeyi tercih ediyorum, ama şimdi kararsızlık düşüneceğim. Teşekkür ederim! – Herbert

1

Ben kullanırsınız:

shared_row = theano.shared(numpy.zeros((1,10,)), broadcastable=(True, False)) 
print(shared_row.type) 
# TensorType(float64, row) 
print(shared_row.broadcastable) 
(True, False) 
+0

Doğru cevap bu değil mi? –