响亮的双向 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)
其中,
- x_train是一个数组(所有图像)的数组(12个特征向量串联)
例子:
当所有训练图片都是400张图片时
x_train是长度为64512(12*5376)的数组的长度为400的数组
- y_train 是整数数组,其中每个整数代表每个图像的四个 类 之一
- 同样x_val和y_val
我不确定双向 lstm 参数是否正确,我得到了错误
input_shape = (None,) + tuple(inputs.shape[1:])
AttributeError: 'list' object has no attribute 'shape'
您的代码存在一些问题。我已经在下面提到了这些内容以及您要实现的内容的代码示例。
您必须将 inputs
作为 NumPy 数组才能使用 reshape
。模型的输入形状必须是(patches, features)
您 link 在序列输入上堆叠 2 个双向 LSTM(或更多)的图像,然后添加一个具有 4 个神经元的密集层作为输出。详情见代码。
- 您正在尝试解决多class 单标签问题。您需要使用
softmax
作为输出层激活,并使用 categorical_crossentropy
作为损失。请参阅此 table 以获取更多详细信息 -
- 最后,正如您提到的,您的输出是一个一维数组,每个元素作为 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
我想实现下图: 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)
其中,
- x_train是一个数组(所有图像)的数组(12个特征向量串联) 例子: 当所有训练图片都是400张图片时 x_train是长度为64512(12*5376)的数组的长度为400的数组
- y_train 是整数数组,其中每个整数代表每个图像的四个 类 之一
- 同样x_val和y_val
我不确定双向 lstm 参数是否正确,我得到了错误
input_shape = (None,) + tuple(inputs.shape[1:])
AttributeError: 'list' object has no attribute 'shape'
您的代码存在一些问题。我已经在下面提到了这些内容以及您要实现的内容的代码示例。
您必须将
inputs
作为 NumPy 数组才能使用reshape
。模型的输入形状必须是(patches, features)您 link 在序列输入上堆叠 2 个双向 LSTM(或更多)的图像,然后添加一个具有 4 个神经元的密集层作为输出。详情见代码。
- 您正在尝试解决多class 单标签问题。您需要使用
softmax
作为输出层激活,并使用categorical_crossentropy
作为损失。请参阅此 table 以获取更多详细信息 -
- 最后,正如您提到的,您的输出是一个一维数组,每个元素作为 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