Python / Keras - número errado de dimensões esperadas: 3, obtido com 2 forma (119, 80)

votos
10

Eu sou novo para Keras e tendo alguns problemas com formas, especialmente quando se trata de RNNs e LSTMs.

Estou executando este código:

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 predictor_train variável é uma matriz numpy com 119 matrizes interiores, cada uma tendo 80 itens diferentes.

Eu estou tendo esse erro:

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 (119, 80).')

Até agora o que eu descobri é que um RNN recebe tensor 3D com forma de (batch_size, Timesteps, dimensão) e quando você definir input_shape o batch_size normalmente é omitido, e você deve apenas fornecer uma tupla de (Timesteps, dimensão). Mas em que parte do código deve que ser alterado (se possível, adicione suas sugestões de alteração de código)?

Enlightment necessário! Eu estive preso em que por um tempo ...


INFORMAÇÃO EXTRA


Sobre pred_frame

Tipo: Class 'pandas.core.frame.DataFrame'

forma: (206,80)

                  Pred      Pred         Pred  ...    
Date                                                                      
1999-01-01         NaN       NaN          NaN         
1999-02-01         NaN       NaN          NaN        
1999-03-01         NaN       NaN          NaN       
1999-04-01         NaN       NaN          NaN
...
2015-11-01  288.333333 -0.044705   589.866667
2015-12-01  276.333333 -0.032157  1175.466667    
2016-01-01  282.166667  0.043900  1458.966667     
2016-02-01  248.833333 -0.082199  5018.966667   
[206 rows x 80 columns]


Sobre target_train

Tipo: Class 'pandas.core.series.Series'

forma: (119,)

dtipo: 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


Sobre predictor_train

Tipo: 'numpy.ndarray'

forma: (119,80)

dtipo: float64

[[  0.00000000e+00  -1.00000000e+00   1.03550000e-02 ...,   8.42105263e-01
    6.50000000e+01  -3.98148148e-01]
 [ -1.13600000e-02  -1.07482052e+00  -9.25333333e-03 ...,   4.45783133e-01
    8.30000000e+01  -1.94915254e-01]
 [  4.71300000e-02  -5.14876761e+00   1.63166667e-03 ...,   4.45783133e-01
    8.50000000e+01  -1.94915254e-01]
 ..., 
 [  4.73500000e-02  -1.81092653e+00  -8.54000000e-03 ...,   1.39772727e+00
    2.77000000e+02  -3.43601896e-01]
 [ -6.46000000e-03  -1.13643083e+00   1.06100000e-02 ...,   2.22551929e-01
    2.77000000e+02  -3.43601896e-01]
 [  3.14200000e-02  -5.86377709e+00   1.50850000e-02 ...,   2.22551929e-01
    2.82000000e+02  -2.76699029e-01]]

EDITAR

Graças a @ Y300 aparentemente o problema 3d é superada. Minha forma agora é (119,1,80).

model.summary() returns the following:
--------------------------------------------------------------------------------
Initial input shape: (None, None, 119)
--------------------------------------------------------------------------------
Layer (name)                  Output Shape                  Param #             
--------------------------------------------------------------------------------
SimpleRNN (Unnamed)           (None, 1)                     121                 

Total params: 121

No entanto, ainda estou recebendo um problema moldar na linha model.fit, como você pode ver abaixo:

File /Library/Python/2.7/site-packages/theano/tensor/blas.py, line 1612, in perform
z[0] = numpy.asarray(numpy.dot(x, y))
ValueError: ('shapes (119,80) and (119,1) not aligned: 80 (dim 1) != 119 (dim 0)', (119, 80), (119, 1))
Apply node that caused the error: Dot22(Alloc.0, <TensorType(float32, matrix)>)
Inputs types: [TensorType(float32, matrix), TensorType(float32, matrix)]
Inputs shapes: [(119, 80), (119, 1)]
Inputs strides: [(320, 4), (4, 4)]
Inputs values: ['not shown', 'not shown']

Por que isso está acontecendo e como eu poderia corrigir isso?

Publicado 26/03/2016 em 20:40
fonte usuário
Em outras línguas...                            


1 respostas

votos
5

Você pode verificar o seu modelo parece fazendo

model.summary()

Neste caso, o seu deve ser algo como isto (valores reais podem diferir):

--------------------------------------------------------------------------------
Initial input shape: (None, None, 100)
--------------------------------------------------------------------------------
Layer (name)                  Output Shape                  Param #             
--------------------------------------------------------------------------------
SimpleRNN (simplernn)         (None, 1)                     102                 
  --------------------------------------------------------------------------------
Total params: 102
--------------------------------------------------------------------------------

Como você pode ver, a entrada é um tensor 3D, não um 2D. Então, você precisa reformular suas matrizes para caber o que Keras está esperando. Em particular, a entrada X_train deve ter dimensões (num_samples, 1, input_dim). Aqui está um exemplo de trabalho com alguma gerado aleatoriamente dados x / y:

model.add(keras.layers.SimpleRNN(init='uniform',output_dim=1,input_dim=100))
model.compile(loss="mse", optimizer="sgd")
X_train = np.random.rand(300,1,100)
y_train = np.random.rand(300)
model.fit(X=X_train, y=y_train, batch_size=32,show_accuracy=True)
Respondeu 29/03/2016 em 13:54
fonte usuário

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