Seite 1 von 1

ValueError: ('You cannot drop a non-broadcastable dimension.')

Verfasst: Mittwoch 12. April 2017, 10:43
von Romaxx
Hallo zusammen,

ich möchte eine iteration mit der scan function von theano machen.
Dazu habe ich mit einem kleinen Beispiel angefangen und möchte dieses stückweise erweitern.
Dieses Beispiel funktioniert fehlerfrei:

[codebox=python file=Unbenannt.txt]import numpy as np
import theano
import theano.tensor as T

N = 100
M = 50
D = 2
EPhiTPhi = np.zeros((M,M))
Z_n_W = T.dtensor3("Z_n_W")
MU_S_hat_minus = T.dtensor3("MU_S_hat_minus")

def EPhiTPhi_loop(EPhiTPhi, Z_n_W, MU_S_hat_minus):
EPhiTPhi = EPhiTPhi + Z_n_W * (T.exp(-0.5 * (MU_S_hat_minus**2).sum(2)));
return EPhiTPhi

EPhiTPhi_out, _ = theano.scan(EPhiTPhi_loop,
outputs_info = EPhiTPhi,
sequences = [Z_n_W],
non_sequences = [MU_S_hat_minus])

OUT = theano.function(inputs=[Z_n_W, MU_S_hat_minus], outputs = EPhiTPhi_out)


Z_n_W = np.ones((N,M,M))
MU_S_hat_minus = np.zeros((M,M,D))
#EPhiTPhi = EPhiTPhi.astype(np.float32)
#Z_n_W = Z_n_W.astype(np.float32)
#MU_S_hat_minus = MU_S_hat_minus.astype(np.float32)

LIST = {'Z_n_W': Z_n_W, 'MU_S_hat_minus': MU_S_hat_minus}

TEST = OUT(**LIST)[/code]

für eine Erweiterung mit einer Variable SIGMA_trf klappt es dann nicht mehr:

[codebox=python file=Unbenannt.txt][codebox=python file=Unbenannt.txt]import numpy as np
import theano
import theano.tensor as T

N = 100
M = 50
D = 2
EPhiTPhi = np.zeros((M,M))
SIGMA_trf = T.dmatrix("SIGMA_trf")
Z_n_W = T.dtensor3("Z_n_W")
MU_S_hat_minus = T.dtensor3("MU_S_hat_minus")
MU_S_hat_plus = T.dtensor3("MU_S_hat_plus")

def EPhiTPhi_loop(EPhiTPhi, SIGMA_trf, Z_n_W, MU_S_hat_minus):
EPhiTPhi = EPhiTPhi + Z_n_W * (T.exp(-0.5 * (MU_S_hat_minus**2 * SIGMA_trf[None, None, :]).sum(2)));
return EPhiTPhi

EPhiTPhi_out, _ = theano.scan(EPhiTPhi_loop,
outputs_info = EPhiTPhi,
sequences = [SIGMA_trf, Z_n_W],
non_sequences = [MU_S_hat_minus])

OUT = theano.function(inputs=[SIGMA_trf, Z_n_W, MU_S_hat_minus], outputs = EPhiTPhi_out)

SIGMA_trf = np.zeros((N,D))
Z_n_W = np.ones((N,M,M))
MU_S_hat_minus = np.zeros((M,M,D))
MU_S_hat_plus = np.zeros((M,M,D))
#EPhiTPhi = EPhiTPhi.astype(np.float32)
#Z_n_W = Z_n_W.astype(np.float32)
#MU_S_hat_minus = MU_S_hat_minus.astype(np.float32)
#MU_S_hat_plus = MU_S_hat_plus.astype(np.float32)

LIST = {'SIGMA_trf': SIGMA_trf, 'Z_n_W': Z_n_W, 'MU_S_hat_minus': MU_S_hat_minus}

TEST = OUT(**LIST)[/code]

Ich erhalte diesen fehler:

Code: Alles auswählen

Traceback (most recent call last):

  File "<ipython-input-1-dd8e5b5e726c>", line 22, in <module>
    non_sequences = [MU_S_hat_minus])

  File "C:\ProgramData\Anaconda3\lib\site-packages\theano\scan_module\scan.py", line 773, in scan
    condition, outputs, updates = scan_utils.get_updates_and_outputs(fn(*args))

  File "<ipython-input-1-dd8e5b5e726c>", line 15, in EPhiTPhi_loop
    EPhiTPhi = EPhiTPhi + Z_n_W * (T.exp(-0.5 * (MU_S_hat_minus**2 * SIGMA_trf[None, None, :]).sum(2)));

  File "C:\ProgramData\Anaconda3\lib\site-packages\theano\tensor\var.py", line 560, in __getitem__
    view = self.dimshuffle(pattern)

  File "C:\ProgramData\Anaconda3\lib\site-packages\theano\tensor\var.py", line 355, in dimshuffle
    pattern)

  File "C:\ProgramData\Anaconda3\lib\site-packages\theano\tensor\elemwise.py", line 177, in __init__
    (input_broadcastable, new_order))

ValueError: ('You cannot drop a non-broadcastable dimension.', ((False, False), ('x', 'x', 0)))
Was mache ich falsch?