2016-03-26 34 views
9

我是新来Keras和遇到一些麻烦的形状,特别是当它涉及到RNNs和LSTMs。的Python/Keras - 维数错误:预计3,拿到了2形状(119,80)

我运行这样的代码:

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) 

可变predictor_train是numpy的阵列119点内的阵列,每一个具有80个不同的项目。

我有此错误:

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

到目前为止,我发现了什么是一个RNN接收与(batch_size时,时间步长,尺寸)的3D形状和张当你设置input_shape的batch_size的通常会被省略,并且您应该只提供一个(时间步长,维数)的元组。但是应该更改哪部分代码(如果可能,请添加代码更改建议)?

启示需要!我一直停留在那一阵子...


EXTRA信息


About pred_frame

类型:类 'pandas.core.frame.DataFrame'

形状:(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

类型:类 'pandas.core.series.Series'

形状:(119,)

D型细胞: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

类型: 'numpy.ndarray'

形状:(119,80)

D型细胞: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

由于@ Y300显然3D问题被超越。 我现在的形状是(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 

但是,我仍然在模型中遇到了整形问题。如下图所示:

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

为什么会发生这种情况,我该如何解决?

回答

5

您可以检查你的模型是什么样子做

model.summary() 

在这种情况下,你应该是这个样子(实际值可能会有所不同):

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

正如你所看到的,输入是3D张量,而不是2D张量。所以你需要重塑你的阵列以适应keras期望的。特别是,输入X_train应该有尺寸(num_samples,1,input_dim)。下面是一个随机生成的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) 
+0

感谢@ y300,显然我能够创建一个形状为(119,1,80)的三维张量。但是,在编辑问题时,我仍然遇到上述的形状错误。你有什么想法在这个形状错误发生在哪里? – abutremutante

+0

你有没有解决你的问题?从模型摘要“初始输入形状:(无,无,119)”看来,它似乎预计长度为119的特征向量,但是您的长度为80。 – y300

相关问题