维数错误:预期为 0,得到形状为 (1,) 的 1
Wrong number of dimensions: expected 0, got 1 with shape (1,)
我正在使用 vanilla rnn 进行词级语言建模,我能够训练模型,但由于某些奇怪的原因,我无法从模型中获得任何 samples/predictions;这是代码的相关部分:
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 input argument to theano function with name "train.py:94" at index 0(0-based)', 'Wrong number of dimensions: expected 0, got 1 with shape (1,).')"
现在这对应于以下行(在 predict_model 中):
givens={ x: voc[index] }
即使花了几个小时我也无法理解尺寸不匹配的原因:
train_set_x has shape: (42, 4, 109)
voc has shape: (109, 1, 109)
当我执行 train_set_x[index] 时,我得到 (4, 109) 其中 'x' fmatrix 类型的张量可以保持(这就是 train_model 中发生的情况)但是当我执行 voc[index] 时,我得到 (1, 109) ,它也是一个矩阵,但是'x'不能容纳这个,为什么? !
任何帮助将不胜感激。
谢谢!
错误消息指的是名为 predict_model
的整个 Theano 函数的定义,而不是替换为 givens
的特定行。
问题似乎是 predict_model
被调用的参数是 长度为 1 的向量而不是 标量 .从 randint
采样的初始 seed
实际上是一个标量,但我猜测 predict_model(seed)
的输出 p
是一个向量而不是标量。
在这种情况下,您可以在 predict_model
中 return rnn.y[0]
,或者在 [=21= 的循环中将 seed = p
替换为 seed = p[0]
].
我正在使用 vanilla rnn 进行词级语言建模,我能够训练模型,但由于某些奇怪的原因,我无法从模型中获得任何 samples/predictions;这是代码的相关部分:
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 input argument to theano function with name "train.py:94" at index 0(0-based)', 'Wrong number of dimensions: expected 0, got 1 with shape (1,).')"
现在这对应于以下行(在 predict_model 中):
givens={ x: voc[index] }
即使花了几个小时我也无法理解尺寸不匹配的原因:
train_set_x has shape: (42, 4, 109)
voc has shape: (109, 1, 109)
当我执行 train_set_x[index] 时,我得到 (4, 109) 其中 'x' fmatrix 类型的张量可以保持(这就是 train_model 中发生的情况)但是当我执行 voc[index] 时,我得到 (1, 109) ,它也是一个矩阵,但是'x'不能容纳这个,为什么? !
任何帮助将不胜感激。
谢谢!
错误消息指的是名为 predict_model
的整个 Theano 函数的定义,而不是替换为 givens
的特定行。
问题似乎是 predict_model
被调用的参数是 长度为 1 的向量而不是 标量 .从 randint
采样的初始 seed
实际上是一个标量,但我猜测 predict_model(seed)
的输出 p
是一个向量而不是标量。
在这种情况下,您可以在 predict_model
中 return rnn.y[0]
,或者在 [=21= 的循环中将 seed = p
替换为 seed = p[0]
].