【问题标题】:I want to know how can we give a categorical variable as an input to an embedding layer in keras and train that embedding layer?我想知道我们如何将分类变量作为 keras 中嵌入层的输入并训练该嵌入层?
【发布时间】:2019-07-28 19:55:20
【问题描述】:

假设我们有一个数据框,其中有一个类别列,其中包含 7 个类别 - 周一、周二、周三、周四、周五、周六和周日。假设我们有 100 个数据点,我们希望将分类数据作为嵌入层的输入,并使用 Keras 训练嵌入层。我们如何真正实现它?您可以通过代码示例分享一些直觉吗?

我已经尝试过这段代码,但它给了我一个错误,上面写着“ValueError:“input_length”为 1,但接收到的输入具有形状(无,26)”。我参考了这个博客https://medium.com/@satnalikamayank12/on-learning-embeddings-for-categorical-data-using-keras-165ff2773fc9,但我不知道如何在我的特殊情况下使用它。

from sklearn.preprocessing import LabelEncoder
l_encoder=LabelEncoder()
l_encoder.fit(X_train["Weekdays"])

encoded_weekdays_train=l_encoder.transform(X_train["Weekdays"])
encoded_weekdays_test=l_encoder.transform(X_test["Weekdays"])

no_of_unique_cat=len(X_train.school_state.unique())
embedding_size = min(np.ceil((no_of_unique_cat)/2),50)
embedding_size = int(embedding_size)
vocab  = no_of_unique_cat+1

#Get the flattened LSTM output for categorical text
input_layer2 = Input(shape=(embedding_size,))
embedding = Embedding(input_dim=vocab, output_dim=embedding_size, input_length=1, trainable=True)(input_layer2)
flatten_school_state = Flatten()(embedding)

我想知道如果是 7 个类别,input_layer2 的形状是什么?词汇大小、输出尺寸和输入长度应该是多少?谁能解释或更正我的代码?您的见解将非常有帮助。

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-46-e28d41acae85> in <module>
      1 #Get the flattened LSTM output for input text
      2 input_layer2 = Input(shape=(embedding_size,))
----> 3 embedding = Embedding(input_dim=vocab, output_dim=embedding_size, input_length=1, trainable=True)(input_layer2)
      4 flatten_school_state = Flatten()(embedding)

~/anaconda3/lib/python3.7/site-packages/keras/engine/base_layer.py in __call__(self, inputs, **kwargs)
    472             if all([s is not None
    473                     for s in to_list(input_shape)]):
--> 474                 output_shape = self.compute_output_shape(input_shape)
    475             else:
    476                 if isinstance(input_shape, list):

~/anaconda3/lib/python3.7/site-packages/keras/layers/embeddings.py in compute_output_shape(self, input_shape)
    131                         raise ValueError(
    132                             '"input_length" is %s, but received input has shape %s' %
--> 133                             (str(self.input_length), str(input_shape)))
    134                     elif s1 is None:
    135                         in_lens[i] = s2

ValueError: "input_length" is 1, but received input has shape (None, 26)


【问题讨论】:

    标签: keras nlp lstm categorical-data word-embedding


    【解决方案1】:

    embedding_size 永远不能是输入大小。

    Keras 嵌入将“整数”作为输入。你的数据应该是从 0 到 6 的数字。

    如果您的 100 个数据点形成一个天序列,则您不能将嵌入中序列的长度限制为 1。

    您的输入形状应为(length_of_sequence,)。这意味着您的训练数据应该具有(any, length_of_sequence) 的形状。根据您的描述,这可能是(1, 100)

    其余的都是自动的。

    【讨论】:

    • 感谢您的回答。不过我还有一个问题。如果我使用 OneHotEncoding 方案而不是 LabelEncoder 会怎样?那会有什么不同呢?在标签编码器的情况下,形状将是 (1,100)。在单热编码器的情况下,形状将是 (7,100)。
    猜你喜欢
    • 2018-07-07
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2021-01-18
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多