Keras LSTM input ValueError: Shapes are incompatible

Keras LSTM input ValueError: Shapes are incompatible

不确定为什么我的 LSTM 神经网络会出错。好像跟输入形状有关

这是我的神经网络架构:

from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout

model = Sequential()

# Recurrent layer
model.add(LSTM(64, return_sequences=False, 
           dropout=0.1, recurrent_dropout=0.1))

# Fully connected layer
model.add(Dense(64, activation='relu'))

# Dropout for regularization
model.add(Dropout(0.5))

# Output layer
model.add(Dense(y_train.nunique(), activation='softmax'))

# Compile the model
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

我是这样训练它的:

history = model.fit(X_train_padded, y_train_padded, 
                    batch_size=2048, epochs=150,
                    validation_data=(X_test_padded, y_test_padded))

这是我输入数据的形状:

print(X_train_padded.shape, X_test_padded.shape, y_train_padded.shape, y_test_padded.shape)
(98, 20196, 30) (98, 4935, 30) (98, 20196, 1) (98, 4935, 1)

这是我的一部分 X_train_padded:

X_train_padded
array([[[ 2.60352379e-01, -1.66420518e-01, -3.12893162e-01, ...,
         -1.51210476e-01, -3.56188897e-01, -1.02761131e-01],
        [ 1.26103191e+00, -1.66989382e-01, -3.13025807e-01, ...,
          6.61329839e+00, -3.56188897e-01, -1.02761131e-01],
        [ 1.04418243e+00, -1.66840157e-01, -3.12994596e-01, ...,
         -1.51210476e-01, -3.56188897e-01, -1.02761131e-01],
        ...,
        [ 1.27399408e+00, -1.66998426e-01, -3.13025807e-01, ...,
          6.61329839e+00, -3.56188897e-01, -1.02761131e-01],

这是我遇到的错误:

Epoch 1/150
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-52-52422b54faa4> in <module>
----> 1 history = model.fit(X_train_padded, y_train_padded, 
      2                     batch_size=2048, epochs=150,
      3                     validation_data=(X_test_padded, y_test_padded))
...
ValueError: Shapes (None, 20196) and (None, 12) are incompatible

因为我使用的是 LSTM 层,所以我有一个 3D 输入形状。我的输出层有 12 个节点 (y_train.nunique()),因为我的输入有 12 个不同的 类。鉴于我有 12 类,我在输出层中使用 softmax 作为激活函数,而 categorical_crossentropy 作为我的损失函数。

编辑:

让我试着更好地解释我的 dataset:

我正在处理地质井。我的样本是不同类型的沉积岩层,其中特征是岩石的属性(例如伽美射线发射),标签是岩石类型(例如石灰石)。我的特点之一是图层的深度。

在这种情况下使用 LSTM 的想法是将一口井的深度视为一个序列。从而前一个沉积层(岩石)有助于预测下一个沉积层(岩石)。

我是如何得到我的输入形状的:

我的数据集中共有 98 个孔。我拆分了数据集:X_train_init, X_test_init, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)。样本(层)最多的井在训练集中有 20196 个样本。没有这么多样本的孔,我用零填充它们,以便它们有 20196 个样本。样本(层)最多的井在测试集中有 4935 个样本。没有这么多样本的孔,我用零填充它们,以便它们有 4935 个样本。删除 well 特征和 depth 特征(以及其他特征)我最终得到 30 特征.我的 y_trainy_test 只有 1 列代表标签。

我想我的问题实际上是让这个数据集在 LSTM 中工作。我看到的大多数例子都没有 98 个不同的时间序列,它们只有一个。我不太确定如何处理 98 个不同的时间序列(井)。

不行。除批量大小外,其他所有输入维度都应该相同。此外,您的输入尺寸都变得疯狂。例如 -

print(X_train_padded.shape, # (98, 20196, 30)
X_test_padded.shape, # (98, 4935, 30)
y_train_padded.shape, # (98, 20196, 1)
y_test_padded.shape) # (98, 4935, 1)

据我所知,第一个维度应该代表样本总数(在 x_train、y_train 和 x_test、y_test 中),但在你的情况,总样本由第二维表示。第一维应该放在第二位。这么说尺寸应该

print(X_train_padded.shape, # (20196, 98, 30)
X_test_padded.shape, # (4935, 98, 30)
y_train_padded.shape, # (20196, 98, 1)
y_test_padded.shape) # (4935, 98, 1)

这会将所有内容放在正确的位置。你只需要看看你如何 来到错误的尺寸并更改该部分。