响亮的双向 LSTM

Keras Bidirectional LSTMs

我想实现下图: diagram 数据集由图像组成,我将每个图像分成 12 个补丁,并对每个补丁应用特征提取,从而产生每个补丁长度为 5376 的特征向量。 我想在每个图像的 12 个特征向量上训练双向 lstm,以将每个图像分类为 4 个类别中的 1 个。 这是我的代码:

model = Sequential()
model.add(Bidirectional(LSTM(12, input_shape=(12, 5376), return_sequences=True, dropout=0.25, recurrent_dropout=0.1)))
model.add(Dense(4, activation="relu"))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(
    x_train,
    y_train,
    steps_per_epoch=10,
    epochs=2,
    validation_data=(x_val, y_val),
    validation_steps=10,
    verbose=1)

其中,

我不确定双向 lstm 参数是否正确,我得到了错误

input_shape = (None,) + tuple(inputs.shape[1:])

AttributeError: 'list' object has no attribute 'shape'

您的代码存在一些问题。我已经在下面提到了这些内容以及您要实现的内容的代码示例。

  1. 您必须将 inputs 作为 NumPy 数组才能使用 reshape。模型的输入形状必须是(patches, features)

  2. 您 link 在序列输入上堆叠 2 个双向 LSTM(或更多)的图像,然后添加一个具有 4 个神经元的密集层作为输出。详情见代码。

  1. 您正在尝试解决多class 单标签问题。您需要使用 softmax 作为输出层激活,并使用 categorical_crossentropy 作为损失。请参阅此 table 以获取更多详细信息 -

  1. 最后,正如您提到的,您的输出是一个一维数组,每个元素作为 class 标签从 0 到 3(4 classes)。由于您的模型预测 4 个对数(每个 class 1 个),您必须使用 sparse_categorical_crossentropy 而不是 categorical_crossentropy
import numpy as np
from tensorflow.keras import layers, Model, utils

X = np.random.random((100, 12, 530))  #100 images, 12 patches, 530 features instead of 5376
y = np.random.randint(0, 4, (100,))

inp = layers.Input((12, 530)) #input shape of (batch, 12, 530)
x = layers.Bidirectional(layers.LSTM(64, return_sequences=True))(inp)
x = layers.Bidirectional(layers.LSTM(64))(x)
out = layers.Dense(4, activation='softmax')(x)

model = Model(inp, out)
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, y, epochs=3)

utils.plot_model(model, show_layer_names=False, show_shapes=True)
Epoch 1/3
4/4 [==============================] - 0s 25ms/step - loss: 1.5111 - accuracy: 0.2400
Epoch 2/3
4/4 [==============================] - 0s 17ms/step - loss: 1.4031 - accuracy: 0.2600
Epoch 3/3
4/4 [==============================] - 0s 25ms/step - loss: 1.3954 - accuracy: 0.2600