【问题标题】:is keras LSTM supposed to work without an input_shape parameter?keras LSTM 是否应该在没有 input_shape 参数的情况下工作?
【发布时间】:2021-10-14 14:02:52
【问题描述】:

我正在使用 LSTM 进行假新闻检测,并在我的模型中添加了嵌入层。

没有在 LSTM 函数中添加任何 input_shape 就可以正常工作,但我认为input_shape 参数是强制性的。有人可以帮我解释为什么即使没有定义input_shape 也没有错误?是不是因为嵌入层隐式定义了input_shape

以下是代码:

model=Sequential()
embedding_layer = Embedding(total_words, embedding_dim, weights=[embedding_matrix], input_length=max_length)
model.add(embedding_layer)
model.add(LSTM(64,))
model.add(Dense(1,activation='sigmoid'))
opt = SGD(learning_rate=0.01,decay=1e-6)
model.compile(loss = "binary_crossentropy", optimizer = opt,metrics=['accuracy'])
model.fit(data,train['label'], epochs=30, verbose=1)

【问题讨论】:

    标签: python tensorflow keras deep-learning lstm


    【解决方案1】:

    您只需向Embedding 层提供input_length。此外,如果您使用sequential 模型,则不需要提供输入层。避免输入层本质上意味着您的模型权重仅在您传递真实数据时创建,就像您在model.fit(*) 中所做的那样。如果您想在提供真实数据之前查看模型的权重,则必须在 Embedding 层之前定义一个输入层,如下所示:

    embedding_input = tf.keras.layers.Input(shape=(max_length,))
    

    是的,正如您所提到的,当您提供真实数据时,您的模型会隐式推断 input_shape。您的LSTM 层不需要input_shape,因为它也是根据您的Embedding 层的输出派生的。如果LSTM 层是模型的第一层,那么为了清楚起见,最好指定input_shape。例如:

    model = tf.keras.Sequential()
    model.add(tf.keras.layers.LSTM(32, input_shape=(10, 5)))
    model.add(tf.keras.layers.Dense(1))
    

    其中 10 表示时间步数,5 表示特征数。在您的示例中,您对LSTM 层的输入具有shape(max_length, embedding_dim)。同样在这里,如果您不指定input_shape,您的模型将根据您的输入数据推断形状。 欲了解更多信息,请查看 Keras documentation

    【讨论】:

    • 我在这里有点困惑首先你提到如果避免输入层,那么只有当你传递真实数据时才会创建权重。您说模型在提供真实数据时隐式推断 input_shape,但您还说如果 LSTM 层是我模型中的第一层,那么我需要指定 input_shape。你能澄清一下吗..
    • 抱歉给您带来了困惑,更新了我的答案。
    • 现在清楚了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    相关资源
    最近更新 更多