Wrong number of dimensions on model.fit

浪尽此生 提交于 2019-12-09 15:39:50

问题


I'm trying to run this 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)

The error is on model.fit, as you can see below:

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).')

The error is telling me it's got the wrong number of dimensions, it should be 3 and it has only got 2. What are the dimensions it is referring to?


回答1:


You are trying to run a RNN. This means that you want to include previous time steps in your calculation. In order to do so, you have to preprocess your data before giving it to the SimpleRNN layer.

For simplicity, let us assume that instead of 88 samples with 88 features each you have 8 samples with 4 features each. Now, when using a RNN you will have to decide on a maximum for the backpropagation (i.e. number of previous time steps that are included in the calculation). In this case, you could choose to include a maximum of 2 previous time steps. Therefore, for the calculation of the weights of the RNN you will have to provide at each time step the input of the current time step (with its 4 features) and the input of the 2 previous time steps (with 4 features each). Just like in this visualization:

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

So instead of giving a (nb_samples, nb_features) matrix as an input to the SimpleRNN, you will have to give it a (nb_sequences, nb_timesteps, nb_features) shaped input. In this example, it means that instead of giving a (8x4) input you give it a (5x3x4) input.

The keras Embedding layer might do this job but in this case you can also write a short code for it:

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)])



回答2:


The error is probably because your input dimensions are not in the format of:

(nb_samples, timesteps, input_dim)

It is expecting 3 dimensions, and you're providing only 2 of them (88,88).



来源:https://stackoverflow.com/questions/36136562/wrong-number-of-dimensions-on-model-fit

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!