我最近写了一个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个类?!