2016-03-26 26 views
9

Tôi mới dùng Keras và gặp rắc rối với hình dạng, đặc biệt khi nói đến RNN và LSTM.Python/Keras - Sai số kích thước: dự kiến ​​3, có 2 với hình dạng (119, 80)

Tôi đang chạy mã này:

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) 

Các predictor_train biến là một mảng NumPy với 119 mảng bên trong, mỗi người có 80 mặt hàng khác nhau.

Tôi đang gặp lỗi này:

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

Cho đến nay những gì tôi phát hiện ra là một RNN nhận tensor 3D với hình dạng của (batch_size, timesteps, kích thước) và khi bạn thiết input_shape các batch_size thường bị bỏ qua, và bạn chỉ cần cung cấp một bộ (timesteps, dimension). Nhưng trong phần nào của mã nên được thay đổi (nếu có thể, hãy thêm các đề xuất thay đổi mã của bạn)?

Cần có sự chứng kiến! Tôi đã bị mắc kẹt trên đó cho một thời gian ...


EXTRA INFO


About pred_frame

loại: lớp 'pandas.core.frame.DataFrame'

hình dạng: (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

loại: lớp 'pandas.core.series.Series'

hình dạng: (119,)

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


About predictor_train

loại: 'numpy.ndarray'

hình dạng: (119,80)

dtype: 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]] 

EDIT

Nhờ @ Y300 rõ ràng vấn đề 3d bị vượt qua. Hình dạng của tôi bây giờ là (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 

Tuy nhiên, tôi vẫn gặp sự cố định hình trong mô hình.phù hợp với dòng, như bạn có thể thấy bên dưới:

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

Tại sao điều đó xảy ra và làm cách nào để khắc phục?

Trả lời

5

Bạn có thể kiểm tra những gì mô hình của bạn trông giống như bằng cách làm

model.summary() 

Trong trường hợp này, bạn nên tìm một cái gì đó như thế này (giá trị thực tế có thể khác):

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

Như bạn có thể thấy, đầu vào là một dây dẫn 3D, không phải là một bản sao 2D. Vì vậy, bạn cần phải định hình lại mảng của bạn để phù hợp với những gì keras mong đợi. Đặc biệt, đầu vào X_train nên có kích thước (num_samples, 1, input_dim). Dưới đây là một ví dụ làm việc với một số được tạo ngẫu nhiên x/y dữ liệu:

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

Nhờ đó @ Y300, rõ ràng là tôi đã có thể tạo ra một tensor 3d với hình dạng (119,1,80). Tuy nhiên, tôi vẫn gặp lỗi hình dạng được mô tả ở trên trong bản chỉnh sửa mà tôi đã đưa ra cho câu hỏi. Bạn có bất kỳ ý tưởng nào về lỗi hình dạng này xảy ra không? – abutremutante

+0

Bạn đã khắc phục được sự cố của mình chưa? Từ tóm tắt mô hình 'Hình dạng đầu vào ban đầu: (Không, Không, 119)' có vẻ như nó dự kiến ​​một vectơ đặc trưng có độ dài 119, nhưng chiều dài của bạn là 80. – y300

Các vấn đề liên quan