Keras - 嵌入到 LSTM:预期 ndim=3,找到 ndim=4



我正在尝试输入一个包含 1 个样本、三个时间步长和 3 个特征的数组作为测试,以确保我的模型在我开始使用实际数据时能够工作。

这是我的输入数据,我很确定格式正确,因此上面的描述是正确的:

x_train = array([[[811, 435, 54], [0, 850, 435], [435, 582, 558]]])
y_train = array([[[0], [0], [276]]])

这是我的模型,它应该嵌入每个单词(数字指向什么(,然后将其输入 LSTM 层,然后 TimeDistributed 层应该使我能够预测输出中的三个单词:

vector_dim = 64
model = Sequential()
model.add(Embedding(input_dim=len(vocab), output_dim=vector_dim, mask_zero=False, input_shape=x_train.shape[1:]))  # therefore input shape is (3, 3)
model.add(LSTM(64, return_sequences=True))
# model.add(CuDNNGRU(32, return_sequences=True))
model.add(TimeDistributed(Dense(len(vocab), activation='softmax')))
model.compile(loss='sparse_categorical_crossentropy', optimizer=opt, metrics=['acc'])

但是我得到错误:Input 0 of layer lstm is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, 3, 3, 64]

我的模型配置或数据形状是否有问题?任何帮助将不胜感激。

这个问题也困扰着我很多。
我从这里学到了东西。Keras - 将 3 通道图像输入 LSTM
这是我的代码

model.add(ConvLSTM2D(
filters=20,
kernel_size=(3, 3),
batch_input_shape=(None, 1, 32, 32, 3),
input_shape=(1, 32, 32, 3),
padding="same",
return_sequences=True,
data_format="channels_last"
))

幸运的是,我找到了另一种方便的方法:将 rgb 图像转换为灰色图像。
而这确实可以快速解决这个问题!!

从这里的答案中,我能够弄清楚我需要三个输入,每个时间步长一个(每个时间步长是代表单词或句子的数字索引列表(。然后,我在每个输入上应用嵌入并连接到一个 LSTM 层!

vector_dim = 32
input_a = Input(shape=x_train1.shape[1:])
output_a = Embedding(input_dim=len(vocab), output_dim=vector_dim, mask_zero=False, input_shape=(x_train1.shape[1:]))(input_a)
input_b = Input(shape=x_train2.shape[1:])
output_b = Embedding(input_dim=len(vocab), output_dim=vector_dim, mask_zero=False, input_shape=(x_train2.shape[1:]))(input_b)
input_c = Input(shape=x_train2.shape[1:])
output_c = Embedding(input_dim=len(vocab), output_dim=vector_dim, mask_zero=False, input_shape=(x_train2.shape[1:]))(input_c)
concat = keras.layers.concatenate([output_a, output_b, output_c], axis=-1)
# concat2 = keras.layers.concatenate([concat, output_c])
lstm_unified = GRU(32, activation='tanh', return_sequences=True)(concat)
# lstm_unified2 = GRU(24, activation='tanh', return_sequences=True)(lstm_unified)
final_output = TimeDistributed(Dense(len(vocab), activation='softmax'))(lstm_unified)
model = Model(inputs=[input_a, input_b, input_c], outputs=final_output)
model.compile(loss='sparse_categorical_crossentropy', optimizer=opt, metrics=['acc'])

我的输入数据现在如下所示(对于具有 24 个特征和 3 个时间步长的 1 个样本,每个数组都是一个时间步长(:

x_train1 = array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3428, 8443, 12703, 8443, 4382, 8443, 3589, 8443, 11952, 8443, 6621, 8443, 13192]])
x_train2 = array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3428, 8443, 5709, 8443, 6621, 8443, 10901, 10000]])
x_train3 = array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10396, 10000]])

相关内容

最新更新