2016-03-26 30 views
9

Özellikle Keras'a yeni ve şekillerde sorun yaşıyorum, özellikle de RNN ve LSTM'ler söz konusu olduğunda.Python/Keras - Boyutların yanlış sayısı: beklenen 3, şekil 2 ile aldım (119, 80)

Bu kod kullanıyorum:

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) 

değişken predictor_train 119 iç dizilerle bir numpy dizisi, 80 farklı ürün içeren her biridir.

bu hatayı yaşıyorum:

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

Şimdiye kadar öğrendim bir RYSA (batch_size, dilimler, boyut) şekline sahip 3D tensörünü aldığı ve sen batch_size input_shape ayarladığınızda neler genellikle atlanır ve sadece bir zaman çizelgesi vermelisiniz (zaman çizelgeleri, boyut). Ancak, kodun hangi bölümünde değiştirilmelidir (eğer mümkünse, kod değiştirme önerilerinizi ekleyin)?

Aydınlanma gerekli! Ben ... Bir süre bu konuda


EKSTRA INFO sıkışıp kaldım


About pred_frame

tipi: Sınıf 'pandas.core.frame.DataFrame'

şekil: (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] 


About target_train

türü: sınıfının pandas.core.series.Series '

şekli: (119),

d_type:

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 


float64

About predictor_train

türü: 'numpy.ndarray'

şekli: (119,80)

d_type: görünüşte @ Y300 için

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

DÜZENLEME

sayesinde float64 3d problem aşıldı. Şimdi şekilim (119,1,80). Bununla birlikte, modelde hala bir şekillendirme sorunu yaşıyorum.aşağıdaki gibi hizalama satırı:

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

Neden oluyor ve nasıl düzeltebilirim? ,

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

Gördüğünüz gibi:

cevap

5

listenize (gerçek değerler farklılık gösterebilir) bu gibi görünmelidir, bu durumda

model.summary() 

yaparak modeli neye benzediğini kontrol edebilirsiniz Giriş bir 2D tensör değil, bir 3D tensördür. Yani dizilerinizin beklediği şekilde dizilerinizi yeniden şekillendirmeniz gerekiyor. Özellikle, X_train girişi boyutlara sahip olmalıdır (num_samples, 1, input_dim). Bazı rasgele oluşturulmuş X/Y verileri ile çalışan bir örnek aşağıda verilmiştir: bu @ Y300 için

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) 
+0

sayesinde, görünüşe göre şekil (119,1,80) ile bir 3d tensörünün oluşturmak mümkün olmuştur. Ancak yine de, soruya yaptığım düzenlemede yukarıda açıklanan şekil hatası alıyorum. Bu şekil hatasının nerede olduğu hakkında bir fikrin var mı? – abutremutante

+0

Sorununuzu çözdünüz mü? Model özeti 'Başlangıç ​​giriş şeklinden: (Yok, Yok, 119)', 119 uzunluğundaki bir özellik vektörünü beklediği gibi görünüyor, ama sizinki 80'dir. – y300