2016-02-19 3 views
1

Я использую языковое моделирование на уровне слова с ванильным rnn, я могу обучить модель, но по некоторым странным причинам я не могу получить любые образцы/прогнозы из модели; вот соответствующая часть кода:Неверное количество измерений: ожидается 0, получено 1 с формой (1,)

train_set_x, train_set_y, voc = load_data(dataset, vocab, vocab_enc) # just load all data as shared variables 
index = T.lscalar('index') 
x = T.fmatrix('x') 
y = T.ivector('y') 
n_x = len(vocab) 
n_h = 100 
n_y = len(vocab) 

rnn = Rnn(input=x, input_dim=n_x, hidden_dim=n_h, output_dim=n_y) 

cost = rnn.negative_log_likelihood(y) 

updates = get_optimizer(optimizer, cost, rnn.params, learning_rate) 

train_model = theano.function(
    inputs=[index], 
    outputs=cost, 
    givens={ 
     x: train_set_x[index], 
     y: train_set_y[index] 
    }, 
    updates=updates 
) 

predict_model = theano.function(
    inputs=[index], 
    outputs=rnn.y, 
    givens={ 
     x: voc[index] 
    } 
) 

sampling_freq = 2 
sample_length = 10 
n_train_examples = train_set_x.get_value(borrow=True).shape[0] 
train_cost = 0. 
for i in xrange(n_train_examples): 
    train_cost += train_model(i) 
    train_cost /= n_train_examples 

    if i % sampling_freq == 0: 
     # sample from the model  
     seed = randint(0, len(vocab)-1) 
     idxes = [] 
     for j in xrange(sample_length): 
      p = predict_model(seed) 
      seed = p 
      idxes.append(p) 
      # sample = ''.join(ix_to_words[ix] for ix in idxes) 
      # print(sample) 

Я получаю ошибку: «TypeError: ('Bad входной аргумент Theano функцию с именем„train.py:94“с индексом 0 (0 основе) », 'Неправильное количество измерений: ожидается 0, получил 1 с формой (1)')»

Теперь это соответствует следующей строке (в predict_model).

givens={ x: voc[index] } 

Даже после того, как Я не могу понять, как может быть измерение с неправильным соотношением w курица:

train_set_x has shape: (42, 4, 109) 
voc has shape: (109, 1, 109) 

И когда я train_set_x [индекс], я получаю (4, 109) который 'х' Тензор типа fmatrix может содержать (это то, что происходит в train_model) но когда я делаю voc [index], я получаю (1, 109), который также является матрицей, но 'x' не может это удержать, почему? !

Любая помощь будет очень признательна.

Спасибо!

ответ

2

Сообщение об ошибке относится к определению целой функции Anano с именем predict_model, а не к конкретной строке, где происходит замещение givens.

Проблема, кажется, что predict_model вызывается с аргументом, который является вектором длиной 1 вместо скалярного. Начальный seed, отобранный из randint, фактически является скаляром, но я бы предположил, что выход ppredict_model(seed) является вектором, а не скаляром.

В этом случае вы можете либо вернуться rnn.y[0] в predict_model или заменить seed = p с seed = p[0] в петле над j.

+0

Вы правы, выход из прогноза_модели (семени) i.e rnn.y был вектором, а не скаляром. Это было действительно глупо с моей стороны :(, Спасибо! – uyaseen

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