Keras LSTM输入值错误:形状不兼容



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

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_crossentry用作损失函数。

编辑:

让我试着更好地解释我的数据集:

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

在这种情况下,使用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样本。删除功能和深度(以及其他功能(后,我总共获得了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)

这将把一切都放在正确的位置。你只需要看看你得出错误的尺寸并更改该部分。

最新更新