【问题标题】:How to train an LSTM model on multi-dimentional array?如何在多维数组上训练 LSTM 模型?
【发布时间】:2018-12-19 11:36:02
【问题描述】:

我最近写了一个 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,)

这段代码有什么问题?

【问题讨论】:

  • 您可以通过model.summary()打印出模型每一层的输入和输出形状。然后就可以查看dense_1是哪一层了,有什么问题。

标签: python tensorflow keras lstm rnn


【解决方案1】:

如果您的数据形状是这样的: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 层指定输入,并且在最后的 Dense 层中,您的“Y”形状是 (237, 3),因此最后的 Dense 层也应该给出3 也一样。

如果输入中的“3”(特征数)对于每个样本都是恒定的,您还可以为您的第一个 LSTM 层提供 input_shape=(None, 3)。

【讨论】:

    【解决方案2】:

    您似乎对标签进行了一次性编码。要么不要对它们进行 one-hot 编码(即让它们成为稀疏标签)并使用 sparse_categorical_crossentropy 作为损失函数,要么对它们进行 one-hot 编码并使用 categorical_crossentropy 作为损失函数。

    附带说明:您确定这是一项分类任务吗?由于您使用 softmax 层作为具有 10 个单位的最后一层,但您提到标签有 3 个类?!

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 2023-03-03
      • 2017-11-15
      • 2018-01-30
      相关资源
      最近更新 更多