LSTM 用于 Keras 中的二进制分类?

LSTM's for Binary classification in Keras?

假设我有以下具有 2 个特征和 Y 标签的数据集 X。

X = [[0.3, 0.1], [0.2, 0.9], [0.4, 0.0]]

Y = [0, 1, 0]

    # split into input (X) and output (Y) variables
X = dataset[:, 0:2] #X features are from the first column and the 50th column
Y = dataset[:, 2] 



model = Sequential()
model.add(Embedding(2, embedding_vecor_length, input_length=max_review_length))
model.add(LSTM(2))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y)

它有效,但我想了解更多关于 parameter_1、parameter_2、parameter_3 的信息

Embedding(parameter_1, parameter_2, input_length=parameter_2)

P.S,我只是随便放一些东西,不知道我在做什么。

根据我上面描述的数据集,填充 Embedding() 的正确参数是什么?

好的,根据评论中的更精确的问题,这里进行解释。

嵌入层通常用于嵌入单词,因此我将对单词使用 "red line example",但您可以将它们视为分类特征。 嵌入层确实有助于将单词(分类特征)表示为连续向量中的向量 space.

当您有文本时,您会将您的单词标记化并为其分配一个数字。然后它们成为标有索引的分类特征。例如,句子“I embed stuff”将成为分类对象列表 [2, 1, 3],其中字典将索引映射到每个单词:{1: "embed", 2: "I", 3: "stuff", 4: "some_other_words", 0:"<pad>"}

当你使用神经网络或连续数学框架时,那些离散的对象(=类别)是无序的,当你谈论你的话时 2 > 1 没有任何意义,那些不是 "numerical values" ,它们是类别。所以你想让它们变成数字,把它们嵌入到一个向量中space。

这正是 Embedding() 层所做的,它将每个索引映射到一个单词。为此,需要定义三个主要参数:

  1. 您总共要使用多少个索引。这是您词汇表中的单词数量,或者您要编码的分类特征所具有的类别数量。这就是 input_dim 功能。在我们的小例子中,词汇表中有 5 个单词(索引从 0 到 4),因此我们将有 input_dim = 5。它之所以被称为 "dimension" 是因为在引擎盖下,keras 正在将索引号转换为维数 = 不同元素数的单热向量。例如,索引为 3 的单词 "stuff" 在嵌入之前将转换为 5 维向量:[0 0 0 1 0]。这就是为什么你的输入应该是整数,它们是代表 1 在单热向量中的位置的索引。
  2. 你想要多大的输出向量。这是特征所在的向量 space 的大小。参数为output_dim。如果你的词汇表中没有很多单词(针对你的特征的不同类别),这个数字应该很低,在我们的例子中我们将它设置为 output_dim = 2。我们的 5 个词将生活在二维 space.
  3. 由于嵌入层通常是神经网络中的第一层,因此您需要指定样本中的单词数量。这将是 input_length。我们的样本是一个 3 个词的短语,所以 input_length=3.

你通常将嵌入层作为第一层的原因是因为它需要整数输入,神经网络中的层 return 实数值,所以它不起作用。

总而言之,层中出现的是一系列索引:在我们的示例中为 [2, 1, 3]。而出来的就是每个索引对应的嵌入向量。这可能类似于 [[0.2, 0.4], [-1.2, 0.3], [-0.5, -0.8]]

回到你的例子,输入应该是样本列表,样本是索引列表。嵌入已经是真实值的特征是没有用的,这些值已经具有数学意义,模型可以理解它,而不是分类值。

现在清楚了吗? :)