【问题标题】:Python/Keras/Theano - Index out of boundsPython/Keras/Theano - 索引超出范围
【发布时间】:2016-07-21 16:00:40
【问题描述】:

我是 Keras 的新手,在形状方面遇到了一些问题,特别是在涉及 RNN 和 LSTM 时。

我正在运行此代码:

model=Sequential()
model.add(Embedding(input_dim=col,output_dim=70))
model.add(SimpleRNN(init='uniform',output_dim=30))
model.add(Dropout(0.5))
model.add(Dense(1))
model.compile(loss="mse", optimizer="sgd")
model.fit(X=predictor_train, y=target_train, nb_epoch=5, batch_size=1,show_accuracy=True)

我遇到了这个错误:

IndexError: index 143 is out of bounds for size 80
Apply node that caused the error: AdvancedSubtensor1(<TensorType(float32, matrix)>, Flatten{1}.0)
Inputs types: [TensorType(float32, matrix), TensorType(int32, vector)]
Inputs shapes: [(80, 70), (80,)]
Inputs strides: [(280, 4), (4,)]
Inputs values: ['not shown', 'not shown']

我不明白“索引 143”来自哪里以及如何修复它。

有人可以为我的旅程提供启蒙吗?

下面的额外信息。

-- 编辑-- 每次我运行代码时,这个“索引 143”实际上都会有所不同。这些数字不遵循任何明显的逻辑,我唯一能注意到的是,无论巧合与否,出现的最小数字是 80(我运行代码超过 20 次)




额外信息


关于 predictor_train (X)

类型:'numpy.ndarray'

形状:(119,80)

dtype:float64

关于 target_train (Y)

类型:类'pandas.core.series.Series'

形状:(119,)

dtype:float64

Date
2004-10-01    0.003701
2005-05-01    0.001715
2005-06-01    0.002031
2005-07-01    0.002818
...
2015-05-01   -0.007597
2015-06-01   -0.007597
2015-07-01   -0.007597
2015-08-01   -0.007597

model.summary()

--------------------------------------------------------------------------------
Initial input shape: (None, 80)
--------------------------------------------------------------------------------
Layer (name)                  Output Shape                  Param #             
--------------------------------------------------------------------------------
Embedding (Unnamed)           (None, None, 70)              5600                
SimpleRNN (Unnamed)           (None, 30)                    3030                
Dropout (Unnamed)             (None, 30)                    0                   
Dense (Unnamed)               (None, 1)                     31                  
--------------------------------------------------------------------------------
Total params: 8661
--------------------------------------------------------------------------------

完整追溯

File "/Users/file.py", line 1523, in Pred
model.fit(X=predictor_train, y=target_train, nb_epoch=5, batch_size=1,show_accuracy=True)
File "/Library/Python/2.7/site-packages/keras/models.py", line 581, in fit
shuffle=shuffle, metrics=metrics)
File "/Library/Python/2.7/site-packages/keras/models.py", line 239, in _fit
outs = f(ins_batch)
File "/Library/Python/2.7/site-packages/keras/backend/theano_backend.py", line 365, in __call__
return self.function(*inputs)
File "/Library/Python/2.7/site-packages/theano/compile/function_module.py", line 595, in __call__
outputs = self.fn()
File "/Library/Python/2.7/site-packages/theano/gof/vm.py", line 233, in __call__
link.raise_with_op(node, thunk)
File "/Library/Python/2.7/site-packages/theano/gof/vm.py", line 229, in __call__
thunk()
File "/Library/Python/2.7/site-packages/theano/gof/op.py", line 768, in rval
r = p(n, [x[0] for x in i], o)
File "/Library/Python/2.7/site-packages/theano/tensor/subtensor.py", line 1657, in perform
out[0] = x.take(i, axis=0, out=o)
IndexError: index 143 is out of bounds for size 80
Apply node that caused the error: AdvancedSubtensor1(<TensorType(float32, matrix)>, Flatten{1}.0)
Inputs types: [TensorType(float32, matrix), TensorType(int32, vector)]
Inputs shapes: [(80, 70), (80,)]
Inputs strides: [(280, 4), (4,)]
Inputs values: ['not shown', 'not shown']

【问题讨论】:

    标签: python numpy theano keras


    【解决方案1】:

    X 变量可能包含值 143。Embedding 层的尺寸为 80x70。

    我假设这是在 NLP 领域。这意味着您的词汇表大小为 80 个单词,每个单词由长度为 70 的向量表示。您的 X 变量表示 119 个长度为 80 的句子(或 80 个长度为 119 的句子),其内容表示您的词汇表的索引。如果它包含大于 80 的单词索引,则会弹出此错误。

    col 变量的更常见值高于 10.000。当然,这取决于你在做什么。

    【讨论】:

    • 不是真的,这个在这个例子中显示为 143 的数字每次我再次运行代码时都会发生变化,所以我知道它与 X 的尺寸无关,而是与其他事物有关。
    • 我并不是说 143 与尺寸有关,但它在您的矩阵 X 中。如果您随机生成X,您的代码将失败,不同的值高于80(您的词汇表大小,您通过input_dim 传递给Embedding --> Embedding(input_dim=col,output_dim=70)
    • 你的意思是,在我的矩阵 X 中有一个“单元”,其值为 143,它与形状没有任何关系? (我没有随机生成任何东西 col=len(predictor_train.columns) - 它之前是一个 Pandas 数据框,后来变成了一个 numpy 数组以适应 Keras)
    • 是的。 X 的值是Embedding 行的索引。 col 至少应该是该数据帧 +1 的最大值。我不知道你在做什么任务。在您的情况下,Embedding 的输出是一个形状为 (X.shape[0], X.shape[1], 70) 的矩阵。
    • 我明白了。刚刚又看到你对X的描述了。奇怪的是,当您的输入为浮点数时,您使用的是 Embedding 层。 Embedding 的输入应该是整数:keras.io/layers/embeddings 我认为您并不完全理解 Embedding 的工作原理,我试图解释这一点。您的输入被转换为整数,然后这些整数用作嵌入矩阵的索引并检索一行。您只有 80 行,而您的浮点数高于 80。这会引发 IndexError
    猜你喜欢
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 2017-10-02
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多