número errado de dimensões no model.fit

votos
8

Estou tentando executar este 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)

O erro está em model.fit, como você pode ver abaixo:

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

O erro está me dizendo que ele tem o número errado de dimensões, deve ser 3 e só tem 2. Quais são as dimensões que se refere?

Publicado 21/03/2016 em 14:27
fonte usuário
Em outras línguas...                            


2 respostas

votos
4

O erro é provavelmente porque suas dimensões de entrada não está no formato de:

(nb_samples, timesteps, input_dim)

Ele está esperando 3 dimensões, e você está fornecendo apenas 2 deles (88,88).

Respondeu 22/03/2016 em 14:08
fonte usuário

votos
8

Você está tentando executar um RNN. Isso significa que você quer incluir passos de tempo anteriores em seu cálculo. A fim de fazer isso, você tem que pré-processar seus dados antes de dar à camada SimpleRNN.

Para simplificar, vamos supor que, em vez de 88 amostras com 88 características de cada você tem 8 amostras com 4 características cada. Agora, quando se utiliza um RNN você terá que decidir sobre um máximo para o backpropagation (ou seja, número de passos de tempo anteriores que são incluídos no cálculo). Neste caso, você pode optar por incluir um máximo de 2 passos de tempo anteriores. Portanto, para o cálculo dos pesos da RNN você terá que fornecer a cada momento passo a entrada do passo de tempo atual (com as suas 4 funções) ea entrada dos 2 passos de tempo anteriores (com 4 apresenta cada). Assim como nesta visualização:

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

Então, ao invés de dar um (nb_samples, nb_features) matriz como uma entrada para o SimpleRNN, você terá que dar-lhe um (nb_sequences, nb_timesteps, nb_features) de entrada em forma. Neste exemplo, isso significa que em vez de dar uma entrada (8x4) você dar-lhe uma entrada (5x3x4).

O keras Embedding camada pode fazer este trabalho, mas neste caso você também pode escrever um pequeno código para ele:

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)])
Respondeu 30/03/2016 em 09:07
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more