Имам проблеми с функцията за сканиране на Theano и следния код:
def lstm_layer(tparams, options, trng, prefix='lstm'):
def _slice(_x, n, dim):
if _x.ndim == 3:
return _x[:, :, n * dim:(n + 1) * dim]
return _x[:, n * dim:(n + 1) * dim]
def _step(sample_, h_, c_):
theano.printing.debugprint(sample_,print_type=True)
emb = tparams['Wemb'][sample_]
x_ = tensor.dot(emb[None,:], tparams[_p(prefix, 'W')]) + tparams[_p(prefix, 'b')]
preact = tensor.dot(h_, tparams[_p(prefix, 'U')])
preact += x_
i = tensor.nnet.sigmoid(_slice(preact, 0, options['dim_proj']))
f = tensor.nnet.sigmoid(_slice(preact, 1, options['dim_proj']))
o = tensor.nnet.sigmoid(_slice(preact, 2, options['dim_proj']))
c = tensor.tanh(_slice(preact, 3, options['dim_proj']))
c = f * c_ + i * c
h = o * tensor.tanh(c)
pred = tensor.nnet.softmax(tensor.dot(h, tparams['U']) + tparams['b'])
rand = trng.multinomial(n=1, pvals=pred)
sample = tensor.argmax(rand[0], axis=0)
return sample, h, c
start = tensor.scalar('start', dtype='int64')
dim_proj = options['dim_proj']
nsteps = options['seq_length']
rval, updates = theano.scan(_step,
outputs_info=[start,
tensor.alloc(numpy_floatX(0.),
1,
dim_proj),
tensor.alloc(numpy_floatX(0.),
1,
dim_proj)],
name=_p(prefix, '_layers'),
n_steps=2)
return rval[0], start
Както можете да видите, променливата start е цяло число, което получава нова стойност след всяко извикване на step_ и искам да получа последователностите от нейните стойности след произволен брой стъпки n_steps. Ако стартирам кода с n_steps = 1, всичко работи. Въпреки това, за n_steps > 1, получавам тази грешка:
TypeError: Не може да се преобразува тип TensorType(float64, 3D) (на променлива IncSubtensor{Set;:int64:}.0) в тип TensorType(float64, (False, True, False)). Можете да опитате ръчно да конвертирате IncSubtensor{Set;:int64:}.0 в TensorType(float64, (False, True, False)).
Не разбирам откъде идва, тъй като никоя от моята променлива не е 3D тензор (проверих с theano.printing.debugprinting и h и c са редове, както се очаква, и проба скаларен).
Имате ли представа?
Благодаря
_x
да бъде 3D предвид кода във функцията_slice
. Можете ли да предоставите някакъв минимален изпълним код, който илюстрира проблема, защото може да бъде трудно да се помогне с този вид грешки само чрез четене на код. - person Daniel Renshaw   schedule 28.07.2015