Keras LSTM 输入 ValueError:形状不兼容

时间:2021-07-10 00:31:32

标签: tensorflow machine-learning neural-network lstm recurrent-neural-network

不确定为什么我的 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_padd 的一部分:

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 个不同的时间序列(井)。

1 个答案:

答案 0 :(得分:1)

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

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)

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