错误的维数:预期为 0,得到 1,形状为 (1,)

Posted

技术标签:

【中文标题】错误的维数:预期为 0,得到 1,形状为 (1,)【英文标题】:Wrong number of dimensions: expected 0, got 1 with shape (1,) 【发布时间】:2016-06-01 02:53:38 【问题描述】:

我正在使用 vanilla rnn 进行单词级语言建模,我能够训练模型,但由于一些奇怪的原因,我无法从模型中获得任何样本/预测;这是代码的相关部分:

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: ('theano function with name "train.py:94" at index 0(0-based)'的错误输入参数','维数错误:预期为 0,得到 1 个形状为 (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'不能坚持这个,为什么? !

任何帮助将不胜感激。

谢谢!

【问题讨论】:

【参考方案1】:

错误消息是指名为predict_model 的整个Theano 函数的定义,而不是发生givens 替换的特定行。

问题似乎是 predict_model 被调用时使用的参数是 长度为 1 的向量,而不是 标量。从randint 采样的初始seed 实际上是一个标量,但我猜predict_model(seed) 的输出p 是一个向量而不是一个标量。

在这种情况下,您可以在predict_model 中返回rnn.y[0],或者在j 的循环中将seed = p 替换为seed = p[0]

【讨论】:

你是对的,predict_model(seed) 的输出,即 rnn.y 是一个向量而不是一个标量。这对我来说真的很愚蠢:(,谢谢!

以上是关于错误的维数:预期为 0,得到 1,形状为 (1,)的主要内容,如果未能解决你的问题,请参考以下文章

Cython ValueError:缓冲区的维数错误(预期为 2,得到 3)

pandas:转换数据帧集合时,缓冲区的维数错误(预期为1,得0)

ValueError:所有输入数组必须具有相同的维数

Pandas:缓冲区的维数错误

检查目标时出错:预期 dense_3 的形状为 (3,) 但得到的数组的形状为 (1,)

ValueError:检查目标时出错:预期dense_3的形状为(1,)但得到的数组形状为(2,)