Skip to main content
 首页 » 编程设计

python之LSTM 神经网络输入/输出维度错误

2025年05月04日14Renyi-Fan

我对 TensorFlow 和 LSTM 架构还很陌生。我在计算数据集的输入和输出(x_train、x_test、y_train、y_test)时遇到问题。

我输入的原始形状:

  • x_train: (366,4)
  • x_test: (104,4)
  • y_train: (366,)
  • y_test: (104,)

y_train 和 y_test 是一系列股票价格。 x_train 和 x_test 是我想用来预测股票价格的四个特征。

# Splitting the training and testing data 
 
train_start_date = '2010-01-08' 
train_end_date = '2017-01-06' 
test_start_date = '2017-01-13' 
test_end_date = '2019-01-04' 
 
train = df.ix[train_start_date : train_end_date] 
test = df.ix[test_start_date:test_end_date] 
 
 
X_test = sentimentScorer(test) 
X_train = sentimentScorer(train) 
 
Y_test = test['prices']  
Y_train = train['prices'] 
 
#Conversion in 3D array for LSTM INPUT 
 
X_test = X_test.reshape(1, 104, 4) 
X_train = X_train.reshape(1, 366, 4) 
 
 
 
 
 
model = Sequential() 
 
model.add(LSTM(128, input_shape=(366,4), activation='relu',  
return_sequences=True)) 
model.add(Dropout(0.2)) 
 
model.add(LSTM(128, activation='relu')) 
model.add(Dropout(0.1)) 
 
model.add(Dense(32, activation='relu')) 
model.add(Dropout(0.2)) 
 
model.add(Dense(10, activation='softmax')) 
 
opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6) 
 
# Compile model 
model.compile( 
    loss='sparse_categorical_crossentropy', 
    optimizer=opt, 
    metrics=['accuracy'], 
) 
 
model.fit(X_train, 
          Y_train, 
          epochs=3, 
          validation_data=(X_test, Y_test)) 

这是产生的错误:

> --------------------------------------------------------------------------- ValueError                                Traceback (most recent call 
> last) <ipython-input-101-fd4099583529> in <module> 
>      65           Y_train, 
>      66           epochs=3, 
> ---> 67           validation_data=(X_test, Y_test)) 
>  
> c:\users\talal\appdata\local\programs\python\python36\lib\site-packages\tensorflow\python\keras\engine\training.py 
> in fit(self, x, y, batch_size, epochs, verbose, callbacks, 
> validation_split, validation_data, shuffle, class_weight, 
> sample_weight, initial_epoch, steps_per_epoch, validation_steps, 
> **kwargs)    1507         steps_name='steps_per_epoch',    1508         steps=steps_per_epoch, 
> -> 1509         validation_split=validation_split)    1510     1511     # Prepare validation data. 
>  
> c:\users\talal\appdata\local\programs\python\python36\lib\site-packages\tensorflow\python\keras\engine\training.py 
> in _standardize_user_data(self, x, y, sample_weight, class_weight, 
> batch_size, check_steps, steps_name, steps, validation_split) 
>     991       x, y = next_element 
>     992     x, y, sample_weights = self._standardize_weights(x, y, sample_weight, 
> --> 993                                                      class_weight, batch_size) 
>     994     return x, y, sample_weights 
>     995  
>  
> c:\users\talal\appdata\local\programs\python\python36\lib\site-packages\tensorflow\python\keras\engine\training.py 
> in _standardize_weights(self, x, y, sample_weight, class_weight, 
> batch_size)    1110         feed_input_shapes,    1111         
> check_batch_axis=False,  # Don't enforce the batch size. 
> -> 1112         exception_prefix='input')    1113     1114     if y is not None: 
>  
> c:\users\talal\appdata\local\programs\python\python36\lib\site-packages\tensorflow\python\keras\engine\training_utils.py 
> in standardize_input_data(data, names, shapes, check_batch_axis, 
> exception_prefix) 
>     314                            ': expected ' + names[i] + ' to have ' + 
>     315                            str(len(shape)) + ' dimensions, but got array ' 
> --> 316                            'with shape ' + str(data_shape)) 
>     317         if not check_batch_axis: 
>     318           data_shape = data_shape[1:] 
>  
> ValueError: Error when checking input: expected lstm_18_input to have 
> 3 dimensions, but got array with shape (366, 4) 

请您参考如下方法:

您的代码几乎没问题。

您的 y_test 和 y_train 应该是一个只有一个元素的数组或形状为 (1,1) 的数组,这并不重要。

虽然你的输入形状是错误的,第一个 LSTM 应该是:

model.add(LSTM(128, input_shape=(None,4), activation='relu', return_sequences=True)) 

注意 None,因为您的测试和训练序列长度不同,您不能指定它(并且 Keras 接受未指定的第一维)。错误是由于长度分别为 366 和 104。如果您想对 RNN 使用批处理,您应该使用 keras.preprocessing.sequence.pad_sequences 执行零填充。

无需为批处理指定 input_shape,网络的其余部分应该没问题。

如果您正在执行回归,而不是分类,可能是这种情况,您应该执行@Ankish Bansal 编写的最后两个步骤,例如将损失更改为 均方误差 并使最后一层输出 1 个值而不是 10。