LSTM 神经网络输入/输出尺寸错误

Posted

技术标签:

【中文标题】LSTM 神经网络输入/输出尺寸错误【英文标题】:LSTM Nerual Network Input/Output dimensions error 【发布时间】:2019-06-05 22:31:34 【问题描述】:

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

我最初输入的形状:

X_train: (366,4) X_test: (104,4) Y_train: (366,) Y_test: (104,)

Ytrain 和 Ytest 是一系列股票价格。 Xtrain 和 Xtest 是我想学习预测股票价格的四个特征。

# 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(最近一次调用 最后)在 65 Y_火车, 66 个 epoch=3, ---> 67 验证数据=(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 # 准备验证数据。

c:\users\talal\appdata\local\programs\python\python36\lib\site-packages\tensorflow\python\keras\engine\training.py 在 _standardize_user_data(self, x, y, sample_weight, class_weight, batch_size、check_steps、steps_name、steps、validation_split) 第991章 第992章 --> 993 类重量,批次大小) 第994章 第995章

c:\users\talal\appdata\local\programs\python\python36\lib\site-packages\tensorflow\python\keras\engine\training.py 在 _standardize_weights(self, x, y, sample_weight, class_weight, 批量大小)1110 feed_input_shapes,1111 check_batch_axis=False, # 不强制批量大小。 -> 1112 exception_prefix='input') 1113 1114 如果 y 不是 None:

c:\users\talal\appdata\local\programs\python\python36\lib\site-packages\tensorflow\python\keras\engine\training_utils.py 在standardize_input_data(数据,名称,形状,check_batch_axis, 异常前缀) 314 ': 预期 ' + names[i] + ' 有 ' + 315 str(len(shape)) + ' 尺寸,但得到数组 ' --> 316 '带形状' + str(data_shape)) 317 如果不是 check_batch_axis: 第318章

ValueError:检查输入时出错:预期 lstm_18_input 有 3 维,但得到了形状为 (366, 4) 的数组

【问题讨论】:

is 366 是一个样本中的时间戳数? 【参考方案1】:

您的代码几乎没问题。

您的y_testy_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 编写的最后两个步骤,例如将 loss 更改为 mean squared error 并使最后一层输出 1 值而不是 10。

【讨论】:

您好,感谢您的回复。我必须解释一下,我有 366 个观察值和 4 个特征。 (366,4)。这是在我将其重塑为 (1, 366, 4) 之前。无论如何,a 将 input_shape 更改为 (1, 366, 4),这导致了错误:>ValueError: Shapes must be equal rank, but are 3 and 2 检查我的更新,这应该可以解决你所有的问题 是的,但我仍然对如何将 y_test 和 y_train 减少到 (1,1) 数组感到困惑。这没有意义,这些是与每个观察对应的股票价格(x_train 中的 366 和 x_test 中的 104)。这是产生的错误:ValueError:输入数组应具有与目标数组相同数量的样本。找到 1 个输入样本和 366 个目标样本。 你需要不同的架构来完成这个任务,并阅读 LSTM/RNN 以及它们的功能。顺便提一句。为您的问题标记正确答案以避免混淆。【参考方案2】:

X_train 的维度错误。LSTM 只接受 3 维输入。你是说你有 4 个特征。假设 366 是您的一个样本的时间戳数,您的输入应该是 (num_samples,366,4) 形状 干杯:-)

【讨论】:

我只有一个样本,一组 (366, 4)。 4 个特征和 366 个观察值。所以你建议我的 input_shape 应该是 = (1 , 366 ,4)?但这导致了错误:ValueError: Shapes must be equal rank, but are 3 and 2 是的,应该是 :-)。以前错误出现在第一个 LSTM 层中,现在已经修复。现在错误出现在最后一个密集层。该密集层的输出是 3D,但您提供的是 1D。使用 Keras 展平层来减小维度 使用model.summary()查看每一层的输出形状然后你就会明白了。最后一层的 Dense 层输出形状也应该是 1 用于用户案例使用 model.add(Dense(1, activation='relu')) 用于最后一层 错误似乎出现在LSTM第一层:“model.add(LSTM(128, input_shape=(1, 366,4), activation='relu', return_sequences=True)) ” @TalalZahid 检查我更新的答案,抱歉昨天指向错误的方向,我的错。【参考方案3】:

    LSTM 期望 dims 的输入为 (num_examples, seq_length, input_dims),因此输入有一个错误。

    您正在预测维度 1 的输出,您的模型输出是 10。试试这个。

    model.add(Dense(1, activation='linear'))

    此外,您正在预测价格,即回归问题。但是,您正在使用分类设置。试试这个

    model.compile(loss='mse', optimizer='adam', metrics=['mean_squared_error'])

【讨论】:

感谢您的回复。至于您提到的第一个更改,我只有一个样本,即 (366, 4) 的数组。 4 个特征和 366 个观察值。所以你建议我的 input_shape 应该是 = (1 , 366 ,4)?但这导致了错误:ValueError: Shapes must be equal rank, but are 3 and 2

以上是关于LSTM 神经网络输入/输出尺寸错误的主要内容,如果未能解决你的问题,请参考以下文章

LSTM调参经验

LSTM神经网络输入输出究竟是怎样的?

深度学习LSTM神经网络输入输出究竟是怎样的?

用于太空入侵者 RL (Keras) 的 LSTM 网络

RNN和LSTM

LSTM原理——输入门遗忘门输出门