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

Tal*_*hid 4 python machine-learning neural-network lstm tensorflow

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

我输入的原始形状:

  • x_train:(366,4)
  • x_测试:(104,4)
  • y_火车:(366,)
  • y_测试:(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))
Run Code Online (Sandbox Code Playgroud)

这是生成的错误:

> --------------------------------------------------------------------------- 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)
Run Code Online (Sandbox Code Playgroud)

Szy*_*zke 5

你的代码几乎没问题。

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

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

model.add(LSTM(128, input_shape=(None,4), activation='relu', return_sequences=True))
Run Code Online (Sandbox Code Playgroud)

请注意None,由于您的测试序列和训练序列长度不同,因此您无法指定它(Keras 接受未指定的第一个维度)。错误是由于长度分别为 366 和 104 造成的。如果您想将批次与 RNN 一起使用,您应该使用 执行零填充keras.preprocessing.sequence.pad_sequences

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

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