model.fit上的维数错误

时间:2016-03-21 16:27:43

标签: python keras recurrent-neural-network

我试图运行这个SimpleRNN:

model.add(SimpleRNN(init='uniform',output_dim=1,input_dim=len(pred_frame.columns)))
model.compile(loss="mse", optimizer="sgd")
model.fit(X=predictor_train, y=target_train, batch_size=len(pred_frame.index),show_accuracy=True)

错误发生在model.fit上,如下所示:

File "/Users/file.py", line 1496, in Pred
model.fit(X=predictor_train, y=target_train, batch_size=len(pred_frame.index),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 513, in __call__
allow_downcast=s.allow_downcast)
File "/Library/Python/2.7/site-packages/theano/tensor/type.py", line 169, in filter
data.shape))
TypeError: ('Bad input argument to theano function with name "/Library/Python/2.7/site-packages/keras/backend/theano_backend.py:362"  at index 0(0-based)', 'Wrong number of dimensions: expected 3, got 2 with shape (88, 88).')

错误告诉我它的维度数量错误,它应该是3而且它只有2个。它指的是什么尺寸?

2 个答案:

答案 0 :(得分:8)

您正在尝试运行RNN。这意味着您希望在计算中包含先前的时间步长。为此,您必须在将数据提供给SimpleRNN层之前对其进行预处理。

为简单起见,我们假设不是88个样本,每个样本有88个,而是每个样本有4个样本。现在,当使用RNN时,您必须决定反向传播的最大值(即计算中包含的先前时间步数)。在这种情况下,您可以选择包含最多2个前一个时间步。因此,为了计算RNN的权重,您必须在每个时间步骤提供当前时间步的输入(具有其4个特征)和前2个时间步的输入(每个具有4个特征)。就像在这个可视化中一样:

sequence    sample0  sample1  sample2  sample3  sample4  sample5  sample6 sample7       
   0        |-----------------------|
   1                 |-----------------------|
   2                          |-----------------------|
   3                                   |-----------------------|
   4                                             |----------------------|
   5                                                      |----------------------|

因此,不必将(nb​​_samples,nb_features)矩阵作为SimpleRNN的输入,而是必须给它一个(nb_sequences,nb_timesteps,nb_features)形状的输入。在这个例子中,它意味着不是给出(8x4)输入而是给它一个(5x3x4)输入。

keras Embedding图层可能会完成这项工作,但在这种情况下,您也可以为其编写一个简短的代码:

input = np.random.rand(8,4)
nb_timesteps = 3    # 2 (previous) + 1 (current)
nb_sequences = input.shape[0] - nb_timesteps    #8-3=5

input_3D = np.array([input[i:i+nb_timesteps] for i in range(nb_sequences)])

答案 1 :(得分:4)

错误可能是因为输入尺寸的格式不是:

(nb_samples, timesteps, input_dim)

预计会有3个维度,而您只提供其中的2个(88,88)