如何在多维阵列上训练LSTM模型



我最近写了一个LSTM模型来预测序列:

    ############### BUILD MODEL ###############
''' HERE WE ARE CREATING THE LSTM MODEL '''
model = Sequential()
model.add(LSTM(128, input_shape=(X.shape[1:]), activation='relu', return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128,input_shape=(X.shape[1:]), activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))
# In[8]:

'''HERE WE ARE CREATING AN OPTIMIZER AND THEN TRAINING OUR MODEL'''
opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)
model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer=opt,
    metrics=['accuracy'],
)
model.fit(X, Y, batch_size=10, epochs=1)

其中np.shape(X) = (237, 30, 3)np.shape(Y) = (237, 3)。但是,将这些数据拟合到模型时,它正在返回错误:

ValueError: Error when checking target: expected dense_1 to have shape (1,) but got array with shape (3,)

此代码中有什么问题?

如果您的数据形状像这样的东西:np.shape(x)=(237,30,3)和np.Shape(y)=(237,3)尝试此网络。

model = Sequential()
model.add(LSTM(32, input_shape=(X.shape[1:]), activation='relu', return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(32, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(3, activation='softmax'))
opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)
model.compile(
    loss='categorical_crossentropy',
    optimizer=opt,
    metrics=['accuracy'],
)
model.fit(X, Y, batch_size=10, epochs=1)

由于您使用的是keras sequential api,因此您不必指定第二个LSTM层的输入,并且在最终密集层的" Y"形状为(237,3),因此最终的致密层也应给出3也。

您也可以给您输入_SHAPE =(无,3),如果您的输入中的" 3"(特征数)对于每个样本都是恒定的,则第一个LSTM层。

看来您已经单热编码了标签。要么不单速编码它们(即让它们为稀疏标签),然后使用sparse_categorical_crossentropy作为损失函数,或者,或者,一hot对其进行编码,并将categorical_crossentropy用作损失函数。

作为旁注:您确定这是一项分类任务吗?既然您使用的是SoftMax层作为最后一层,但您提到标签有3个类?!

最新更新